防护措施:1. 配置maxmemory参数,设置Redis最大内存使用量;2. 配置maxmemory-policy eviction策略,如allkeys-lru;3. 监控内存使用情况,及时清理无用数据;4. 合理设计数据结构,避免大key;5. 设置key过期时间。兼顾性能和安全:使用volatile-lru策略,在有过期key时优先淘汰最近最少使用key,既节省内存又保持热点数据命中率高。
从源头避免内存溢出
1、maxmemory设置:生产环境一定要设置该参数,推荐设置为物理内存的80%以内,避免swap。2、内存淘汰策略:allkeys-lru(适用于数据都有过期时间)、volatile-lru(适用于数据部分有过期时间)、allkeys-random、volatile-random、volatile-ttl等。3、内存监控:使用info memory命令监控used_memory、used_memory_rss、mem_fragmentation_ratio等指标。
Redis内存优化方案
maxmemory-policy allkeys-lru:当内存达到maxmemory限制时,会把所有数据库中的key按照LRU算法来淘汰最近最少使用的数据。适合数据量大,需要保证最新访问的数据不被淘汰的场景,既安全又高性能。
实际配置示例
# 设置最大内存为2GB maxmemory 2gb # LRU 淘汰策略 maxmemory-policy allkeys-lru # 开启内存使用率统计 maxmemory-samples 5
Redis内存使用监控
使用redis-cli命令:INFO memory,关注used_memory_human(实际内存使用)、maxmemory_human(最大内存限制)、mem_fragmentation_ratio(内存碎片率,理想<1.5)。定期告警内存使用率>80%。
数据结构优化
1. String类型:value不要超过10M;2. Hash/List/Set:元素数量控制在10000以内;3. 避免大key,拆分成多个小key;4. 所有key设置合理的TTL过期时间。
综合防护策略
maxmemory-policy volatile-lru:只对设置了过期时间的key进行LRU淘汰,性能好且内存安全。如果没有过期key则不淘汰,防止OOM。结合慢查询监控和内存告警,实现性能与安全的平衡。
FAQ
Q: maxmemory-policy有哪些选项?
A: allkeys-lru, volatile-lru, allkeys-random, volatile-random, volatile-ttl, noeviction。
Q: 内存碎片怎么处理?
A: 重启Redis实例,或使用内存优化工具如jemalloc。
Q: 如何监控Redis内存?
A: 使用INFO memory命令,或Prometheus+Grafana监控。
Q: 什么情况下用allkeys-lru?
A: 数据量大,需要淘汰冷数据保持性能时。