Redis 部署与调优实战
大家好,今天想跟你们聊聊我在生产环境里部署 Redis 的一些实战经验。从零开始装机器,到后面调优、监控,我把踩过的坑和常用的技巧都整理成这篇博客,希望能帮到正在准备上线 Redis 的同学。
---1. 环境准备与安装
1.1 系统要求
- 系统:推荐 CentOS 7/8、Ubuntu 20.04 或 Debian 11。
- 内核:≥ 3.10(支持 THP、透明大页等特性)。
- 依赖:gcc、make、tcl(用于跑单元测试)。
1.2 快速编译安装
# 下载最新稳定版(写作时 7.2.1)
wget http://download.redis.io/redis-7.2.1.tar.gz
tar xzf redis-7.2.1.tar.gz
cd redis-7.2.1
编译
make -j$(nproc) MALLOC=jemalloc
跑完测试(可选)
make test
安装到 /usr/local/redis
make PREFIX=/usr/local/redis install
如果你不想自己编译,也可以直接用发行版的包管理(apt-get install redis-server 或 yum install redis),但手动编译可以更灵活地打开某些特性(比如 TLS、ACL)。
1.3 目录结构建议
/usr/local/redis/
├── bin/ # redis-server、redis-cli 等可执行文件
├── conf/ # 配置文件
├── data/ # 持久化文件(RDB、AOF)
├── log/ # 日志
└── run/ # pid 文件
把数据、日志、配置文件分开放,后面做迁移或升级时会省很多事。
---2. 基础配置与安全加固
2.1 关键配置项
下面是一份我在生产环境常用的 redis.conf,只保留最核心的参数,注释已经说明作用:
# 绑定网卡,只允许内网访问
bind 10.0.0.10
端口
port 6379
后台运行
daemonize yes
pid、log、data 路径
pidfile /usr/local/redis/run/redis.pid
logfile /usr/local/redis/log/redis.log
dir /usr/local/redis/data
内存上限(根据机器实际 RAM 设定,防止 OOM)
maxmemory 8gb
maxmemory-policy allkeys-lru
持久化方式:混合 RDB + AOF
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
慢查询日志(超过 10ms 记录)
slowlog-log-slower-than 10000
slowlog-max-len 128
客户端最大连接数
maxclients 10000
2.2 安全加固技巧
1. 设置密码:使用 requirepass your_strong_password。
2. 禁用危险命令:在 redis.conf 里加入 rename-command FLUSHDB ""、rename-command FLUSHALL ""、rename-command CONFIG "" 等。
3. 开启 TLS(如果对外提供 API):tls-port 6380、tls-cert-file、tls-key-file、tls-ca-cert-file。
4. 防火墙:只放行业务机器的 IP,iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 6379 -j ACCEPT。
这样一套下来,基本可以避免大多数误操作和外部攻击。
---3. 高可用方案:主从 + Sentinel
单点 Redis 在生产环境里风险太大,我一般会加上 主从复制 + Sentinel 自动故障转移。下面把步骤拆解成几个关键点。
3.1 主从配置
在 从节点 的 redis.conf 中加入:
replicaof 10.0.0.10 6379
replica-serve-stale-data yes
replica-read-only yes
启动后,用 redis-cli -h 10.0.0.20 info replication 检查状态,应该能看到 role:slave、master_link_status:up。
3.2 Sentinel 监控
Sentinel 本质上是一个特殊的 Redis 进程,负责:
- 监控主从是否活着。
- 在主节点故障时自动提升从节点为新的主。
- 通知客户端新主节点地址。
一份最简单的 sentinel.conf 如下:
port 26379
sentinel monitor mymaster 10.0.0.10 6379 2 # 2 表示至少 2 个 Sentinel 同意才做故障转移
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster your_strong_password
启动 Sentinel:
redis-sentinel /usr/local/redis/conf/sentinel.conf
3.3 客户端连接方式
在业务代码里,使用类似 Jedis、Redisson、lettuce 的库时,需要把 Sentinel 的地址列表配置进去,库会自动从 Sentinel 拉取当前的主节点 IP。示例(Jedis):
Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("10.0.0.21:26379");
sentinelSet.add("10.0.0.22:26379");
sentinelSet.add("10.0.0.23:26379");
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinelSet, new JedisPoolConfig());
这样即使主节点宕机,Sentinel 把从节点升为主,客户端也能无缝切换。
---4. 性能调优实战
4.1 内存优化
- 选择合适的淘汰策略:allkeys-lru 是最常用的,适合缓存场景。如果业务对所有键都有访问频率区分,可以改成 volatile-lru(只对带 TTL 的键生效)。
- 大键排查:使用 redis-cli --bigkeys 定期扫描,找出体积异常的键,及时拆分或压缩。
- 内存碎片:如果 used_memory_rss 远高于 used_memory,可以考虑在低峰期重启 Redis,或使用 activedefrag yes(需要开启 Jemalloc)。
4.2 持久化调优
- RDB:适合做冷备,频率不宜太高。默认的 save 900 1、save 300 10、save 60 10000 已经足够。
- AOF:推荐使用 everysec,兼顾性能和数据安全。若对写入吞吐量要求极高,可改为 appendfsync no,但要自行承担最多 1 秒的数据丢失风险。
- 混合持久化(Redis 5.0+):在 aof-use-rdb-preamble yes 开启后,AOF 文件开头会先写一次 RDB,后续增量用 AOF 追加,启动速度会快很多。
4.3 网络与连接
- TCP backlog:tcp-backlog 511 调大可以缓解瞬时并发。
- 超时时间:timeout 300 防止空闲连接占用资源。
- 批量操作:尽量使用 MGET、MSET、Pipeline,一次网络往返完成多条命令,延迟可以降低 3–5 倍。
4.4 慢查询日志
开启慢查询后,用 SLOWLOG GET 10 查看最近的慢命令。常见瓶颈:
- KEYS *:全表扫描,生产环境严禁使用,改用 SCAN。
- 大键的 DEL:大键删除会阻塞,改用 UNLINK(异步删除)。
5. 监控与运维实践
5.1 关键指标
| 指标 | 含义 | 告警阈值 |
|------|------|----------|
| used_memory_human | 实际占用内存 | > 80% maxmemory |
| instantaneous_ops_per_sec | 每秒命令数 | 持续 > 8k(视业务定) |
| connected_clients | 当前连接数 | > 90% maxclients |
| replication_lag | 主从同步延迟 | > 5s |
| slowlog_len | 慢查询堆积数 | > 50 |
5.2 监控方案
- Prometheus + redis_exporter:最通用的方案。redis_exporter 会把 Redis 的所有 INFO 指标暴露为 Prometheus 格式,配合 Grafana 看板,一目了然。
- Redis Insight:官方提供的 GUI,实时查看键分布、内存使用、慢查询,调试时非常方便。
5.3 常用运维命令
# 查看实时 QPS
redis-cli INFO stats | grep instantaneous_ops_per_sec
查看当前大键(扫描时间可能较长,建议在低峰跑)
redis-cli --bigkeys
手动触发 RDB 备份
redis-cli BGSAVE
手动切换主从(紧急情况下使用)
redis-cli CLUSTER FAILOVER
小结
今天把 Redis 从安装、基础配置、高可用搭建、性能调优到监控运维的全流程都过了一遍。重点记住:
1. 安全第一:密码、命令重命名、防火墙。
2. 高可用:主从 + Sentinel 是最省事的方案,配合客户端的 Sentinel 支持实现自动故障转移。
3. 调优:内存淘汰策略、持久化方式、网络参数、慢查询监控,这些细节往往决定了线上系统的稳定性。
4. 监控:用 Prometheus + redis_exporter 把关键指标可视化,及时发现瓶颈。
希望这篇文章能帮你快速搭建起一套可靠、易维护的 Redis 环境。如果还有细节想聊,欢迎在评论区留言,我们一起探讨。祝部署顺利,系统稳如泰山!
Redis 部署与调优实战
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法