Кэширование - это просто кеширование. Вы никогда не можете полагаться на наличие записей, поэтому не нужно делать никаких предположений на этот счет: будьте готовы сразу перейти к БД (или куда-либо еще) для повторного получения данных.
Сеанс, с другой стороны, больше подходит для хранения объектов, хотя лично я стараюсь избегать хранения сессий в пользу БД. Я обычно делаю это, абстрагируя хранилище за непрозрачным ISessionStoreService интерфейсом:
interface ISessionStore
{
T GetEntry<T>(string key);
void SaveEntry<T>(string key, T entry);
}
и затем "внедрение с зависимостями" соответствующей реализации, будь то InmemorySessionStore , DbSessionStore или что-то еще.