前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Guava Cache使用的三种姿势

Guava Cache使用的三种姿势

作者头像
SecondWorld
发布2021-07-28 11:01:34
1.1K0
发布2021-07-28 11:01:34
举报
文章被收录于专栏:Java开发者杂谈

姿势一

代码语言:javascript
复制
使用expiredAferWriter
优点
  • 简单
  • 粗暴
缺点
  • 同步阻塞问题:如果多个线程同时请求同一个过期的key,只有一个线程能够获得去加载缓存的锁,但是其他未获取加载缓存锁的线程也会阻塞。
show me the code

姿势二

代码语言:javascript
复制
使用expiredAfterWrite + refreshAfterWrite
使用注意
代码语言:javascript
复制
指定refreshAferWrite的时间小于expiredAfterWrite
必须使用LoadingCache
直接使用get获取缓存
优点
  • 当到达刷新时间之后,只会有一个线程获得刷新缓存的锁,其他线程直接返回缓存中的旧值,仅阻塞刷新缓存的线程
缺点
  • 刷新缓存的线程还是会被阻塞
show me the code

姿势三

代码语言:javascript
复制
使用expiredAfterWrite + refreshAfterWrite + ListenableFuture
优点
  • 刷新缓存的线程也不会被阻塞,而是直接返回
缺点
  • 刷新缓存的线程得到的仍然是旧值
  • 缓存的刷新或者重新加载还是得靠外部请求触发,不能完全达到定时刷新效果

注意

代码语言:javascript
复制
1. 不管上面那种方式,缓存的加载和刷新都需要外部调用(get)才触发
2. 使用姿势二和三要注意缓存的刷新过期时间要设置的比加载过期时间短,否则体现不出优势
3. 如果当前请求缓存时间距离最后一次时间已经超过过期时间,则会调用加载(load)方法而非刷新(reload)方法来加载缓存,此时会回退到姿势一
4. 刷新缓存的同时也会刷新缓存下次过期的时间(在当前时间累加过期时间)
5. 具体逻辑参照**com.google.common.cache.LocalCache$Segment**。这里贴出一些关键逻辑供各位参考:
代码语言:javascript
复制
只有在value!=null的时候(既未达到过期时间时)才会调用refresh方法
代码语言:javascript
复制
注册了一个Listener来实现异步刷新
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-07-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 姿势一
    • 优点
      • 缺点
        • show me the code
        • 姿势二
          • 使用注意
            • 优点
              • 缺点
                • show me the code
                • 姿势三
                  • 优点
                    • 缺点
                    • 注意
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档