efreshAfterWrite(long, TimeUnit) -> 机制是并非超时时间到就自动刷新,而是请求 get的时候才会触发refresh,默认refresh是同步请求新值,可以重写refresh方法改成异步。如果有大量并发请求的时候,只会有一个请求get->reload同步执行,其他线程返回旧值.
弊端
吞吐量低的应用,在超过过期时间时,大量并发get请求时,大部分拿到的是很久前的旧值,导致数据脏读。
如何解决?
可以同时使用expireAfterWrite设置key过期时间,比如每2s刷新一次新值,设置expireAfterWrite为5s为过期时间,则当key值5s没有访问的话,则第5s的时候强制取load新值,解决了脏读问题,也同时避免了缓存穿透问题。