Linux环境下Redis调优实践指南
内存是Redis的性能基石,不合理的内存使用会导致OOM(Out of Memory)、频繁swap或延迟飙升。
maxmemory参数限制Redis使用的最大内存(建议留出20%-30%给系统和其他进程),避免内存溢出。根据业务场景选择淘汰策略:若数据均有过期时间,用volatile-lru(从有过期时间的key中淘汰最近最少使用的);若部分数据无过期时间,用allkeys-lru(从所有key中淘汰最近最少使用的);若需优先保留即将过期的key,用volatile-ttl。hash-max-ziplist-entries 512、list-max-ziplist-size -2配置),降低内存碎片;统计场景用HyperLogLog(基数统计,误差≤0.81%)替代Set,节省大量内存。activedefrag yes(Redis 4.0+)自动整理内存碎片,或手动执行MEMORY PURGE(谨慎使用,可能阻塞);对长文本使用客户端压缩(如GZIP),存入Redis前压缩、读取后解压,减少内存占用。EXPIRE key 3600,1小时过期),避免内存无限堆积;调整active-expire-effort 100(0-100,值越大清理越频繁),提高过期键清理效率,避免后台清理占用过多CPU。Redis配置需结合业务场景(读/写密集型、数据量大小)和硬件资源(CPU、内存、磁盘)调整。
tcp-backlog(如511→65535),提高高并发下的连接队列容量;设置maxclients 10000(默认10000,可根据服务器资源调整),限制最大客户端连接数,避免连接过多导致资源耗尽;调整timeout 300(空闲连接超时时间,秒),关闭长期空闲连接,释放资源;设置tcp-keepalive 60(TCP保活间隔,秒),检测死连接,避免无效连接占用资源。save参数(如save 900 1、save 300 10、save 60 10000,分别表示900秒内至少1次写操作、5分钟内至少10次写操作、1分钟内至少10000次写操作触发快照);若对数据丢失容忍度高,可禁用RDB(save "");启用rdbcompression yes(压缩RDB文件,减少磁盘占用)、rdbchecksum yes(校验RDB文件完整性)。appendfsync everysec(折衷方案,每秒同步一次,数据丢失≤1秒),兼顾性能与安全性;若对数据安全性要求极高,用appendfsync always(每次写操作同步,性能下降明显);设置auto-aof-rewrite-percentage 100(AOF文件增长100%时重写)、auto-aof-rewrite-min-size 64mb(AOF文件≥64MB时重写),避免AOF文件过大导致重写耗时过长;启用aof-use-rdb-preamble yes(混合持久化),结合RDB的紧凑格式和AOF的增量命令,提高恢复速度和数据安全性。io-threads 4(IO线程数,通常为CPU核心数-1,如4核CPU设为3),启用io-threads-do-reads yes(启用多线程读),提高IO密集型场景的性能。客户端的操作方式直接影响Redis的性能,需优化命令使用和连接管理。
MGET、MSET)替代多个单命令,减少网络往返次数(RTT);启用Pipeline(将多个命令一次性发送给Redis,服务端依次执行后返回结果),进一步降低延迟(如Pipeline可将100个命令的延迟从100RTT降低到1-2RTT)。redis-cli --bigkeys扫描大Key,用rdb-tools分析RDB文件定位大Key,将其拆分为多个小Key;热Key(高频访问的Key,如某商品ID的库存)会导致单节点负载过高,用本地缓存(如Caffeine)缓存热Key,或通过分片将热Key分散到多个节点。KEYS *,会遍历所有Key,阻塞Redis),用SCAN替代(增量遍历,不阻塞);减少不必要的命令(如频繁执行EXISTS判断Key是否存在,可直接用GET并判断返回值)。持久化是Redis数据安全的关键,需根据业务需求选择合适的策略。
save ""、appendonly no),提高性能。aof-use-rdb-preamble yes),兼顾性能(AOF文件小)和数据安全性(RDB部分快速恢复)。save 900 1改为save 300 5,减少快照次数);AOF重写时,选择低峰期手动触发(BGREWRITEAOF),避免影响线上业务。vm.overcommit_memory 1(允许内存超额分配,避免fork操作失败)、禁用透明大页(echo never > /sys/kernel/mm/transparent_hugepage/enabled),减少fork操作的延迟。高并发场景下,需通过扩展和优化提高Redis的处理能力。
replicaof命令),将读请求分发到从节点(slave-read-only yes),减轻主节点的压力;主节点负责写请求,从节点同步主节点的数据(repl-diskless-sync yes,无盘复制,减少磁盘IO)。EVAL命令)保证原子性(脚本执行过程中不会被其他命令打断),减少网络往返次数(脚本一次性发送给Redis执行)。taskset -c 0,1 redis-server),提高CPU缓存的命中率;对于NUMA架构的系统,调整内存分配策略(如numactl --cpunodebind=0 --membind=0 redis-server),减少跨节点内存访问的延迟。监控是发现性能问题的关键,需定期监控关键指标并及时处理。
INFO命令或监控工具(如Prometheus+Grafana、RedisInsight)监控以下指标:
used_memory(已用内存)、used_memory_rss(物理内存占用)、mem_fragmentation_ratio(内存碎片率,>1.5需整理);instantaneous_ops_per_sec(每秒操作数,判断QPS是否过高)、latency(延迟,判断响应时间是否过长);connected_clients(当前连接数,是否超过maxclients)、rejected_connections(被拒绝的连接数,判断连接池是否充足);rdb_last_save_time(上次RDB保存时间)、aof_last_bgrewrite_status(上次AOF重写状态)。slowlog-log-slower-than 10000(慢查询阈值,单位微秒,默认10毫秒)、slowlog-max-len 128(慢查询日志最大长度),用SLOWLOG GET命令查看慢查询,优化慢查询(如将KEYS *改为SCAN、拆分大Key)。redis-check-rdb检查RDB文件、redis-check-aof修复AOF文件);定期重启Redis(如每月一次),清理内存碎片(active-defrag yes自动清理,或手动MEMORY PURGE)。