我们都知道redis是一个内存数据库,常应用于我们的业务场景中。比如token,我们常常存入redis设置一个有效时间。
那redis是怎么知道这个token是什么时候失效呢,什么时候把它删除了呢?
- redis的键值过期策略?
过期字典: 设置了过期时间的key,会存入redis的过期字典里;过期字典里存储了所有的有效键值。
过期字典是一个哈希结构,key还是key,value是存储过期时间
所以当我们查找一个key时,redis查找的时候,会在过期字典里查找,判断是否过期。如果不在过期字典里,就正常查找
redis的键值过期策略:
- 惰性删除策略:
- 不主动删除key,而是当访问到这个key的时候判断是否过期,过期就删除
- 这样会导致内存浪费,如果一个过期key一直未被访问
- 定期删除策略
- 就是每隔一段时间就从过期字典树,随机选取几个key键检查是否过期,过期就删除
redis的删除策略就是上面两种的结合:
- 当redis的内存达到上限,怎么通过内存淘汰策略淘汰key的呢?
redis的内存淘汰主要分为两种,【不进行数据淘汰】和【进行内存淘汰】
noeviction :不进行数据淘汰;当内存达到上限后,再想存储key就会拒绝服务
volatitle-random: 在过期字典树中随机淘汰
volatitle-ttl: 淘汰最早过期的键值
volatitle-lru: 过期字典树中,淘汰最久未使用的
volatitle-lfu:过期字典树中,淘汰使用频率最低的
allkeys-random: 所有键值随机淘汰
allkeys-lru: 所有键值淘汰最久未使用的
allkeys-lfu: 所有键值淘汰使用频率最低的
- redis是怎么实现lru和lfu的
lru: 采用随机抽样方式;他在redis对象中加了一个时间戳,记录最后一次访问时间,那么会随机从链表选取几个,然后淘汰最久未使用的
lfu: 采用时间戳+访问次数方式来推算频率。每次访问会比较这次访问时间后对象的时间戳,相差越大,那这个key的频率就会按一定比例下降。