Redis配置优化性能的核心方向与具体措施
内存是Redis的性能核心,合理的内存配置能有效避免OOM(Out of Memory)和频繁GC。
maxmemory参数设置Redis使用的最大内存(如4GB服务器可设为3gb,预留20%-30%给系统和其他进程),避免内存耗尽导致服务崩溃。maxmemory-policy:
allkeys-lru(淘汰最近最少使用的键);volatile-lru(仅对设置了过期时间的键淘汰);volatile-ttl(淘汰即将过期的键)。Hash替代多个String(如存储用户信息,将user:1:name、user:1:age合并为user:1的Hash字段,减少Key数量和内存开销);Ziplist编码(如hash-max-ziplist-entries 512、list-max-ziplist-size -2,降低内存占用);Stream(替代List,支持高效追加和消费)。activedefrag yes(Redis 4.0+)自动整理内存碎片,或定期用MEMORY PURGE手动清理(需谨慎,可能阻塞服务)。tcp-backlog(如tcp-backlog 2048),匹配系统net.core.somaxconn(如sysctl -w net.core.somaxconn=2048),避免高并发时连接队列溢出;timeout 300(空闲连接超时时间,秒),关闭长期闲置连接,释放资源;maxclients(如maxclients 10000),支持更多并发客户端。save策略(如save 3600 1,1小时内至少1次修改触发),减少频繁快照对性能的影响;启用rdbcompression yes(压缩RDB文件,节省磁盘空间);设置dbfilename dump.rdb和dir(指定保存路径)。appendfsync everysec(每秒同步一次,平衡性能与数据安全);启用aof-use-rdb-preamble yes(混合持久化,结合RDB的紧凑性和AOF的安全性);设置auto-aof-rewrite-percentage 100(AOF文件增长100%时重写)和auto-aof-rewrite-min-size 64mb(最小重写大小),避免频繁重写。io-threads 4(根据CPU核心数调整,通常为CPU核心数-1),io-threads-do-reads yes(启用多线程读),提升高并发下的吞吐量;jemalloc-bg-thread yes(默认开启),减少内存碎片整理对主线程的影响。MGET/MSET替代多次GET/SET(如批量获取10个键:MGET key1 key2 ... key10),降低网络延迟;使用Pipeline(如redis-cli --pipe)将多个命令打包发送,减少RTT(Round-Trip Time)。KEYS *(线性扫描所有Key,阻塞服务),用SCAN命令(增量遍历,如SCAN 0 COUNT 100,每次返回100个Key);设置slowlog-log-slower-than 10000(慢查询阈值,单位微秒,默认10毫秒),slowlog-max-len 128(慢查询日志最大长度),定期分析慢查询日志(SLOWLOG get),优化慢命令。replicaof <master-ip> <master-port>),将读请求分发到从节点,减轻主节点压力;设置replica-read-only yes(从节点只读),避免数据不一致。cluster-enabled yes),将数据分散到多个节点(至少3个主节点,每个主节点1个从节点),提升存储容量和并发处理能力;选择合适的分片策略(如一致性哈希),避免数据倾斜。INFO命令(如INFO memory查看内存使用、INFO clients查看客户端连接、INFO persistence查看持久化状态)监控关键指标;部署Prometheus+Grafana(收集redis_exporter数据),可视化监控内存、QPS、延迟等指标,及时发现异常。redis-cli --bigkeys找出内存占用大的Key(如超过10MB),拆分或优化;TTL(如EXPIRE key 3600,1小时过期),避免内存堆积;BGREWRITEAOF(如每天凌晨),压缩AOF文件大小,提升恢复速度。