缓存管理,如何自动删除元素?

时间:2013-01-14 18:29:19

标签: java android caching

我正在用java实现缓存,但我有最后一个需要解决的问题:如何处理元素的删除?

元素存储在磁盘上,每个元素都有一个有效期(然后是到期日期),还有一个大小,我的缓存显然有一个最大大小和可以存储的最大元素数。

我想象了三种执行元素删除的方法:

  1. 将新元素插入缓存计划线程(每个元素一个)配置为在到期时间开始(为了删除元素本身)
  2. 每隔X分钟执行一个帖子,以检查哪些元素可能被删除(并删除它们)
  3. 达到限制(大小或数量)时删除最旧的元素(或随机删除元素(更快))
  4. 关于第三点,使用此策略缓存将继续存储过期元素。显然,当需要其中一个时,执行控制以检查元素是否仍然有效。

    你怎么看?管理缓存时的常见行为是什么?还有其他解决方案吗?

    P.S。我正在为Android开发这个缓存,但我认为这不是那么重要。

1 个答案:

答案 0 :(得分:0)

基本上,您必须知道缓存元素的使用频率以及使用顺序。缓存必须与操作系统相同才能将最佳数据保存在内存中。

Hava看看这些策略并选择你需要的策略:http://en.wikipedia.org/wiki/Page_replacement_algorithm

一个好的提示是LRU(最近最少使用)。但就像所有这些策略一样,它有一些缺点。这可能不适合您的使用情况。

LRU的实施技巧:

使用PriorityQueue存储除地图之外的元素。使用全局计数器保持更新,每次使用其中一个元素时,该计数器都会递增,并使用全局计数器的当前值重新插入PriorityQueue中的相应元素。

如果需要从队列中删除项目,则只需从队列中删除第一个或最后一个元素(取决于compareTo(...)方法的实现)。并将其从地图中删除。