Redis 是一种基于内存的键值存储系统,当内存不足时,需要通过 内存淘汰策略 来删除部分数据,以释放内存空间。Redis 提供了多种内存淘汰策略,可以根据业务需求进行配置。
1. Redis 内存淘汰策略的分类
Redis 的内存淘汰策略可以分为两类:
- 键空间淘汰策略:针对所有 key 进行淘汰。
- 过期键淘汰策略:针对设置了过期时间的 key 进行淘汰。
2. 键空间淘汰策略
键空间淘汰策略决定了当内存不足时,Redis 如何选择 key 进行删除。Redis 提供了 8 种键空间淘汰策略,可以通过配置文件中的 maxmemory-policy
参数设置。
2.1 noeviction(默认策略)
- 规则:当内存不足时,新写入操作会报错,不会删除任何 key。
- 适用场景:对数据一致性要求极高的场景,确保数据不会丢失。
2.2 allkeys-lru
- 规则:从所有 key 中,选择最近最少使用(Least Recently Used, LRU)的 key 进行删除。
- 适用场景:适合热点数据分布不均匀的场景。
2.3 volatile-lru
- 规则:从设置了过期时间的 key 中,选择最近最少使用(LRU)的 key 进行删除。
- 适用场景:适合对部分数据设置了过期时间的场景。
2.4 allkeys-random
- 规则:从所有 key 中,随机选择 key 进行删除。
- 适用场景:适合 key 的访问模式完全随机的场景。
2.5 volatile-random
- 规则:从设置了过期时间的 key 中,随机选择 key 进行删除。
- 适用场景:适合对部分数据设置了过期时间的场景。
2.6 volatile-ttl
- 规则:从设置了过期时间的 key 中,选择剩余生存时间(Time To Live, TTL)最短的 key 进行删除。
- 适用场景:适合优先淘汰即将过期的 key 的场景。
2.7 allkeys-lfu(Redis 4.0 引入)
- 规则:从所有 key 中,选择最不常用(Least Frequently Used, LFU)的 key 进行删除。
- 适用场景:适合访问频率差异较大的场景。
2.8 volatile-lfu(Redis 4.0 引入)
- 规则:从设置了过期时间的 key 中,选择最不常用(LFU)的 key 进行删除。
- 适用场景:适合对部分数据设置了过期时间的场景。
3. 过期键淘汰策略
过期键淘汰策略决定了 Redis 如何处理设置了过期时间的 key。Redis 提供了两种过期键淘汰策略,可以通过配置文件中的 maxmemory-policy
参数设置。
3.1 惰性删除(Lazy Expiration)
- 规则:当客户端访问某个 key 时,Redis 会检查该 key 是否已过期,如果过期则删除。
- 优点:节省 CPU 资源。
- 缺点:可能导致大量过期 key 堆积,占用内存。
3.2 定期删除(Active Expiration)
- 规则:Redis 会定期随机检查一部分设置了过期时间的 key,并删除已过期的 key。
- 优点:减少过期 key 的内存占用。
- 缺点:占用一定的 CPU 资源。
4. 如何选择内存淘汰策略?
选择内存淘汰策略时,需要根据业务场景和数据特点进行权衡:
- 数据一致性要求高:选择
noeviction
,确保数据不会丢失。 - 热点数据分布不均匀:选择
allkeys-lru
或allkeys-lfu
。 - 部分数据设置了过期时间:选择
volatile-lru
、volatile-lfu
或volatile-ttl
。 - key 访问模式随机:选择
allkeys-random
或volatile-random
。
5. 配置内存淘汰策略
在 Redis 配置文件 redis.conf
中,可以通过以下参数设置内存淘汰策略:
maxmemory <bytes> # 设置 Redis 最大内存限制
maxmemory-policy <policy> # 设置内存淘汰策略
例如:
maxmemory 1gb
maxmemory-policy allkeys-lru
6. 内存淘汰策略的注意事项
- 监控内存使用:通过
INFO memory
命令监控 Redis 的内存使用情况。 - 合理设置最大内存:根据服务器的物理内存和业务需求,合理设置
maxmemory
。 - 结合持久化策略:如果开启了持久化(如 RDB 或 AOF),需要确保内存淘汰策略不会影响数据的一致性。
总结
Redis 提供了多种内存淘汰策略,可以根据业务需求选择合适的策略:
- 默认策略:
noeviction
,确保数据不会丢失。 - LRU 策略:
allkeys-lru
和volatile-lru
,适合热点数据分布不均匀的场景。 - LFU 策略:
allkeys-lfu
和volatile-lfu
,适合访问频率差异较大的场景。 - 随机策略:
allkeys-random
和volatile-random
,适合 key 访问模式随机的场景。 - TTL 策略:
volatile-ttl
,适合优先淘汰即将过期的 key 的场景。
通过合理配置内存淘汰策略,可以有效管理 Redis 的内存使用,避免内存不足导致的性能问题。
THE END
暂无评论内容