Кэш ASP.net находится в памяти, поэтому, если ваш процесс IIS или пул приложений будут перезагружаться, он очистится. Вы можете проверить следующие вещи, которые могут вызвать утилизацию процесса
- Если вы измените
web.config
, IIS завершит работу старого экземпляра и медленно перенесет трафик на новый экземпляр, при этом оперативная память будет перезагружена. Как проверить это : Вы можете обнаружить эту ситуацию, проверив AppDomain.IsFinalizingForUnload и зарегистрировав это во время обратного вызова.
- Переработка пула приложений : в IIS существует конфигурация, согласно которой, если процесс IIS простаивает в течение определенного времени, он перезапускает его. Вы можете проверить это на сервере и увеличить это время или вообще отключить утилизацию.
- У каждого процесса есть ограничение на объем памяти, который он может использовать, если вы добавляете слишком много объектов в память, это увеличивает потребление памяти IIS, а в критическое время ОС перезапускает процесс.
EDIT
В вашей программе вы добавляете элемент replyList
в кеш, а затем выполняете операцию .Take()
. Поскольку replyList
является ссылочным объектом, если вы измените его, он также будет обновлен в кеше. Так что если в вашей программе, если вы делаете replyList == null
, он обновит элемент в кеше.
Поэтому измените ваш код следующим образом и попробуйте
public static List<ReplyDTO> VideoCommentList()
{
List<ReplyDTO> replyList = new List<ReplyDTO>();
if (HttpRuntime.Cache["videoComment"] == null)
{
//Call to .Remove is not required
//HttpRuntime.Cache.Remove("videoComment");
HttpRuntime.Cache.Insert("videoComment", replyList, null,
Cache.NoAbsoluteExpiration, TimeSpan.FromDays(14));
}
else
{
//No need to check count > 8, Take will handle it for you
replyList = ((List<ReplyDTO>)HttpRuntime.Cache["videoComment"])
.OrderByDescending(x => x.DateCreated)
.Take(8).ToList();
}
return replyList;
}
public static List<ReplyDTO> AddVideoComment(ReplyDTO replyDTO)
{
//Read from cache
List<ReplyDTO> replyList = ((List<ReplyDTO>)HttpRuntime.Cache["videoComment"]);
if(replyList == null)
replyList = VideoCommentList();
replyList.Add(replyDTO);
HttpRuntime.Cache.Insert("videoComment", replyList, null, Cache.NoAbsoluteExpiration, TimeSpan.FromDays(14));
//Here you are creating a new list, and not referencing the one in the cache
return replyList.OrderByDescending(x => x.DateCreated).Take(8).ToList();
}
ВАЖНОЕ ПРЕДЛОЖЕНИЕ
Если вы хотите проверить, когда и почему ваш объект удаляется из кэша, вы можете воспользоваться опцией CacheItemRemovedCallback при вставке. Используя этот аргумент и CacheItemRemovedReason , вы можете записать причину удаления объекта из кэша. Причины
- Удалено - Ваш код удалил элемент из кэша, вызвав метод
Insert
или Remove
.
- Истек срок действия - Элемент удален из кэша, поскольку срок его действия истек.
- Недостаточно используется - Когда системе не хватает памяти, она освобождает память, удаляя элемент из кэша.
- DependencyChanged - Элемент удален из кэша, так как изменилась зависимость кэша, связанная с ним. (В вашем случае это недействительно)
Надеюсь, эта информация поможет вам.