-1

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

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

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

  1. 将新元素插入缓存时,调度线程(每个元素一个)配置为在到期时间启动(以删除元素本身)
  2. 每 X 分钟执行一个线程,以检查哪些元素可以被删除(并删除它们)
  3. 当达到限制(大小或数量)时,最旧的元素被删除(或随机删除元素(更快))

关于第三点,使用此策略缓存将继续存储过期元素。显然,当需要其中之一时,将执行控制以检查元素是否仍然有效。

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

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

4

1 回答 1

0

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

看看这些策略并采取你需要的策略:http ://en.wikipedia.org/wiki/Page_replacement_algorithm

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

LRU 的实现技巧:

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

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

于 2013-01-14T18:47:32.807 回答