缓存的高频率并发性

use*_*955 6 concurrency caching

我正在学习缓存,并对缓存的并发性有疑问.

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

如果我们使用互斥锁来保证线程安全,那么如果大量人员访问缓存,速度是否会降低?如果我们不使用锁,会使用什么技术?提前致谢.

Ben*_*nes 11

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

制定LRU缓存规模的方法是避免在每次访问时更新策略.要做的重要观察是缓存的用户不关心当前LRU的排序.调用者唯一关心的是缓存保持阈值大小和高命中率.这通过避免在每次读取时改变LRU策略来打开优化的大门.

memcached采用的方法是在时间窗口内丢弃后续读取,例如1秒.预计缓存将非常大,因此通过这种更简单的LRU驱逐可怜的候选者的可能性非常低.

ConcurrentLinkedHashMap(CLHM)以及随后的Guava缓存所采用的方法是将访问记录在缓冲区中.此缓冲区在LRU的锁定下耗尽,并且try-lock必须阻止其他操作.如果缓存无法跟上,CLHM使用多个有效的环缓冲区,因为丢失事件优于降低性能.

Ehcacheredis采用的方法是概率LRU策略.读取更新条目的时间戳,写入迭代缓存以获取随机样本.最旧的条目将从该样本中逐出.如果样本构建速度快且缓存很大,那么被驱逐的条目可能是一个很好的候选者.

可能还有其他技术,当然还有伪LRU策略(如CLOCK),可以在较低的命中率下提供更好的并发性.