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-serveryum 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 6380tls-cert-filetls-key-filetls-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:slavemaster_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 客户端连接方式

在业务代码里,使用类似 JedisRedissonlettuce 的库时,需要把 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 1save 300 10save 60 10000 已经足够。

- AOF:推荐使用 everysec,兼顾性能和数据安全。若对写入吞吐量要求极高,可改为 appendfsync no,但要自行承担最多 1 秒的数据丢失风险。

- 混合持久化(Redis 5.0+):在 aof-use-rdb-preamble yes 开启后,AOF 文件开头会先写一次 RDB,后续增量用 AOF 追加,启动速度会快很多。

4.3 网络与连接

- TCP backlogtcp-backlog 511 调大可以缓解瞬时并发。

- 超时时间timeout 300 防止空闲连接占用资源。

- 批量操作:尽量使用 MGETMSETPipeline,一次网络往返完成多条命令,延迟可以降低 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 环境。如果还有细节想聊,欢迎在评论区留言,我们一起探讨。祝部署顺利,系统稳如泰山!