前言

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 yes

2.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 redis

2.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 -p

4.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 777

4.3 内存优化

# 设置合理的内存淘汰策略
# volatile-lru:只淘汰设置了过期时间的 key
# allkeys-lru:淘汰所有 key 中最近最少用的(推荐缓存场景)
# volatile-ttl:淘汰即将过期的 key
# noeviction:不淘汰,写满就报错

maxmemory-policy allkeys-lru

# 小哈希优化
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

4.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 replication

5.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

  1. 设置强密码:requirepass,至少 16 位混合字符
  2. 绑定内网 IP:bind 不要用 0.0.0.0,用内网地址
  3. 改名危险命令:rename-command FLUSHDB "",rename-command FLUSHALL ""
  4. 限制访问来源:iptables/firewalld 只允许应用服务器 IP
  5. 禁用危险命令:rename-command CONFIG "",rename-command DEBUG ""
  6. 使用非默认端口:改掉 6379,减少扫描风险
  7. 定期更新版本:关注 CVE 漏洞,及时升级

总结

Redis 部署的核心要点:

  • 安装:编译安装 > yum 安装,systemd 管理
  • 持久化:RDB + AOF 双保险
  • 优化:关 THP、调 overcommit_memory、管道批量操作
  • 高可用:主从 + 哨兵是标配,Cluster 是大规模方案
  • 安全:密码、内网绑定、危险命令改名三件套

掌握这些,日常 Redis 运维基本够用了。

<hr/>

标签:Redis、缓存服务、性能优化、高可用、IDC运维实战