Redisson动态增量数据的存储,LRU与LFU的比较
LRU与LFU什么意思
这两个缩略词的意思,网络上搜搜一下,应该都能找到相关的解释。这里做一下简要的说明,
- LRU(least frequently used): 最近最少使用
- LFU(Least Recently Used): 最不经常使用
Redisson对应Class说明
当前使用的文档为3.11.2版本的javadoc。
对应的两个Map为org.redisson.cache
包下的,
LFUCacheMap
LRUCacheMap
以上类均继承或扩展org.redisson.cache.AbstractCacheMap<K,V>
类。
LRUCacheMap
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表示不限制空闲时间
StdCachedValue
函数public boolean isExpired()
会使用ttl和maxIdleTime,逻辑判断如下,
- 若maxIdleItime和tt均为0,则返回false
- 若ttl不为0,且value的创建时间+ttl的时长小于当前时间,则返回true
- 若maxIdleTime不为0,且最后访问时间+maxIdleTime小于当前时间,则返回true
- 其他情况均返回false
常用方法
- boolean remove(Object o)
- void clear()
- Set keySet()
- Collection values()
- V put(K key, V value)
- V get(Object key)
- boolean contains(Object o)
- int size()
未完待续…