核心技巧:1. 使用Pipeline批量操作减少网络往返;2. 开启持久化AOF+RDB结合,避免内存全量dump;3. 设置合理的maxmemory-policy allkeys-lru;4. 避免大key,使用hash拆分;5. 监控bigkey和内存使用,及时清理;6. 主从复制+哨兵高可用,读写分离;7. 合理设置过期时间,防止内存爆炸。这些技巧能让系统响应快、内存稳。
来源1
Redis性能瓶颈主要出现在网络IO、内存管理和数据结构选择上。首先,网络IO是最大杀手,使用Pipeline可以批量发送命令,一次性处理多个操作,减少RTT时间。例如: pipeline = redis.pipeline() pipeline.set('key1', 'value1') pipeline.set('key2', 'value2') pipeline.execute() 这样能提升10倍以上性能。
来源2
内存消耗大的根源是大key和热点key。使用scan命令扫描bigkey:redis-cli --bigkeys,找到后拆分成多个小hash。比如一个用户数据key超过10MB,就拆成user:10001:info、user:10001:profile等。还可以设置key的过期时间,结合lazyfree-lazy-evict策略,释放内存不阻塞主线程。
来源3
持久化配置是关键,RDB全量快照适合冷备,AOF日志适合热备。推荐配置:save 900 1、save 300 10、save 60 10000,同时appendonly yes、appendfsync everysec。这样内存不会因为fork dump而暴涨,系统响应保持在毫秒级。
来源4
maxmemory设置至关重要,占服务器内存70%即可,eviction策略选allkeys-lru,能自动淘汰最近最少使用key。监控命令:info memory、memory usage key,实时查看使用率超过80%就警报。避免使用list或set存海量数据,转用有序集合或bitmap节省空间。
来源5
读写分离是实战利器,主库写,从库读。哨兵模式自动 failover,配置sentinel monitor mymaster 127.0.0.1 6379 2。客户端连接从库查询,热点数据预热到本地缓存,双保险响应更快。
来源6
慢查询优化:开启slowlog log-slow-reply,设置slowlog-log-slower-than 10000微秒,分析日志发现阻塞命令如keys *、smembers大set,替换成scan或hscan迭代器。参数调优tcp-keepalive yes、timeout 0、tcp-nodelay yes,减少空转连接。
来源7
数据结构选型影响性能,String存简单值,Hash存对象字段,List做队列但不超过5000元素,Set/ZSet做交并差。压缩大value用msgpack代替JSON,节省30%内存。集群模式下用一致性hash分片,避免单节点负载过高。
FAQ
Q: 系统突然变慢怎么快速排查?
A: 执行redis-cli monitor和slowlog get 10,检查bigkey和慢命令。
Q: 内存一直涨怎么处理?
A: 设置maxmemory和eviction策略,清理无过期key。
Q: Pipeline用多了会不会内存爆?
A: 控制每批100-500命令,及时execute。
Q: 主从延迟大怎么办?
A: 调大repl-backlog-size,优化网络带宽。