前言
Redis 是 IDC 运维中最常用的缓存和内存数据库。不管是做 Session 共享、接口缓存、消息队列还是排行榜,Redis 几乎无处不在。今天这篇从安装部署讲起,一路到性能调优和常见故障处理,适合需要自己搭 Redis 服务的运维同学。
一、Redis 简介与适用场景
Redis(Remote Dictionary Server)是一个基于内存的键值存储系统,支持多种数据结构。
| 数据结构 | 典型场景 |
|---|---|
| String(字符串) | 缓存 JSON、计数器、分布式锁 |
| Hash(哈希) | 存储对象(用户信息、商品详情) |
| List(列表) | 消息队列、最新消息列表 |
| Set(集合) | 标签、共同好友、去重 |
| Sorted Set(有序集合) | 排行榜、延迟队列、优先级队列 |
| Stream | 消息队列(Redis 5.0+) |
| Bitmap / HyperLogLog | 签到统计、UV 统计 |
二、Redis 安装部署
2.1 编译安装(推荐)
# 安装依赖
yum install -y gcc make wget
# 下载最新稳定版(以 7.2 为例)
cd /usr/local/src
wget https://download.redis.io/releases/redis-7.2.5.tar.gz
tar xzf redis-7.2.5.tar.gz
cd redis-7.2.5
# 编译(-j$(nproc) 利用多核加速)
make -j$(nproc)
# 安装到指定目录
make PREFIX=/usr/local/redis install
# 创建配置目录
mkdir -p /usr/local/redis/{conf,data,logs}2.2 基础配置
cp /usr/local/src/redis-7.2.5/redis.conf /usr/local/redis/conf/
vim /usr/local/redis/conf/redis.conf重点配置项:
# 网络
bind 0.0.0.0 # 监听所有网卡(生产环境建议内网IP)
port 6379
protected-mode yes # 开启保护模式
# 安全(强烈建议设置密码!)
requirepass YourStrongPassword123
# 持久化
dir /usr/local/redis/data
logfile /usr/local/redis/logs/redis.log
# 内存
maxmemory 2gb # 最大内存限制
maxmemory-policy allkeys-lru # 内存满后的淘汰策略
# 后台运行
daemonize yes2.3 创建 systemd 服务
cat > /etc/systemd/system/redis.service << 'EOF'
[Unit]
Description=Redis Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -a YourStrongPassword123 shutdown
Restart=always
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
EOF
# 创建 redis 用户
useradd -r -s /sbin/nologin redis
chown -R redis:redis /usr/local/redis
# 启动
systemctl daemon-reload
systemctl start redis
systemctl enable redis
systemctl status redis2.4 验证安装
# 本地连接
/usr/local/redis/bin/redis-cli -a YourStrongPassword123
# 测试
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> INFO server
127.0.0.1:6379> SET test "hello redis"
OK
127.0.0.1:6379> GET test
"hello redis"三、Redis 持久化——别让数据丢了
RDB(快照)
定时把内存数据快照保存到磁盘,适合备份和灾难恢复。
# redis.conf 配置
save 900 1 # 900秒内至少1次修改就触发
save 300 10 # 300秒内至少10次修改
save 60 10000 # 60秒内至少10000次修改
dbfilename dump.rdb优点:恢复快、文件紧凑
缺点:可能丢失最后一次快照后的数据
AOF(追加日志)
记录每一条写命令,数据安全性更高。
appendonly yes
appendfsync everysec # 每秒同步一次(推荐)
# appendfsync always # 每条都同步(最安全但最慢)
# appendfsync no # 交给操作系统(可能丢数据)生产建议:RDB + AOF 同时开启,RDB 做冷备,AOF 保数据安全。
四、Redis 性能优化——压榨每一滴性能
4.1 系统层面优化
# 关闭透明大页(THP)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 写入 rc.local 永久生效
cat >> /etc/rc.local << 'EOF'
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
EOF
# 调整内核参数
cat >> /etc/sysctl.conf << 'EOF'
# Redis 优化
net.core.somaxconn = 65535
vm.overcommit_memory = 1
EOF
sysctl -p4.2 Redis 配置优化
# 禁用或延长慢查询日志
slowlog-log-slower-than 10000 # 超过10毫秒记录(微秒单位)
# 客户端连接数
maxclients 10000
# TCP backlog
tcp-backlog 511
# 关闭 TCP keepalive(高并发场景)
tcp-keepalive 0
# 使用 unix socket(同机访问性能最优)
# unixsocket /tmp/redis.sock
# unixsocketperm 7774.3 内存优化
# 设置合理的内存淘汰策略
# volatile-lru:只淘汰设置了过期时间的 key
# allkeys-lru:淘汰所有 key 中最近最少用的(推荐缓存场景)
# volatile-ttl:淘汰即将过期的 key
# noeviction:不淘汰,写满就报错
maxmemory-policy allkeys-lru
# 小哈希优化
hash-max-ziplist-entries 512
hash-max-ziplist-value 644.4 管道(Pipeline)批量操作
# 传统方式:10000 次网络往返
for i in $(seq 1 10000); do
redis-cli SET key_$i value_$i
done
# Pipeline 方式:1 次网络往返
for i in $(seq 1 10000); do
echo "SET key_$i value_$i"
done | redis-cli --pipe性能差异:Pipeline 比逐条发送快 10-100 倍。
五、Redis 主从复制与哨兵
5.1 配置主从复制
# 从节点配置
replicaof 192.168.1.100 6379
masterauth YourStrongPassword123
# 查看复制状态
redis-cli -a YourStrongPassword123 INFO replication5.2 哨兵模式(Sentinel)
哨兵实现自动故障转移,是 Redis 高可用的标配。
# sentinel.conf
port 26379
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster YourStrongPassword123
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1# 启动哨兵
redis-sentinel /usr/local/redis/conf/sentinel.conf
# 或者用 redis-server --sentinel
redis-server /usr/local/redis/conf/sentinel.conf --sentinel六、Redis 监控与慢查询分析
# 查看关键指标
redis-cli -a password INFO stats # 命中率、连接数
redis-cli -a password INFO memory # 内存使用
redis-cli -a password INFO replication # 主从状态
redis-cli -a password INFO clients # 客户端连接
# 慢查询日志
redis-cli -a password SLOWLOG GET 10 # 最近10条慢查询
redis-cli -a password SLOWLOG LEN # 慢查询数量
redis-cli -a password SLOWLOG RESET # 清空慢查询日志
# 实时监控
redis-cli -a password --stat # 实时统计
redis-cli -a password MONITOR # 实时查看所有命令(生产慎用)七、常见故障排查
问题一:连接被拒绝
# 检查 bind 配置
grep bind /usr/local/redis/conf/redis.conf
# 检查保护模式
grep protected-mode /usr/local/redis/conf/redis.conf
# 检查防火墙
iptables -L -n | grep 6379
firewall-cmd --list-ports问题二:内存满了写入失败
# 查看当前策略
redis-cli -a password CONFIG GET maxmemory-policy
# 临时改为 allkeys-lru
redis-cli -a password CONFIG SET maxmemory-policy allkeys-lru
# 永久修改需改配置文件问题三:延迟突然变高
# 测量延迟
redis-cli -a password --latency
redis-cli -a password --latency-history
# 常见原因:
# 1. 慢查询(检查 SLOWLOG)
# 2. AOF rewrite / RDB save 正在进行
# 3. 内存交换到磁盘(检查 used_memory_rss vs used_memory)
# 4. 网络问题问题四:主从同步延迟
# 从节点查看偏移量
redis-cli -a password INFO replication | grep master_repl_offset
# 主节点也查一次,对比差值
# 解决方案:
# 1. 检查网络带宽
# 2. 增加 repl-backlog-size
# 3. 如果差距太大,考虑全量重同步八、安全加固 checklist
- 设置强密码:requirepass,至少 16 位混合字符
- 绑定内网 IP:bind 不要用 0.0.0.0,用内网地址
- 改名危险命令:rename-command FLUSHDB "",rename-command FLUSHALL ""
- 限制访问来源:iptables/firewalld 只允许应用服务器 IP
- 禁用危险命令:rename-command CONFIG "",rename-command DEBUG ""
- 使用非默认端口:改掉 6379,减少扫描风险
- 定期更新版本:关注 CVE 漏洞,及时升级
总结
Redis 部署的核心要点:
- 安装:编译安装 > yum 安装,systemd 管理
- 持久化:RDB + AOF 双保险
- 优化:关 THP、调 overcommit_memory、管道批量操作
- 高可用:主从 + 哨兵是标配,Cluster 是大规模方案
- 安全:密码、内网绑定、危险命令改名三件套
掌握这些,日常 Redis 运维基本够用了。
<hr/>
标签:Redis、缓存服务、性能优化、高可用、IDC运维实战
评论