6

Redis 缓存过期策略和内存淘汰策略

 1 year ago
source link: https://www.cnblogs.com/it1042290135/p/17159976.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

缓存过期策略

定时删除 没人用

含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除

优点:该策略可以立即清除过期的数据, 保证内存被尽快释放

缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重

惰性删除 内置策略

含义:key过期的时候不删除,只有当访问这个key的时候才去判断缓存是不是过期,若过期,则删除,返回null。

优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)

缺点:对内存非常不友好,若大量的key在超出超时时间后没有被访问,长时间过去可能发生内存泄露(无用的垃圾占用了大量的内存)

含义:每隔一定的时间,会扫描一定数量的的key,并清除其中已经过期的key (在redis.conf配置文件设置hz,1s刷新的频率)

该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果

缺点: 在内存友好方面,不如"定时删除";在CPU时间友好方面,不如"惰性删除" 难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)

看完上方三种可以得到结论: 定时删除和定期删除为主动删除,Redis会定期主动淘汰一批已过去的key;惰性删除为被动删除:用到的时候才会去检验key是不是已过期,过期就删除

惰性删除为redis服务器内置策略

定期删除可以通过:

第一、配置redis.conf 的hz选项,默认为10 (即1秒执行10次,100ms一次,值越大说明刷新频率越快,最Redis性能损耗也越大)

第二、配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略

 内存淘汰策略

Redis的内存淘汰策略

  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。该策略是Redis的默认淘汰策略,一般不会选用。

  2. allkeys-lru:当内存不足以容纳新写入数据时,基于LRU算法,从所有key中,移除最近最少使用的key。

  3. allkeys-random:当内存不足以容纳写入数据时,从所有key中,随机移除某个key,这个一般没人用。

  4. allkeys-lfu:当内存不足以容纳写入数据时,基于LFU算法,从所有key中,删除掉最不经常使用(使用次数最少)的key。

  5. volatile-lru:当内存不足以容纳写入数据时,基于LRU算法,在设置了过期时间的key中,移除最近最少使用的key。

  6. volatile-random:当内存不足以容纳写入数据时,在设置了过期时间的key中,随机移除某个key。

  7. volatile-ttl:当内存不足以容纳写入数据时,在设置了过期时间的key中,(剩余存活时间最短)的key删除掉。

  8. volatile-lfu:当内存不足以容纳写入数据时,基于LFU算法,从设置了过期时间的key中,删除掉最不经常使用(使用次数最少)的key。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK