Redisson动态增量数据的存储,LRU与LFU的比较

Redisson动态增量数据的存储,LRU与LFU的比较

  • LRU与LFU什么意思
  • Redisson对应Class说明
    • LRUCacheMap
      • 构造函数
        • StdCachedValue
      • 常用方法

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类。

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,逻辑判断如下,

  1. 若maxIdleItime和tt均为0,则返回false
  2. 若ttl不为0,且value的创建时间+ttl的时长小于当前时间,则返回true
  3. 若maxIdleTime不为0,且最后访问时间+maxIdleTime小于当前时间,则返回true
  4. 其他情况均返回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()

未完待续…

你可能感兴趣的:(开源Redisson使用)