请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

2回答

weixin_慕桂英2091354 2020-03-18 10:41:13

efreshAfterWrite(long, TimeUnit) -> 机制是并非超时时间到就自动刷新,而是请求 get的时候才会触发refresh,默认refresh是同步请求新值,可以重写refresh方法改成异步。如果有大量并发请求的时候,只会有一个请求get->reload同步执行,其他线程返回旧值.

弊端
吞吐量低的应用,在超过过期时间时,大量并发get请求时,大部分拿到的是很久前的旧值,导致数据脏读。

如何解决?
可以同时使用expireAfterWrite设置key过期时间,比如每2s刷新一次新值,设置expireAfterWrite为5s为过期时间,则当key值5s没有访问的话,则第5s的时候强制取load新值,解决了脏读问题,也同时避免了缓存穿透问题。


0 回复 有任何疑惑可以回复我~
龙虾三少 2020-03-05 16:35:11

没办法保证强一致

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_福森_0 #1
    所以我们本地缓存的缓存时间都很短,这样才能够及时更新缓存,或者在consumer 中把本地缓存清除,是吗
    回复 有任何疑惑可以回复我~ 2020-03-05 18:41:51
  • 龙虾三少 回复 提问者 qq_福森_0 #2
    本地是没有办法保证一致性的,因为我们用的是多机部署,所以不会用本地库存缓存的方案
    回复 有任何疑惑可以回复我~ 2020-08-04 12:08:14
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信