带你回顾Redis的过期删除策略和内存淘汰策略

158 阅读2分钟

我们都知道redis是一个内存数据库,常应用于我们的业务场景中。比如token,我们常常存入redis设置一个有效时间。

那redis是怎么知道这个token是什么时候失效呢,什么时候把它删除了呢?

  1. redis的键值过期策略?

过期字典: 设置了过期时间的key,会存入redis的过期字典里;过期字典里存储了所有的有效键值。

过期字典是一个哈希结构,key还是key,value是存储过期时间

所以当我们查找一个key时,redis查找的时候,会在过期字典里查找,判断是否过期。如果不在过期字典里,就正常查找

redis的键值过期策略:

  • 惰性删除策略:
    • 不主动删除key,而是当访问到这个key的时候判断是否过期,过期就删除
    • 这样会导致内存浪费,如果一个过期key一直未被访问
  • 定期删除策略
    • 就是每隔一段时间就从过期字典树,随机选取几个key键检查是否过期,过期就删除

redis的删除策略就是上面两种的结合:

  1. 当redis的内存达到上限,怎么通过内存淘汰策略淘汰key的呢?

redis的内存淘汰主要分为两种,【不进行数据淘汰】和【进行内存淘汰】

noeviction :不进行数据淘汰;当内存达到上限后,再想存储key就会拒绝服务

volatitle-random: 在过期字典树中随机淘汰

volatitle-ttl: 淘汰最早过期的键值

volatitle-lru: 过期字典树中,淘汰最久未使用的

volatitle-lfu:过期字典树中,淘汰使用频率最低的

allkeys-random: 所有键值随机淘汰

allkeys-lru: 所有键值淘汰最久未使用的

allkeys-lfu: 所有键值淘汰使用频率最低的

  1. redis是怎么实现lru和lfu的

lru: 采用随机抽样方式;他在redis对象中加了一个时间戳,记录最后一次访问时间,那么会随机从链表选取几个,然后淘汰最久未使用的

lfu: 采用时间戳+访问次数方式来推算频率。每次访问会比较这次访问时间后对象的时间戳,相差越大,那这个key的频率就会按一定比例下降。