Redis的过期键删除策略和内存淘汰机制

一、过期键的判定

通过过期字典,程序可以用以下步骤检查一个给定键的过期时间:
(1)检查给定键是否存在于过期字典;如果存在就取出来过期时间;
(2)检查当前的UNIX时间戳是否大于键的过期时间,如果是的话,那么键过期,否则键未过期。
伪代码过程:
在这里插入图片描述

二、过期键删除策略

1.定时删除(主动删除)

需要让服务器创建大量定时器,从而达到定时删除,不现实。一般不用

概念:在设计过期时间的时候,创建一个定时器,让定时器在键过期时间来临的时候,执行删除操作。
优点:对内存友好,保证内存被尽快释放。
缺点
1)若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿(应该优先处理客户端的请求),还需要去花时间删除这些key。
2)定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重。

2.惰性删除(被动删除策略)

概念:放任过期键,从键空间中获取键,检查键是否过期,如果过期,就删除,如过没有过期,就放回。
优点对cpu最友好:程序只会取出键时才会对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上浪费cpu时间。
缺点对内存不友好:大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)

2.定期删除(主动删除策略)

定期删除策略是对前面两种策略的整合和折中

概念: 每隔一段时间,程序就会对数据库做一些检查,删除里面的过期键。至于要删除那些过期键,以及检查多少数据库由算法决定。
优点
(1)定 期删除测每隔一段时间执行一次删除策略,并通过限制删除策略的时间和频率来减少删除操作对cpu时间上的影响。
(2)有限的降低了过期键带来的内存浪费。
难点:确定执行的时长和频率
(1)如果删除操作执行太过频繁,或者执行时间太长。就会退化成定时删除,以至于占用cpu的时间过长。
(2)如果执行时间过短或者频率太低,就会退化成惰性删除,出现浪费内存的情况。

三、Redis的过期键删除策略

Redis服务器实际使用惰性删除和定期删除,配合使用吗,很好的在cpu的使用和避免浪费空间之间取得平衡。

1.惰性删除策略

在这里插入图片描述

2.定期删除策略的实现

在这里插入图片描述

四、Redis 内存淘汰机制

1.原因

作为一个内存数据库,redis是由内存限制的,为了保证更高的命中率,会采用内存淘汰机制。
Redis可以设置内存大小:

#maxmemory <bytes>
# 设置Redis最大占用内存大小为100
maxmemory 100mb

超过了这个内存大小,就会触发内存淘汰机制

2.策略

1)noeviction: 不删除,直接返回报错信息。
2)allkeys-lru:移除最久未使用(使用频率最少)使用的key。推荐使用这种。
3)volatile-lru:在设置了过期时间的key中,移除最久未使用的key。
4)allkeys-random:随机移除某个key。
5)volatile-random:在设置了过期时间的key中,随机移除某个key。
6)volatile-ttl: 在设置了过期时间的key中,移除准备过期的key。
7)allkeys-lfu:移除最近最少使用的key。
8)volatile-lfu:在设置了过期时间的key中,移除最近最少使用的key。
注释
LRU和LFU的区别:

(1)LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!
比如有数据 1,1,1,2,2,3
此时缓存中已有(1,2)
当3加入的时候,得把前面的1淘汰,变成(3,2)

(2)LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!
比如有数据 1,1,1,2,2,3
缓存中有(1(3次),2(2次))
当3加入的时候,得把后面的2淘汰,变成(1(3次),3(1次))

3.应用场景

allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。

allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被删除。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值