秘诀一:使用Pipeline批量操作命令,将多个命令打包成一个请求,大幅减少网络RTT时间;秘诀二:开启持久化AOF时选用no-appendfsync everysec策略,避免阻塞主线程;秘诀三:配置合理的maxmemory并启用allkeys-lru淘汰策略,控制内存使用防止OOM;秘诀四:单机部署时调大tcp-keepalive和timeout参数,优化连接持久性;秘诀五:部署多实例分片,使用一致性哈希路由请求,实现水平扩展,每秒QPS轻松破百万。
优化网络与连接
Redis的性能瓶颈往往在网络层面。启用tcp-nodelay可以禁用Nagle算法,减少延迟。设置timeout为0让连接永不超时,但要结合tcp-keepalive定期心跳。增大backlog参数支持更多待处理连接。实际测试中,这些调整让单机QPS从10万提升到50万。
内存管理技巧
maxmemory-policy选择volatile-lru或allkeys-lru,根据数据特性决定。避免bigkey,使用hash代替string存储大对象。开启lazyfree-lazy-evict,让删除异步化不阻塞主线程。监控info memory,及时调整maxmemory上限。
持久化配置
RDB快照适合全量备份,AOF日志更安全。save配置成900 1这种低频快照。appendfsync everysec是平衡点,不每命令fsync避免IO阻塞。混合持久化在4.0后默认开启,加载更快。
多线程与集群
Redis 6.0引入IO多线程,配置io-threads 4和io-threads-do-reads yes,CPU利用率飙升。生产环境用Redis Cluster分片,结合Proxy如Twemproxy。单节点压测用redis-benchmark -c 100 -n 1000000验证并发。
数据结构优化
用hash存储对象代替多个string,节省30%内存。sorted set或list代替频繁插入的集合。pipeline结合lua脚本原子执行多命令。避免keys *全遍历,用scan渐进式。
内核参数调优
Linux下sysctl vm.overcommit_memory=1允许超量分配。增大net.core.somaxconn=65535。ulimit -n 65535打开文件数。调整/proc/sys/net/ipv4/tcp_max_syn_backlog。这些让Redis扛住百万连接。
FAQ
Q: Pipeline怎么用?
A: 在客户端代码中用pipeline.multi()批量exec()提交。
Q: 为什么QPS不高?
A: 检查网络延迟、内存碎片、慢查询log。
Q: 集群怎么部署?
A: redis-cli --cluster create多节点,预分槽。
Q: 大key怎么避免?
A: 拆分成小hash,监控redis-cli --bigkeys。