1,简介
redis内存回收主要体现在两个方面
1)过期key的清理
2)设置maxmemory,内存达到限制时触发数据淘汰
2,过期key的清理
redisDb数据结构
expires字典:保存了所有键的过期时间,值使用unix时间戳
1)惰性删除
读写一个过期key时,会触发惰性删除。
2)定时删除
redis维护定时任务,默认1秒10次。随机抽取部分key,如失效,则删除
3)主从模式的影响
主节点才会执行两种key清理策略,发送DEL命令到从节点如果期间对从节点读操作,则仍会正常读取
。
3,maxmemory与数据淘汰
redisObject数据结构
lru:记录对象最后一次被命令程序访问的时间。使用object idletime $key 可以查看key的空转时间
参与数据淘汰:当使用内存操作maxmemory时,会触发数据淘汰策略。使用volatile-lru、allkeys—lru时,redis会淘汰空转时间最长的对象
maxmemory_samples:随机取固定数目的key基于server.maxmemory_samples,按照访问时间排序,淘汰的最不经常使用的。
1)maxmemory、maxmemory-policy配置
redis.conf:配置maxmemory
config命令:CONFIG SET maxmemory 100MB
2)数据淘汰策略
volatile-lru:只对设置了过期时间的内存数据集进行LRU
allkeys-lru:对所有内存数据集进行LRU
noeviction:永不过期
volatile-ttl:删除即将过期的数据
volatile-random:随机删除即将过期的数据
allkeys-random:随机删除数据
4,Redis LFU实现
Redis4.0之后出现的数据淘汰策略:
使用LRU并不精确,不能准确的识别热点key
1)LFU按最近的访问频率进行淘汰,将lru字段分成16bit + 8bit。
高16bit:最近一次计数器降低的时间ldt (last decrement time)
低8bit:用来存储访问频次,logc (logistic counter)
2)数据淘汰策略
volatile-lfu:对有过期时间的key采用LFU淘汰算法
allkeys-lfu:对全部key采用LFU淘汰算法
3)参数配置
lfu-log-factor:调整logc的增长速度,lfu-log-factor越大,增长越慢
lfu-decay-time:以分钟为单位的数值,调整logc的减少速度