Redis缓存过期策略以及淘汰策略是什么?
# 一、Redis的过期删除策略
Redis 是一种支持过期数据的键值对存储系统,它的过期策略如下:
# 1.1、定期删除策略
Redis 默认每隔 100ms 就随机抽取一些设置了过期时间的键,并检查它们是否过期,如果过期就将其删除。默认情况下,Redis 每秒执行 10 次此操作。可以通过配置文件中的 hz
参数来调整此操作的执行频率。
# 1.2、惰性删除策略
当一个过期键被访问时,Redis 会检查它是否过期,如果过期就将其删除。这个检查是惰性的,也就是说,Redis 只有在有需要时才会执行这个检查。因此,如果一个过期键一直没有被访问,那么它就不会被删除。这种策略可以减少 Redis 的 CPU 使用率,但可能会导致过期键的存留时间比较长。
# 1.3、客户端删除策略
当一个客户端对一个过期键进行操作时,Redis 会检查它是否过期,如果过期就将其删除。这种策略可以确保过期键及时被删除,但需要客户端在访问过期键之前进行过期检查。
需要注意的是,Redis 的过期策略并不是完全准确的。由于定期删除策略是随机抽取键进行删除,因此可能会出现某些过期键没有被及时删除的情况。而惰性删除策略和客户端删除策略都需要等待键被访问才能进行删除,如果某些键一直没有被访问,那么它们可能会一直存在,直到内存不足为止。因此,在设计应用程序时,需要考虑到这些潜在的问题,并采取相应的措施来处理。
# 二、Redis的缓存淘汰策略
Redis 是一种内存缓存系统,由于内存有限,当 Redis 的内存空间不足时,就需要采用缓存淘汰策略,将一些缓存对象删除以腾出空间。Redis 支持以下几种缓存淘汰算法:
- LRU(Least Recently Used):Redis 会根据键最近被访问的时间,删除最近最少使用的键。
- LFU(Least Frequently Used):Redis 会根据键被访问的次数,删除访问次数最少的键。
- FIFO(First In, First Out):Redis 会删除最早被添加到缓存中的键。
- Random(随机):Redis 会随机选择一个键进行删除。
可以通过配置文件中的 maxmemory-policy
参数开启指定策略,需要注意的是,当 Redis 的内存空间不足时,缓存淘汰策略并不是立即生效的。当一个键过期或者被修改时,Redis 会检查内存空间是否足够,如果不足则会触发缓存淘汰策略,删除一些键以腾出空间。
淘汰策略名称 | 策略含义 |
---|---|
noeviction | 默认策略,不淘汰数据;大部分写命令都将返回错误(DEL等少数除外) |
volatile-lfu | 从设置了过期时间的数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用) |
volatile-lru | 从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰 |
volatile-random | 从设置了过期时间的数据中随机挑选数据淘汰从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰 |
volatile-ttl | 从设置了过期时间的数据中,挑选越早过期的数据进行删除 |
allkeys-lru | 从所有数据中根据 LRU 算法挑选数据淘汰 |
allkeys-random | 从所有数据中随机挑选数据淘汰 |
allkeys-lfu | 从所有数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用) |