Caching 高速缓存的高频率并发

Caching 高速缓存的高频率并发,caching,concurrency,Caching,Concurrency,我正在学习缓存,对缓存的并发性有一个问题 据我所知,LRU缓存是用双链表+哈希表实现的。那么LRU缓存如何处理高频率并发?注意:从缓存获取数据和将数据放入缓存都会更新链表和哈希表,所以缓存会一直被修改 如果我们使用互斥锁来实现线程安全,那么如果缓存被大量用户访问,速度不会降低吗?如果我们不使用锁,会使用什么技术?提前感谢。由于硬件有限,传统的LRU缓存不是为高并发性而设计的,而且命中惩罚远小于未命中惩罚(例如数据库查找)。对于大多数应用程序,如果缓存仅用于更新底层结构(而不是计算未命中的值),则

我正在学习缓存,对缓存的并发性有一个问题

据我所知,LRU缓存是用双链表+哈希表实现的。那么LRU缓存如何处理高频率并发?注意:从缓存获取数据和将数据放入缓存都会更新链表和哈希表,所以缓存会一直被修改


如果我们使用互斥锁来实现线程安全,那么如果缓存被大量用户访问,速度不会降低吗?如果我们不使用锁,会使用什么技术?提前感谢。

由于硬件有限,传统的LRU缓存不是为高并发性而设计的,而且命中惩罚远小于未命中惩罚(例如数据库查找)。对于大多数应用程序,如果缓存仅用于更新底层结构(而不是计算未命中的值),则锁定缓存是可以接受的。当锁被争用时,像分割LRU策略这样的简单技术通常已经足够好了

实现LRU缓存规模的方法是避免在每次访问时更新策略。需要进行的关键观察是,缓存的用户并不关心当前LRU的顺序。调用者唯一关心的是缓存保持阈值大小和高命中率。这为优化打开了大门,避免了在每次读取时改变LRU策略

采用的方法是在一个时间窗口内(例如1秒)放弃后续读取。缓存预计将非常大,因此通过这种简单的LRU驱逐较差的候选人的可能性非常低

CLHM(CLHM)随后采取的方法是将访问记录在缓冲区中。此缓冲区在LRU锁下排空,通过使用
try lock
无需阻止其他操作。CLHM使用多个环形缓冲区,如果缓存无法跟上,这些缓冲区是有损的,因为丢失事件比降低性能更可取

and采用的方法是一种概率LRU策略。读操作更新条目的时间戳,写操作迭代缓存以获得随机样本。将从该示例中逐出最旧的条目。如果样本的构造速度很快,并且缓存很大,那么被逐出的条目可能是一个很好的候选项


可能还有其他技术,当然还有伪LRU策略(如时钟),它们可以以较低的命中率提供更好的并发性。

是的,你完全正确。在高度并发的环境中,如果必须将锁保持很长一段时间,那么监视器锁定将有很大的性能限制。在这种情况下,您可能对基于原子操作(如putIfAbsent)开发并发缓存感兴趣。然而,这是一种复杂的方法,最好的选择是使用一个并发库(如果您可以修改的话)。Brian Goetz的Java并发实践中开发了一个基本的并发缓存。请看这里的链接:.@Ben,dbf,scottb:我已经阅读了concurrentlinkedhashmap,它是由Ben Manes和Charles Fry从。这是一篇非常好的文章,有着聪明的想法和清晰的解释。我还阅读了文章中提到的LIRS。我现在对缓存的工作原理有了更深入的了解。谢谢大家。另请参阅Java8重写,它增加了优化。