redis内存淘汰策略
内存淘汰策略是指当 Redis 数据库的内存使用量达到预设的最大限制(通过 maxmemory
参数设置)时,为了防止内存溢出,Redis 会按照某种策略自动删除部分已存储的数据,释放内存空间。Redis 提供了多种内存淘汰策略供用户根据实际应用场景选择。以下是 Redis 支持的主要内存淘汰策略:
LRU全称Least recently used,意思为淘汰掉最久未使用(即最老)的一条数据;
LFU全称Least-frequently used,意思为淘汰掉过去被访问次数最少的一条数据
noeviction
默认策略,不淘汰数据;大部分写命令都将返回错误
不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误。
volatile-lru
从设置了过期时间的数据中根据 LRU 算法挑选数据淘汰(只针对设置过期的keys)
从设置了过期时间的数据集中,选择最近最久未使用的数据释放 ,最老的删掉
allkeys-lru这个是最常用的
从所有数据中根据 LRU 算法挑选数据淘汰(所有keys)
从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放 最老的删掉
allkeys-random
从所有数据中随机挑选数据淘汰
随机选择一个数据进行释放;
volatile-random
从设置了过期时间的数据中随机挑选数据淘汰
从设置了过期时间的数据集中,随机
volatile-ttl
从设置了过期时间的数据中,挑选越早过期的数据进行删除
从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作
allkeys-lfu
从所有数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)
淘汰掉过去被访问次数最少的一条数据
volatile-lfu
从设置了过期时间的数据中根据 LFU 算法挑选数据淘汰(4.0及以上版本可用)
淘汰掉设置了过期时间的key过去被访问次数最少的一条数据
1. volatile-lru (LRU for keys with an expire set)
工作原理:
- 当内存达到上限时,优先从所有设置了过期时间(TTL)的键中,根据 LRU(Least Recently Used,最近最少使用)算法选择最近最少使用的键进行淘汰。
适用场景:
- 适用于需要对有过期时间设定的键进行内存管理的情况,优先保留最近访问过的键。
2. allkeys-lru (LRU for all keys)
工作原理:
- 不区分键是否设置了过期时间,对所有键按照 LRU 算法进行淘汰。即,删除最近最少使用的键。
适用场景:
- 适合对所有键都需要进行统一内存管理,且希望保留最近访问过的数据的场景。
3. volatile-ttl (Minimum TTL)
工作原理:
- 仅针对设置了过期时间的键,淘汰即将过期(剩余 TTL 最短)的键。
适用场景:
- 适用于希望尽快淘汰即将过期数据的场景,可能用于数据老化较快或希望尽快释放即将失效数据所占内存的情况。
4. volatile-lfu (LFU for keys with an expire set)
工作原理:
- 仅针对设置了过期时间的键,淘汰访问频率最低(LFU,Least Frequently Used)的键。
适用场景:
- 适用于需要对有过期时间设定的键进行内存管理,并希望优先淘汰访问频率最低的键的场景。
5. allkeys-lfu (LFU for all keys)
工作原理:
- 不区分键是否设置了过期时间,对所有键按照 LFU 算法进行淘汰。即,删除访问频率最低的键。
适用场景:
- 适合对所有键都需要进行统一内存管理,且希望优先淘汰访问频率最低的键的场景。
6. volatile-random (Random eviction of keys with an expire set)
工作原理:
- 随机删除设置了过期时间的键。
适用场景:
- 当对键的访问模式不确定,或者不需要考虑访问频率和最近使用时间时,可以使用此策略。
7. allkeys-random (Random eviction of all keys)
工作原理:
- 随机删除任何键,无论是否设置了过期时间。
适用场景:
- 当对键的访问模式不确定,或者不需要考虑访问频率和最近使用时间时,可以使用此策略。
8. noeviction (Don’t evict anything, just return an error)
工作原理:
- 当内存达到上限且需要新增数据时,拒绝写入操作并返回错误,而不是删除已有数据。
适用场景:
- 适用于不允许数据丢失且愿意接受写操作失败的场景,通常在调试或严格数据保全要求下使用。
选择合适的内存淘汰策略需要考虑以下几个因素:
- 数据访问模式:数据是否经常访问,访问频率如何,是否需要保留最近访问的数据。
- 数据过期特性:数据是否有明确的过期时间,过期数据的处理优先级。
- 数据重要性:哪些数据是绝对不能丢失的,哪些数据可以容忍被临时淘汰。
- 系统资源:内存大小、CPU 负荷、磁盘空间等。
通过配置 Redis 的 maxmemory-policy
参数,可以设置所采用的内存淘汰策略。在实际应用中,应根据业务需求和数据特性进行选择和调整,以实现最优的内存使用效率和数据保留策略。