我想使用一个 java 集合(列表、地图等)来缓存一些数据,这样我就可以使用这个缓存而不是直接检查数据库。我唯一担心的是集合大小,我希望这个缓存可以保存假设只有 1000 个条目,一旦达到这个计数,我想删除最旧的条目并放置一个新条目。这可能吗?
5 回答
你应该看看LinkedHashMap。如果您覆盖removeEldestEntry
,您可以控制地图中最旧的条目何时被删除(何时put
或被putAll
调用)。
您可以使用 Google Guava 提供的缓存实用程序:http ://code.google.com/p/guava-libraries/wiki/CachesExplained
根据每个缓存对象的“权重”,有多种变体。选择更适合您的用例的:
固定大小的缓存(可以使用 Collection 实现并跟踪其大小)。如果对象相当小并且可以提前很好地估计内存占用,则此方法效果很好。其他答案基本上说明了实现这种类型的方法。
通过垃圾收集器自动驱逐的动态缓存。如果要缓存的对象很大(或大小变化很大,例如文件或图像)并且您希望使用尽可能多的堆可用于缓存,这很有效。缓存管理 java.lang.SoftReference 的集合以使对象保持活动状态。垃圾收集器将在需要内存时回收缓存的对象(通过清除引用)。这种方法的一个缺点是您无法控制对象驱逐,GC 决定何时以及哪些对象被驱逐。
两者的结合,(小)固定大小的缓存用于最近的命中,动态 GC'd 用于第二级。
如果配置得当,它们都不会导致任何 OutOfMemory 错误。
Apache commons 有一个循环 fifo 缓冲区。我想这就是你要找的。
从它的文档
CircularFifoBuffer is a first in first out buffer with a fixed size that replaces its oldest element if full.
要不然
AbstractQueue
您可以在 java 库中创建自己的扩展类。
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