java lru队列_高吞吐、线程安全的LRU缓存详解

本文研究的主要是高吞吐、线程安全的LRU缓存的相关内容,具体介绍如下。

几年以前,我实现了一个LRU缓存用来为关键字来查找它的id。数据结构非常有意思,因为要求的吞吐很大足以消除大量使用locks和synchronized关键字带来的性能问题,应用是用java实现的。

我想到一连串的原子引用分配会在ConcurrentHashMap中保持LRU保持LRU顺序,开始的时候我把value包装到entry中去,entry在双链表的LRU链中有一个节点,链的尾部保持的是最近使用的entry,头节点中存放的是当缓存达到一定的大小的时候可能会清空的entry。每一个节点都指向用来查找的entry。

a064001cb9e6bbd006ba1829095150f1.png

当你通过key查找值的时候,缓存首先要查找map看看是否有这个value存在,如果不存在的话,它将依赖于加载器将value从数据源中以read-through的方式读出来并且以“如果缺失则添加”的方式添加的map中去。确保高吞吐的挑战是有效的维护LRU链。这个并发的哈希map是分段的而且在线程的水平在一定水平(当你构建map的时候你可以指定并发的水平)情况下的时候不会经历太多的线程竞争。但是LRU链不能以同样的方式被划分吗,为了解决这个问题,我引入了辅助的队列用来清除操作。

在cache中有六个基本的方法。对于缓存命中,查找包含两个基本操作:get和offer,对于换粗丢失包含四个基本的方法get、load、put和offer。在put方法上,我们也许需要追踪清空操作,在缓存命中的情况下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值