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 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。