2024-01-19 01:40:05
Redis数据过多内存占满时,默认不会直接宕机,但会触发内存淘汰策略或返回错误,具体行为取决于配置的淘汰策略。内存回收通过预设的淘汰策略实现,以下是详细说明:
一、内存占满时的行为默认策略(noeviction)
当内存达到maxmemory限制时,Redis会拒绝所有写请求(DEL和部分特殊请求除外),直接返回错误(如OOM command not allowed when used memory > maxmemory)。
此策略可避免数据丢失,但需外部监控及时扩容或清理数据。
其他策略
若配置了非noeviction策略(如LRU、LFU等),Redis会主动淘汰数据以释放内存,而非直接拒绝请求。
Redis提供6种内存淘汰策略,通过maxmemory-policy配置:
noeviction
默认策略,内存满时拒绝写请求,适用于允许短暂阻塞的场景。
volatile-lru
从设置了过期时间(TTL)的键中,使用LRU算法淘汰最近最少使用的键。
适用场景:需保留热点数据且允许过期键被淘汰。
allkeys-lru
从所有键中,使用LRU算法淘汰最近最少使用的键。
适用场景:需全局优化内存使用,无特殊过期需求。
volatile-random / allkeys-random
分别从设置了TTL的键或所有键中随机淘汰数据。
适用场景:无热点数据特征,需快速释放内存。
volatile-ttl
从设置了TTL的键中,优先淘汰剩余存活时间(TTL)最短的键。
适用场景:需加速过期键清理的场景。
LFU策略(Redis 4.0+)
volatile-lfu:从设置了TTL的键中,淘汰访问频率最低的键。
allkeys-lfu:从所有键中淘汰访问频率最低的键。
适用场景:需基于访问频率优化内存,避免偶发访问的键被误保留。
设置最大内存
通过配置文件:
maxmemory 100mb # 限制内存为100MB通过命令行:
config set maxmemory 100mb设置淘汰策略
通过配置文件:
maxmemory-policy allkeys-lru通过命令行:
config set maxmemory-policy allkeys-lru监控内存使用
使用INFO memory命令查看内存状态,关注以下字段:
used_memory:已用内存。
maxmemory:内存上限。
evicted_keys:累计淘汰的键数量。
示例输出:
used_memory:899504maxmemory:104857600evicted_keys:0近似LRU算法
Redis通过随机采样(默认5个键)模拟LRU,而非遍历所有键,以平衡性能与准确性。
可通过maxmemory-samples调整采样数量(如maxmemory-samples 10),数值越大越接近严格LRU。
Redis 3.0+优化:维护一个大小为16的候选池,按访问时间排序,淘汰最久未访问的键。
LFU算法
每个键记录24位访问频率和上次访问时间,频率每分钟衰减(避免长期不访问的键频率过高)。
适用场景:数据访问模式稳定,需长期保留高频键。
根据业务选择策略
缓存场景:优先选allkeys-lru或allkeys-lfu。
混合场景(含过期键):选volatile-lru或volatile-lfu。
随机访问:选allkeys-random或volatile-random。
合理设置maxmemory
建议设置为物理内存的50%-70%,避免系统交换(Swap)导致性能下降。
监控与告警
监控evicted_keys和used_memory,当淘汰键数量激增时及时扩容或优化策略。
避免noeviction陷阱
若未配置淘汰策略且内存占满,写请求会持续失败,需确保监控覆盖此场景。

通过合理配置内存上限和淘汰策略,Redis可在内存紧张时优雅降级,避免宕机风险。