这两个缩略词的意思,网络上搜搜一下,应该都能找到相关的解释。这里做一下简要的说明,
LRU(least frequently used): 最近最少使用LFU(Least Recently Used): 最不经常使用当前使用的文档为3.11.2版本的javadoc。 对应的两个Map为org.redisson.cache包下的,
LFUCacheMapLRUCacheMap 以上类均继承或扩展org.redisson.cache.AbstractCacheMap<K,V>类。LRU(least recently used) cache,即最近最少使用cache。使用ArrayList存储不断增长的CachedValue,列表的大小固定为当前CPU核数的2倍;每个列表元素是一个LinkedHashSet,其值为CachedValue.。保存key-value值到LRUCacheMap时,根据CachedValue的hashCode对列表取模运算,返回该值要添加到的LinkedHashSet所在的列表中的索引,从而找到要保存到的LinkedHashSet集合。 每次读取key-value值时,都会把该值从相应的LinkedHashSet中取出,然后重新放回尾部。 当map放满时,会调用onMapFull()方法,每次调用从一个列表中(轮询几个列表)选择LinkedHashSet的头部CachedValue元素移除。至于轮询的逻辑是,使用了一个AtomicInteger的index变量记录上次使用的值,初始值为0,每次map满时就自增1,然后对列表的长度取模,然后去绝对值,作为当前要移除元素的列表的索引值,然后做移除操作。
LRUCacheMap(int size, long timeToLiveInMillis, long maxIdleInMills) 主要包括以下的参数,
size:限制map的key值得数量timeToLiveInMillis: 作为StdCachedValue的构造函数参数ttl,0表示不限制存活时间maxIdleInMills:作为StdCachedValue的构造函数参数maxIdleTime,0表示不限制空闲时间函数public boolean isExpired()会使用ttl和maxIdleTime,逻辑判断如下,
若maxIdleItime和tt均为0,则返回false若ttl不为0,且value的创建时间+ttl的时长小于当前时间,则返回true若maxIdleTime不为0,且最后访问时间+maxIdleTime小于当前时间,则返回true其他情况均返回false未完待续…
