版本2.5.13
使用@CreateCache创建缓存,设置了定时刷新策略和loader,在使用get获取数据时会触发自动刷新任务,在使用computeIfAbsent数据后不会触发自动刷新。
看了一下源码刷新任务是在RefreshCache的GET、GETALL中加入的,这是个代理对象,未覆盖computeIfAbsent,这样在调用到实际缓存的computeIfAbsent时,虽然内部有对具体缓存的GET,但不会触发RefreshCache的GET,因此不会添加刷新任务,调试过调用computeIfAbsent全程不会走addOrUpdateRefreshTask不会产生刷新任务。
computeIfAbsent也相当于一种get,在用Cache对象的时使用computeIfAbsent获取数据情况会比较多,是不是也应该触发刷新?
2条答案
按热度按时间py49o6xq1#
感谢反馈,有这个问题,我看看怎么修复
zdwk9cvp2#
2.5.14版本已经发布,给computeIfAbsent增加了自动刷新。当初可能是觉得computeIfAbsent传入的是一个临时的loader,所以没有给做自动刷新。
另外,这次改动的过程中发现GET/GET_ALL方法会触发自动刷新,按原先的设计思路,这是不对的。大写的API应该是纯粹的访问缓存,不应该有其它的副作用(例如LoadingCache的GET/GET_ALL就不会触发loader,而是纯粹看缓存里面有没有数据)。如果要改正这个问题就会不兼容,所以2.5版本暂时不改了,2.6版本将会把这个行为纠正过来。