
Redis源码编译安装全流程
从官网下载最新稳定版源码包,解压后进入目录。编译前先装好gcc、make等基础工具链,CentOS用yum install -y gcc make
,Ubuntu用apt-get install build-essential
。关键编译参数别漏掉:
make MALLOC=libc
指定内存分配器make PREFIX=/opt/redis install
自定义安装路径make test
跑完所有单元测试再部署编译出错常见于依赖缺失,比如遇到jemalloc.h not found
就补装jemalloc-devel
包。装完后记得把src/
下的redis-server、redis-cli等二进制文件拷到系统PATH路径。
核心配置参数调优指南
redis.conf里这几个参数直接影响性能:
参数 | 默认值 | 生产环境 |
---|---|---|
maxmemory | 0(无限制) | 物理内存的70%-80% |
tcp-backlog | 511 | 与系统somaxconn保持一致 |
timeout | 0(永不超时) | 300-600秒防僵死连接 |
内存碎片率超过1.5就得警惕,用INFO memory
监控时重点看mem_fragmentation_ratio
指标。大key问题用redis-cli bigkeys
扫描,超过10KB的string或100个元素的hash/list都算风险点。
持久化与高可用实战技巧
RDB和AOF混合使用最稳妥:
save 900 1
这种规则时,至少保证15分钟-1小时级别的备份频率auto-aof-rewrite-percentage 100
配合auto-aof-rewrite-min-size 64mb
repl-backlog-size
设为内存的10%-20%遇到性能瓶颈先看慢查询日志,slowlog-log-slower-than 10000
表示记录超过10ms的命令。批量操作记得用pipeline,网络往返次数能降90%以上。集群模式下节点数控制在6-12个最合理,超过16个反而影响 gossip 协议效率。
主从复制延迟这事儿,说白了就是数据从主库传到从库的速度跟不上。首先得把repl-backlog-size
这个缓冲区调大点,一般设成主库内存的10%-20%比较合适。比如你主库有16GB内存,缓冲区就设个2GB-3GB,这样即使网络有点波动,从库也能从缓冲区里捞数据,不至于动不动就全量同步。repl-timeout
也别抠搜,60-120秒这个范围比较保险,特别是跨机房的场景,网络延迟大点也能扛住。
要是发现从库老是在做全量同步,那八成是client-output-buffer-limit
设小了。这个参数控制主库给从库发数据的缓冲区大小,生产环境 给replica
类型调大到1GB-2GB。还有个隐藏的坑是主库的repl-backlog-ttl
,默认1小时其实有点短,碰到从库维护或者网络故障,缓冲区数据可能还没等从库连上就被清了,这时候可以适当延长到2-4小时。平时多盯着点INFO replication
里的lag
指标,延迟超过30秒就得赶紧查了。
常见问题解答
编译Redis时出现”jemalloc.h not found”错误怎么办?
这是缺少jemalloc内存管理库导致的,CentOS/RHEL系统执行yum install jemalloc-devel
,Ubuntu/Debian系统执行apt-get install libjemalloc-dev
。如果仍需要libc分配器,可强制指定make MALLOC=libc
参数编译。
生产环境Redis内存应该设置多大?
设置为物理内存的70%-80%,需要保留20%-30%内存给系统和其他进程。通过maxmemory 8gb
这样的配置指定,注意单位可以是kb、mb、gb。同时要设置maxmemory-policy
定义淘汰策略。
如何监控Redis内存碎片情况?
使用INFO memory
命令查看mem_fragmentation_ratio
指标,1.0-1.5属于正常范围,超过1.5 重启实例或通过MEMORY PURGE
命令主动清理。长期偏高可能需要调整activedefrag
相关参数。
Redis性能突然下降该如何排查?
先检查slowlog get 10
查看最近慢查询,再用INFO commandstats
分析命令耗时。网络问题可查看redis-cli latency
,内存问题关注used_memory
是否接近maxmemory
。 配置slowlog-log-slower-than 10000
记录10ms以上操作。
主从复制延迟大怎么优化?
增大repl-backlog-size
到内存的10%-20%,提升repl-timeout
到60-120秒。检查主节点INFO replication
的repl_backlog_active
状态,如果从节点频繁全量同步,可能需要调大client-output-buffer-limit
。