Redis数据过时策略详解

 

内存淘汰策略主要采用了6种方式进行内存对象的释放操做html

1.volatile-lru:从设置了过时时间的数据集中,选择最近最久未使用的数据释放java

2.allkeys-lru:从数据集中(包括设置过时时间以及未设置过时时间的数据集中),选择最近最久未使用的数据释放redis

3.volatile-random:从设置了过时时间的数据集中,随机选择一个数据进行释放算法

4.allkeys-random:从数据集中(包括了设置过时时间以及未设置过时时间)随机选择一个数据进行入释放数据库

5.volatile-ttl:从设置了过时时间的数据集中,选择立刻就要过时的数据进行释放操做dom

6.noeviction:不删除任意数据(但redis还会根据引用计数器进行释放呦~),这时若是内存不够时,会直接返回错误性能

http://blog.csdn.net/zdy0_2004/article/details/44685615.net

 

redis只是每一个Object维护一个相对的时间,淘汰时,随机取3个或者更多的,找到最老的进行淘汰.这样节省了双链表的指针开销,读时还不用加锁.虽不能保证必定淘汰最老的,但倾向于淘汰偏老的对象, 通过咱们线上的实测:和标准的LRU对比,命中率的损失很是小, 效果不错。指针

http://blog.csdn.net/wallwind/article/details/44906613code

 

Redis的LRU算法不是一个严格的LRU实现。这意味着Redis不能选择最佳候选键来回收,也就是最久未被访问的那些键。相反,Redis 会尝试执行一个近似的LRU算法,经过采样一小部分键,而后在采样键中回收最适合(拥有最久访问时间)的那个。

然而,从Redis3.0开始,算法被改进为维护一个回收候选键池。这改善了算法的性能,使得更接近于真实的LRU算法的行为。Redis的LRU算法有一点很重要,你能够调整算法的精度,经过改变每次回收时检查的采样数量。

这个参数能够经过以下配置指令:

maxmemory-samples 5

Redis没有使用真实的LRU实现的缘由,是由于这会消耗更多的内存。然而,近似值对使用Redis的应用来讲基本上也是等价的。

http://blog.csdn.net/codetomylaw/article/details/50246255

 

惰性删除+按期删除

  • 惰性删除流程
    • 在进行get或setnx等操做时,先检查key是否过时,
    • 若过时,删除key,而后执行相应操做;
    • 若没过时,直接执行相应操做
  • 按期删除流程(简单而言,对指定个数个库的每个库随机删除小于等于指定个数个过时key)
    • 遍历每一个数据库(就是redis.conf中配置的"database"数量,默认为16)
      • 检查当前库中的指定个数个key(默认是每一个库检查20个key,注意至关于该循环执行20次,循环体时下边的描述)
        • 若是当前库中没有一个key设置了过时时间,直接执行下一个库的遍历
        • 随机获取一个设置了过时时间的key,检查该key是否过时,若是过时,删除key
        • 判判定期删除操做是否已经达到指定时长,若已经达到,直接退出按期删除。

http://www.cnblogs.com/java-zhao/p/5205771.html

http://www.cnblogs.com/xuliangxing/p/7151812.html

 

redis 4.0引入LFU,要配置LFU模式,如下策略是可用的:

  • volatile-lfu:使用LFU算法驱逐keys,在过时的keys中驱逐。
  • allKeys-lfu:使用LFU算法驱逐keys。

http://blog.csdn.net/iycynna_123/article/details/72628272

 

http://blog.csdn.net/qq_35440678/article/details/53453107

相关文章
相关标签/搜索