LoadingCache

LoadingCache参数含义:
1、maximumSize:设定缓存项的数目的最大值,当数目空间不足时,会使用LRU策略进行回收
2、expireAfterxxx:过期逐出,例如expireAfterWrite设置为10分钟,则在10分钟时间内没有被更新就会过期
4、refreshAfterWrite:例如设置为10分钟,则10分钟内没有写操作,就调用加载方法去加载值。在到达过期时间后,对cache进行get操作依然可以返回当前已经过期的值,同时触发load操作
5、cache加载方式:
1)load/loadAll:当获取的缓存值不存在时调用,在load操作完成前,调用者会被阻塞。如果有多个线程同时获取同一个key的操作,只会进行一次load;如果load操作失败抛出异常,调用者也会抛异常
2)reload:cache中有数据,但是设置了refreshAfterWrite行为,则会触发reload操作;如果没有设置,则reload不会被使用。 reload操作返回的是一个Future而非结果值。reload操作如果还没有完成,或者reload失败,则依然会返回先前的旧值。reload的默认行为依然是阻塞的,它直接调用了load方法。框架中有一个AsyncReloadCacheLoader是一个使用单独的线程池中执行reload操作的实现,不阻塞用户请求。
6、建议expireAfterXXX和refreshAfterWrite搭配使用,并设置refreshAfterWrite参数的时间小于expireAfterXXX参数的时间。比如refreshAfterWrite=5s,expireAfterXXX = 10s。这样在触发refresh操作的时候cache中数据还没有过期,只需一个线程执行reload

 

LoadingCache的get和getUnchecked:

get方法会抛异常,需要手动try-catch

getUnchecked方法,不用手动try-catch

LoadingCache中get方法如果返回null值,会抛出npe异常

 

注意从本地缓存中读取数据后不能修改,否则缓存中的数据也会跟着改变。因为返回的对象就是保存在缓存内部的对象。

loadingcache底层类似于concurrentHashMap,也用到了分段锁segment

posted @ 2023-06-29 14:28  MarkLeeBYR  阅读(1053)  评论(0编辑  收藏  举报