Redis对过期key的删除策略

如果假设你设置了一批 key 只能存活 1 个小时,那么接下来 1 小时后,redis 是怎么对这批 key 进行删除的?

定期删除 + 惰性删除

  • 定期删除:
    redis是默认每隔100ms就随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。注意!这里是随机抽取, 这样即使在redis中存储了很多数据的情况下,依然能够保证性能.
  • 惰性删除:
    懒惰删除就如字面意思,每次在获取key的时候,会排查这个key是否过期,如果过期了就删除。
  • Redis内存淘汰机制:
    考虑一下这种场景,定期删除漏掉了许多过期的key,同时也没有去及时去排查,也就没触发惰性删除,这时,大量的过期key就会堆积在内存里,导致redis内存块耗尽… 而解决这个问题的办法就是redis内存淘汰机制。
    Redis提供6种数据淘汰策略
  • volatile-lru:从已经设置了过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已经设置了过期时间的数据集中挑选即将过期的的数据淘汰
  • volatile-random:从已经设置了过期时间的数据集中挑选随机挑选数据淘汰
  • allkeys-lru:从所有数据集中挑选最近最少使用的数据淘汰 (最常用)
  • allkeys-random:从所有数据集中挑选随机挑选数据淘汰
  • no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。

4.0版本之后增加了以下两种:

  • volatile-lfu:从已经设置了过期时间的数据集中挑选最不经常使用的数据淘汰
  • allkeys-lfu:从所有数据集中挑选最不经常使用的数据淘汰

Redis事务

Redis的事务其实就是将一组命令打包,然后一次性执行完,期间不允许被打断,执行完毕后才能去执行其他客户端的命令

所以Redis的事务满足:

  • 不支持回滚的原子性
  • 一致性
  • 隔离性(因为是串行的)

如果运行在特性的持久化模式下,也会具有一定程度的持久性。

redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。