1

我想使用一个 java 集合(列表、地图等)来缓存一些数据,这样我就可以使用这个缓存而不是直接检查数据库。我唯一担心的是集合大小,我希望这个缓存可以保存假设只有 1000 个条目,一旦达到这个计数,我想删除最旧的条目并放置一个新条目。这可能吗?

4

5 回答 5

7

你应该看看LinkedHashMap。如果您覆盖removeEldestEntry,您可以控制地图中最旧的条目何时被删除(何时put或被putAll调用)。

于 2012-08-14T12:53:15.363 回答
3

您可以使用 Google Guava 提供的缓存实用程序:http ://code.google.com/p/guava-libraries/wiki/CachesExplained

于 2012-08-14T12:51:08.907 回答
1

根据每个缓存对象的“权重”,有多种变体。选择更适合您的用例的:

  • 固定大小的缓存(可以使用 Collection 实现并跟踪其大小)。如果对象相当小并且可以提前很好地估计内存占用,则此方法效果很好。其他答案基本上说明了实现这种类型的方法。

  • 通过垃圾收集器自动驱逐的动态缓存。如果要缓存的对象很大(或大小变化很大,例如文件或图像)并且您希望使用尽可能多的堆可用于缓存,这很有效。缓存管理 java.lang.SoftReference 的集合以使对象保持活动状态。垃圾收集器将在需要内存时回收缓存的对象(通过清除引用)。这种方法的一个缺点是您无法控制对象驱逐,GC 决定何时以及哪些对象被驱逐。

  • 两者的结合,(小)固定大小的缓存用于最近的命中,动态 GC'd 用于第二级。

如果配置得当,它们都不会导致任何 OutOfMemory 错误。

于 2012-08-14T13:51:15.813 回答
0

Apache commons 有一个循环 fifo 缓冲区。我想这就是你要找的。

从它的文档

CircularFifoBuffer is a first in first out buffer with a fixed size that replaces its oldest element if full.

要不然

AbstractQueue您可以在 java 库中创建自己的扩展类。

于 2012-08-14T13:38:10.067 回答
0

Java 提供了一个称为接口的接口Queue,以及该接口的一些实现。

您可以看到解决您的问题的最佳选择。看一看

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Queue.html

http://docs.oracle.com/javase/tutorial/collections/implementations/queue.html

于 2012-08-14T12:51:59.013 回答