更新HashMap for Object Cache的最佳实践

时间:2013-11-28 17:45:44

标签: java caching hashmap volatile concurrenthashmap

我正在使用Jersey开发一个RESTful Web服务,我将使用一个简单的对象缓存,它通过基于计时器从数据库中检索记录来更新它的数据。我计划使用HashMap将检索到的数据存储在此缓存中,但我的问题是更新此HashMap的最佳做法是什么。

现在我的选择是让HashMap变得易变,只要有更新,创建一个新的HashMap,然后在完成时分配它。我还可以将HashMap包装在同步块中,或者在直接更新HashMap变量时使用ReentrantReadWriteLock。我也考虑过使用ConcurrentHashMap,它似乎有一些性能优势。使用这些方法之一是否存在显着的性能差异和/或缺点?

此外,当用户通过我的Web服务API更新或插入记录时,最好是在将记录保存到数据库中时直接更新本地缓存,还是强制缓存执行另一次大数据检索?

2 个答案:

答案 0 :(得分:2)

而不是HashMap,请考虑使用Guava'缓存,它更易于配置并记录您缓存数据的意图。阅读this示例。

答案 1 :(得分:0)

使用ConcurrentLinkedHasHMap,它使用LIRS算法。

ConcurrentLinkedHashMap实现是ConcurrentHashMap实现的调整版本,最初由Doug Lea编写,可在OpenJDK 1.6.0_0上找到。我们提出了ConcurrentMap接口的并发哈希映射和链表实现,具有可预测的迭代顺序。此实现与ConcurrentHashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入地图中,则不会影响插入顺序。