数据存储工具 ——Redis
一、Redis 技术概述
1.1 定义与定位
Redis(Remote Dictionary Server)是一款开源的高性能键值对数据库,基于内存存储,支持多种数据结构,提供持久化、高可用、分布式等企业级特性。它本质是 “内存数据库 + 持久化机制” 的结合体,既具备内存操作的毫秒级响应速度,又通过持久化保障数据不丢失,广泛应用于互联网架构的缓存、会话存储、消息队列等核心场景。
1.2 核心优势
优势 | 说明 |
极致性能 | 单节点 QPS 可达 10 万 +,平均响应延迟 1-5ms,基于内存操作 + IO 多路复用模型 |
丰富数据结构 | 支持 String、Hash、List、Set、Sorted Set、BitMap、HyperLogLog 等 8 种核心结构 |
灵活持久化 | 支持 RDB(快照)和 AOF(日志)两种模式,可单独或混合使用 |
高可用架构 | 哨兵模式实现故障自动切换,集群模式支持水平扩展(最大 1000 节点) |
跨平台与易用性 | 支持 Linux/macOS/Windows(生产不推荐 Windows),命令简洁,文档完善 |
扩展特性丰富 | 内置事务、Lua 脚本、发布订阅、地理空间查询、过期淘汰等功能 |
1.3 典型应用场景
二、环境准备与安装
2.1 环境要求
2.1.1 硬件要求
部署模式 | CPU | 内存 | 磁盘 | 网络 |
单机模式 | ≥1 核 | ≥1GB | ≥20GB(SSD) | 本地 / 内网访问 |
哨兵模式 | 每节点 ≥1 核 | 每节点 ≥2GB | 每节点 ≥20GB | 节点间千兆互通 |
集群模式 | 每节点 ≥2 核 | 每节点 ≥4GB | 每节点 ≥50GB | 节点间低延迟互通 |
2.1.2 软件要求
- 操作系统:推荐 CentOS 7/8、Ubuntu 20.04/22.04(内核 ≥3.2)
- 依赖工具:gcc(≥4.8)、gcc-c++、tcl(单元测试)、make
- 禁用组件:SELinux(生产环境建议关闭)、防火墙(需开放指定端口)
2.2 安装方式(以 CentOS 7 为例)
2.2.1 源码编译安装(推荐,自定义程度高)
# 1. 安装依赖
sudo yum install -y gcc gcc-c++ tcl make# 2. 下载源码(官网稳定版 7.2.4)
cd /usr/local/src
sudo wget https://download.redis.io/releases/redis-7.2.4.tar.gz# 3. 解压与编译
sudo tar -zxvf redis-7.2.4.tar.gz
cd redis-7.2.4
sudo make PREFIX=/usr/local/redis install # 指定安装目录# 4. 复制配置文件
sudo mkdir -p /usr/local/redis/conf
sudo cp redis.conf /usr/local/redis/conf/
sudo cp sentinel.conf /usr/local/redis/conf/ # 哨兵配置(高可用用)# 5. 验证安装(查看二进制文件)
ls /usr/local/redis/bin/ # 应包含 redis-server、redis-cli、redis-sentinel
2.2.2 包管理器安装(快速部署,适合测试)
# CentOS 需先装 EPEL 源
sudo yum install -y epel-release
sudo yum install -y redis# Ubuntu 直接安装
sudo apt update && sudo apt install -y redis-server
2.3 安装验证
# 前台启动 Redis(验证基础功能)
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf# 新终端连接客户端
/usr/local/redis/bin/redis-cli
127.0.0.1:6379> PING # 输出 PONG 表示成功
127.0.0.1:6379> QUIT # 退出客户端# 按 Ctrl+C 停止前台服务,准备配置后台运行
三、核心配置(单机模式)
3.1 配置文件路径
- 源码安装:/usr/local/redis/conf/redis.conf
- 包管理器安装:CentOS(/etc/redis.conf)、Ubuntu(/etc/redis/redis.conf)
3.2 关键配置项(生产环境必改)
3.2.1 基础运行配置
# 1. 网络配置
bind 0.0.0.0 # 允许所有IP访问(生产建议指定内网IP,如 192.168.1.100)
protected-mode no # 关闭保护模式(需配合密码使用)
port 6379 # 服务端口(默认 6379,可自定义避免冲突)# 2. 运行模式
daemonize yes # 后台守护进程运行
pidfile /var/run/redis_6379.pid # PID 文件路径
logfile /var/log/redis/redis.log # 日志路径(需先创建目录:mkdir -p /var/log/redis)
dir /var/lib/redis # 数据持久化文件存储目录(mkdir -p /var/lib/redis)
3.2.2 安全配置
# 设置连接密码(客户端需用 AUTH 验证)
requirepass YourStrongPass@2024 # 密码建议:大小写+数字+特殊字符,长度≥8位# 禁用危险命令(防止误操作或攻击)
rename-command CONFIG "" # 禁用修改配置命令
rename-command FLUSHDB "" # 禁用清空当前库命令
rename-command FLUSHALL "" # 禁用清空所有库命令
rename-command KEYS "" # 禁用全量键查询(生产环境慎用)
3.2.3 持久化配置(RDB+AOF 混合)
# ---------------- RDB 配置(快照持久化)----------------
save 900 1 # 900秒内1次修改触发快照
save 300 10 # 300秒内10次修改触发快照
save 60 10000 # 60秒内10000次修改触发快照
dbfilename dump.rdb # RDB 文件名
stop-writes-on-bgsave-error yes # 快照失败时停止写入(防数据不一致)
rdbcompression yes # 开启 RDB 压缩(节省空间)# ---------------- AOF 配置(日志持久化)----------------
appendonly yes # 开启 AOF(默认关闭,生产必开)
appendfilename "appendonly.aof" # AOF 文件名
appendfsync everysec # 每秒同步(性能与安全平衡,推荐)
# appendfsync always # 每次写入同步(最安全,性能最低)
# appendfsync no # 操作系统自动同步(性能最高,不安全)# AOF 重写配置(避免文件过大)
auto-aof-rewrite-percentage 100 # 比上次重写增大100%触发
auto-aof-rewrite-min-size 64mb # 最小64MB才触发重写
aof-load-truncated yes # AOF 文件损坏时截断并继续加载
3.2.4 内存优化配置
maxmemory 4gb # 最大使用内存(根据物理机调整,如 4GB)
maxmemory-policy volatile-lru # 内存满时淘汰策略:过期键中最近最少使用
# 其他策略:allkeys-lru(所有键LRU)、volatile-ttl(快过期键优先)
maxmemory-samples 5 # 淘汰采样数量(值越大越精准,CPU消耗越高)
3.3 服务启停与开机自启
3.3.1 创建系统服务
sudo vim /usr/lib/systemd/system/redis.service
写入以下内容:
[Unit]
Description=Redis In-Memory Data Store
After=network.target[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -a YourStrongPass@2024 shutdown
Restart=always # 服务异常自动重启[Install]
WantedBy=multi-user.target
3.3.2 服务操作
# 重载服务配置
sudo systemctl daemon-reload# 启动服务
sudo systemctl start redis# 查看状态(active (running) 为正常)
sudo systemctl status redis# 开机自启
sudo systemctl enable redis# 停止服务
sudo systemctl stop redis
四、日常运维核心操作
4.1 客户端连接与基础命令
4.1.1 连接方式
# 本地连接(带密码)
redis-cli -a YourStrongPass@2024# 远程连接(指定 IP、端口)
redis-cli -h 192.168.1.100 -p 6379 -a YourStrongPass@2024# 无密码连接后认证
redis-cli -h 192.168.1.100 -p 6379
192.168.1.100:6379> AUTH YourStrongPass@2024
OK
4.1.2 常用命令(按功能分类)
功能 | 命令示例 | 说明 |
数据操作 | SET name "Redis"、GET name | String 类型设置 / 获取值 |
HSET user:1 name "Alice" age 25 | Hash 类型设置字段 | |
LPUSH list1 "a" "b"、LRANGE list1 0 -1 | List 类型左推 / 获取所有元素 | |
服务监控 | INFO | 查看服务完整信息(内存、连接、持久化) |
INFO memory | 仅查看内存使用情况 | |
CLIENT LIST | 查看客户端连接列表 | |
配置管理 | CONFIG GET maxmemory | 获取配置项值 |
CONFIG SET timeout 300 | 临时修改配置(重启失效) | |
数据管理 | KEYS * | 匹配所有键(生产慎用,阻塞服务) |
DBSIZE | 查看当前库键数量 | |
FLUSHDB | 清空当前数据库(危险,需禁用) |
4.2 数据备份与恢复
4.2.1 手动备份(基于 RDB)
# 1. 后台生成 RDB 快照(不阻塞服务)
redis-cli -a YourStrongPass@2024 BGSAVE# 2. 查看备份文件(默认在 /var/lib/redis/dump.rdb)
ls -lh /var/lib/redis/dump.rdb# 3. 备份到安全目录(如远程服务器)
sudo cp /var/lib/redis/dump.rdb /backup/redis/dump_$(date +%Y%m%d).rdb
4.2.2 数据恢复
# 1. 停止 Redis 服务
sudo systemctl stop redis# 2. 替换 RDB 文件(将备份文件复制到数据目录)
sudo cp /backup/redis/dump_20240520.rdb /var/lib/redis/dump.rdb# 3. 修复文件权限(确保 Redis 有权访问)
sudo chown redis:redis /var/lib/redis/dump.rdb# 4. 启动服务,自动加载 RDB
sudo systemctl start redis# 5. 验证恢复结果
redis-cli -a YourStrongPass@2024 KEYS *
4.3 性能监控与问题排查
4.3.1 内置监控工具
# 1. 实时监控命令执行(每秒刷新)
redis-cli -a YourStrongPass@2024 MONITOR# 2. 查看关键性能指标
redis-cli -a YourStrongPass@2024 INFO stats
# 重点关注:
# - instantaneous_ops_per_sec:当前 QPS
# - connected_clients:客户端连接数
# - keyspace_hits/misses:缓存命中/未命中数(计算命中率)# 3. 查看慢查询日志(默认记录 >10ms 的命令)
redis-cli -a YourStrongPass@2024 SLOWLOG GET 10 # 查看最近10条慢查询
4.3.2 日志分析
# 查看最新 100 行日志
sudo tail -100f /var/log/redis/redis.log# 过滤错误日志
sudo grep "ERROR" /var/log/redis/redis.log# 过滤连接失败日志
sudo grep "Connection refused" /var/log/redis/redis.log
五、高可用部署(哨兵模式)
5.1 架构原理
哨兵模式通过 “1 主 + N 从 + 3 哨兵” 的架构实现高可用,核心功能包括:
- 故障检测:哨兵节点定期 ping 主从节点,判断是否存活
- 自动切换:主节点故障时,哨兵选举新主节点(需 ≥2 个哨兵同意)
- 配置同步:切换后自动更新所有节点配置(从节点指向新主节点)
5.2 部署步骤(3 节点示例)
5.2.1 步骤 1:部署主从节点
1. 主节点配置(192.168.1.100):
参考第三章单机配置,确保 bind 0.0.0.0、requirepass 已设置。
2. 从节点配置(192.168.1.101、192.168.1.102):
在单机配置基础上添加主从同步配置:
replicaof 192.168.1.100 6379 # 指向主节点 IP:端口
masterauth YourStrongPass@2024 # 主节点密码(同步数据需认证)
3. 启动主从节点:
sudo systemctl start redis && sudo systemctl enable redis
4. 验证主从同步:
# 主节点查看从节点数量
redis-cli -a YourStrongPass@2024 INFO replication | grep "connected_slaves"
# 输出 connected_slaves:2 表示同步正常
5.2.2 步骤 2:部署哨兵节点(所有节点)
1. 修改哨兵配置文件(sentinel.conf):
sudo vim /usr/local/redis/conf/sentinel.conf
写入以下配置:
port 26379 # 哨兵端口(默认 26379)
daemonize yes # 后台运行
pidfile /var/run/redis-sentinel.pid
logfile /var/log/redis/sentinel.log
dir /var/lib/redis# 监控主节点(mymaster 为集群名,2 表示 ≥2 哨兵同意触发切换)
sentinel monitor mymaster 192.168.1.100 6379 2
sentinel auth-pass mymaster YourStrongPass@2024 # 主节点密码
sentinel down-after-milliseconds mymaster 30000 # 30秒无响应标记为故障
sentinel parallel-syncs mymaster 1 # 故障切换时1个从节点同步新主节点
sentinel failover-timeout mymaster 180000 # 切换超时时间(3分钟)
2. 创建哨兵系统服务:
sudo vim /usr/lib/systemd/system/redis-sentinel.service
写入内容:
[Unit]
Description=Redis Sentinel
After=network.target redis.service[Service]
Type=forking
PIDFile=/var/run/redis-sentinel.pid
ExecStart=/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown
Restart=always[Install]
WantedBy=multi-user.target
3. 启动哨兵服务:
sudo systemctl daemon-reload
sudo systemctl start redis-sentinel
sudo systemctl enable redis-sentinel
5.2.3 步骤 3:验证哨兵模式
# 1. 查看哨兵监控状态
redis-cli -p 26379
127.0.0.1:26379> SENTINEL master mymaster # 查看主节点信息
127.0.0.1:26379> SENTINEL slaves mymaster # 查看从节点列表# 2. 测试故障切换(停止主节点)
sudo systemctl stop redis # 在 192.168.1.100 执行# 3. 30秒后查看新主节点(在从节点执行)
redis-cli -a YourStrongPass@2024 INFO replication | grep "role"
# 输出 role:master 表示切换成功# 4. 恢复原主节点(启动后自动成为从节点)
sudo systemctl start redis # 在 192.168.1.100 执行
六、实际应用案例
6.1 案例 1:Redis 作为缓存(减轻 MySQL 压力)
需求背景
某电商网站商品详情页日均访问量 100 万次,直接查询 MySQL 导致数据库 CPU 使用率长期 80%+,需用 Redis 缓存热点商品数据,降低数据库负载。
实施步骤
1. 缓存设计:
-
- 缓存键:product:detail:{product_id}(如 product:detail:1001)
-
- 缓存值:商品详情 JSON 字符串(包含 ID、名称、价格、库存等)
-
- 过期时间:1 小时(3600 秒),避免缓存数据长期不一致
2. 后端代码实现(Python):
import redis
import pymysql
import json# 1. 初始化 Redis 连接
r = redis.Redis(host='192.168.1.100',port=6379,password='YourStrongPass@2024',decode_responses=True # 自动解码为字符串
)# 2. 初始化 MySQL 连接
db = pymysql.connect(host='192.168.1.103',user='root',password='MySQLPass2024',db='ecommerce'
)
cursor = db.cursor()def get_product_detail(product_id):"""获取商品详情:先查缓存,再查数据库"""# ① 尝试从 Redis 获取缓存cache_key = f"product:detail:{product_id}"cached_data = r.get(cache_key)if cached_data:print("从缓存获取数据")return json.loads(cached_data) # JSON 反序列化# ② 缓存未命中,查询 MySQLsql = f"SELECT id, name, price, stock, description FROM products WHERE id = {product_id}"cursor.execute(sql)result = cursor.fetchone()if not result:return None # 商品不存在# ③ 构造商品字典并写入缓存product_dict = {"id": result[0],"name": result[1],"price": result[2],"stock": result[3],"description": result[4]}r.setex(cache_key, 3600, json.dumps(product_dict)) # 设置过期时间print("从数据库获取数据并写入缓存")return product_dict# 3. 调用函数测试
print(get_product_detail(1001))
3. 缓存更新策略:
商品信息更新时,需同步更新缓存(避免数据不一致),采用 “更新数据库后删除缓存” 策略:
def update_product_stock(product_id, new_stock):"""更新商品库存:先更数据库,再删缓存"""# ① 更新 MySQLsql = f"UPDATE products SET stock = {new_stock} WHERE id = {product_id}"cursor.execute(sql)db.commit()# ② 删除 Redis 缓存(下次查询自动加载新数据)cache_key = f"product:detail:{product_id}"r.delete(cache_key)
4. 效果验证:
# 查看缓存键与过期时间
redis-cli -a YourStrongPass@2024 KEYS "product:detail:*"
redis-cli -a YourStrongPass@2024 TTL "product:detail:1001" # 剩余过期时间(秒)# 查看缓存命中率(INFO stats 中的 keyspace_hits / (keyspace_hits + keyspace_misses))
redis-cli -a YourStrongPass@2024 INFO stats | grep "keyspace"
6.2 案例 2:Redis 实现分布式锁(解决并发超卖)
需求背景
分布式系统中,3 个订单服务同时处理同一商品的库存扣减,需防止 “超卖”(库存为 0 仍扣减),用 Redis 分布式锁保证并发安全。
实施步骤
1. 锁设计原则:
-
- 原子性:加锁 / 释放锁操作需原子化,避免并发漏洞
-
- 防死锁:设置锁过期时间,避免服务崩溃导致锁无法释放
-
- 防误删:释放锁时验证归属(仅删除自己加的锁)
2. 代码实现(Python):
import uuiddef acquire_lock(lock_key, expire_time=10):"""获取分布式锁:param lock_key: 锁的键名(如 "lock:stock:1001"):param expire_time: 锁过期时间(秒):return: (成功标志, 锁值) 锁值用于释放时验证"""lock_value = str(uuid.uuid4()) # 生成唯一值(标识锁归属)# SETNX 逻辑:键不存在则设置,同时设过期时间(原子操作)success = r.set(lock_key, lock_value, nx=True, ex=expire_time)return (success is not None, lock_value)def release_lock(lock_key, lock_value):"""释放分布式锁:验证归属后删除(Lua 脚本保证原子性)"""lua_script = """if redis.call('get', KEYS[1]) == ARGV[1] thenreturn redis.call('del', KEYS[1]) # 归属匹配,删除锁elsereturn 0 # 归属不匹配,不操作end"""result = r.eval(lua_script, 1, lock_key, lock_value)return result == 1def deduct_stock(product_id, deduct_count=1):"""库存扣减:加锁保证并发安全"""lock_key = f"lock:stock:{product_id}"stock_key = f"stock:{product_id}"# ① 获取锁lock_success, lock_value = acquire_lock(lock_key)if not lock_success:print("获取锁失败,其他服务正在处理")return Falsetry:# ② 查库存current_stock = r.get(stock_key)if not current_stock or int(current_stock) < deduct_count:print("库存不足")return False# ③ 扣减库存new_stock = int(current_stock) - deduct_countr.set(stock_key, new_stock)print(f"库存扣减成功,当前库存:{new_stock}")return Truefinally:# ④ 释放锁(无论成功失败都释放)release_lock(lock_key, lock_value)# 初始化库存(商品 1001 初始库存 100)
r.set("stock:1001", 100)# 模拟并发扣减(可多进程/多线程测试)
for _ in range(5):deduct_stock(1001)
七、常见问题与解决方案
7.1 服务启动失败
问题现象
sudo systemctl start redis
Job for redis.service failed because the control process exited with error code.
排查与解决
1. 配置文件错误:
-
- 测试配置文件语法:redis-server /usr/local/redis/conf/redis.conf --test-memory 100
-
- 常见错误:bind 配置格式错误、logfile/dir 目录不存在、密码含特殊字符未加引号
2. 端口被占用:
-
- 查看占用进程:sudo netstat -tulpn | grep 6379
-
- 杀死进程:sudo kill -9 <pid> 或修改 port 配置
3. 权限不足:
-
- 检查目录权限:ls -ld /var/lib/redis /var/log/redis
-
- 赋予权限:sudo chown -R redis:redis /var/lib/redis /var/log/redis
7.2 主从同步失败
问题现象
主节点 INFO replication 显示 connected_slaves:0,从节点日志报 MASTER <-> REPLICA sync failed。
排查与解决
1. 主节点密码错误:
-
- 从节点 masterauth 需与主节点 requirepass 完全一致,修改后重启从节点。
2. 网络不通:
-
- 测试主从节点连通性:ping 192.168.1.100(主节点 IP)
-
- 开放主节点 6379 端口:sudo firewall-cmd --add-port=6379/tcp --permanent
3. 主节点内存不足:
-
- 主节点生成 RDB 快照需足够内存,查看内存:redis-cli -a YourStrongPass@2024 INFO memory
-
- 清理无用数据或增大 maxmemory 配置。
7.3 内存泄漏
问题现象
Redis 内存使用率持续上升,执行 FLUSHDB 后内存仍未释放,或碎片率过高。
排查与解决
1. 内存碎片率过高:
-
- 查看碎片率:redis-cli -a YourStrongPass@2024 INFO memory | grep mem_fragmentation_ratio
-
- 碎片率 >1.5 时开启主动整理:redis-cli -a YourStrongPass@2024 CONFIG SET activedefrag yes
2. 大键未释放:
-
- 查找大键:redis-cli -a YourStrongPass@2024 --bigkeys
-
- 分析大键用途,无用则删除:redis-cli -a YourStrongPass@2024 DEL big_key_name
3. 客户端连接泄漏:
-
- 查看连接数:redis-cli -a YourStrongPass@2024 INFO clients | grep connected_clients
-
- 设置空闲连接超时:redis-cli -a YourStrongPass@2024 CONFIG SET timeout 300(300 秒)
八、生产环境最佳实践
8.1 核心总结
Redis 是一款 “高性能 + 高灵活” 的内存数据库,其运维核心围绕性能优化、数据安全、高可用三大维度:
- 性能优化:合理设置内存淘汰策略、禁用危险命令、开启碎片整理
- 数据安全:必开 RDB+AOF 混合持久化、定期备份、设置密码
- 高可用:中小规模用哨兵模式,大规模用集群模式(分片存储)
8.2 生产环境最佳实践
1. 配置优化:
-
- 内存:maxmemory 设为物理机内存的 70%-80%(预留系统内存)
-
- 持久化:appendfsync everysec + RDB 定时快照(如 1 小时 1 次)
-
- 安全:密码复杂度 ≥8 位,禁用 FLUSHDB/FLUSHALL,绑定内网 IP
2. 监控告警:
-
- 关键指标:QPS、内存使用率(>90% 告警)、缓存命中率(<90% 告警)、连接数
-
- 工具选型:Prometheus + Grafana(可视化监控)、ELK(日志分析)
3. 灾备方案:
-
- 备份:每日凌晨备份 RDB 文件,保留 7 天历史版本
-
- 恢复:定期演练恢复流程,确保备份文件可用
4. 故障处理:
-
- 主从切换:哨兵模式自动切换后,需检查新主节点数据完整性
-
- 内存满:优先清理无用数据,而非直接扩容,避免资源浪费
九、Redis 集群模式部署(大规模场景)
当业务数据量超过单节点承载能力(如数据量达 100GB+),哨兵模式的 “单主” 架构无法满足需求,此时需采用Redis 集群模式。集群通过 “分片存储” 将数据分散到多个主节点,支持水平扩展,最大可部署 1000 个节点。
9.1 集群架构原理
Redis 集群采用 “3 主 3 从” 最小架构(生产环境推荐),核心特性包括:
- 数据分片:将键通过 CRC16 算法计算哈希值,映射到 16384 个 Slot(槽位),每个主节点负责部分 Slot
- 主从复制:每个主节点对应 1 个从节点,实现数据备份与故障切换
- 去中心化:无中心节点,客户端可连接任意节点访问全量数据
9.2 部署步骤(6 节点,3 主 3 从)
9.2.1 环境准备(6 台服务器)
节点角色 | IP 地址 | 端口 | 数据目录 |
主节点 1 | 192.168.1.100 | 6379 | /var/lib/redis/6379 |
从节点 1 | 192.168.1.101 | 6379 | /var/lib/redis/6379 |
主节点 2 | 192.168.1.102 | 6379 | /var/lib/redis/6379 |
从节点 2 | 192.168.1.103 | 6379 | /var/lib/redis/6379 |
主节点 3 | 192.168.1.104 | 6379 | /var/lib/redis/6379 |
从节点 3 | 192.168.1.105 | 6379 | /var/lib/redis/6379 |
9.2.2 所有节点配置集群参数
在redis.conf中添加以下配置(替换bind为节点自身 IP):
# 开启集群模式
cluster-enabled yes
# 集群配置文件(自动生成,无需手动修改)
cluster-config-file nodes-6379.conf
# 节点超时时间(毫秒)
cluster-node-timeout 15000
# 开启AOF持久化(集群必开)
appendonly yes
# 绑定节点IP(需为内网可访问IP)
bind 192.168.1.100 # 其他节点替换为自身IP
# 关闭保护模式
protected-mode no
# 设置密码(所有节点密码需一致)
requirepass YourStrongPass@2024
# 集群节点间通信密码(与requirepass保持一致)
masterauth YourStrongPass@2024
9.2.3 启动所有节点
# 所有节点执行
sudo systemctl start redis
# 验证节点状态(cluster_enabled:yes 表示集群模式已开启)
redis-cli -h 192.168.1.100 -p 6379 -a YourStrongPass@2024 INFO cluster
9.2.4 创建集群(任选一台节点执行)
# 6.0+版本使用redis-cli创建集群(--cluster-replicas 1 表示1主1从)
redis-cli -a YourStrongPass@2024 --cluster create \
192.168.1.100:6379 \
192.168.1.102:6379 \
192.168.1.104:6379 \
192.168.1.101:6379 \
192.168.1.103:6379 \
192.168.1.105:6379 \
--cluster-replicas 1
9.2.5 验证集群状态
# 连接集群(-c 表示集群模式)
redis-cli -h 192.168.1.100 -p 6379 -a YourStrongPass@2024 -c# 查看集群信息(输出3 masters, 3 slaves 表示正常)
192.168.1.100:6379> CLUSTER INFO# 查看节点列表(包含主从关系与Slot范围)
192.168.1.100:6379> CLUSTER NODES
9.3 集群日常运维
9.3.1 数据读写测试
# 写入数据(自动路由到对应Slot的主节点)
192.168.1.100:6379> SET product:1001 "iPhone 15"
-> Redirected to slot [8918] located at 192.168.1.102:6379
OK# 读取数据(自动路由)
192.168.1.102:6379> GET product:1001
"iPhone 15"
9.3.2 节点扩容(新增 1 主 1 从)
1. 准备 2 台新节点(192.168.1.106、192.168.1.107),配置集群参数并启动
2. 添加主节点到集群:
redis-cli -a YourStrongPass@2024 --cluster add-node \
192.168.1.106:6379 \
192.168.1.100:6379 # 已存在的集群节点
3. 添加从节点并指定主节点:
redis-cli -a YourStrongPass@2024 --cluster add-node \
192.168.1.107:6379 \
192.168.1.100:6379 \
--cluster-slave \
--cluster-master-id <主节点ID> # 192.168.1.106的节点ID(通过CLUSTER NODES获取)
4. 重新分配 Slot(将现有 Slot 分配给新主节点):
redis-cli -a YourStrongPass@2024 --cluster reshard 192.168.1.100:6379
按照提示输入需分配的 Slot 数量(如 4096)、接收 Slot 的主节点 ID、分配方式(all 表示从所有主节点匀出)。
9.3.3 故障切换测试
# 1. 停止主节点1(192.168.1.100)
sudo systemctl stop redis# 2. 等待30秒后,查看集群状态(从节点1会自动升级为主节点)
redis-cli -h 192.168.1.101 -p 6379 -a YourStrongPass@2024 -c CLUSTER NODES# 3. 恢复原主节点(启动后自动成为新主节点的从节点)
sudo systemctl start redis
十、Redis 6+ 新特性应用
Redis 6.0 及以上版本新增诸多实用特性,以下重点介绍生产环境常用功能的配置与使用。
10.1 ACL(访问控制列表)
替代传统密码认证,支持精细化权限管控(如指定用户仅能操作特定键、特定命令)。
10.1.1 配置 ACL
# 1. 启用ACL文件(在redis.conf中添加)
aclfile /usr/local/redis/conf/users.acl# 2. 重启Redis后,通过客户端创建用户
redis-cli -a YourStrongPass@2024# 创建只读用户(仅能执行GET、KEYS等读命令)
127.0.0.1:6379> ACL SETUSER readuser ON >ReadPass@2024 ~* +@read -@write
OK# 创建管理员用户(全权限)
127.0.0.1:6379> ACL SETUSER admin ON >AdminPass@2024 ~* +@all
OK# 查看用户列表
127.0.0.1:6379> ACL LIST
10.1.2 测试 ACL 权限
# 使用只读用户登录
redis-cli -u redis://readuser:ReadPass@2024@127.0.0.1:6379# 执行读命令(成功)
127.0.0.1:6379> GET product:1001
"iPhone 15"# 执行写命令(失败,无权限)
127.0.0.1:6379> SET product:1002 "MacBook Pro"
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand
10.2 IO 多线程
Redis 6.0 引入 IO 多线程(仅处理网络 IO,命令执行仍为单线程),提升高并发场景下的吞吐量。
10.2.1 配置 IO 多线程
# 在redis.conf中添加(根据CPU核心数调整线程数,一般为CPU核心数的1/2)
io-threads 4 # 4个IO线程(包含主线程,实际工作线程为3个)
io-threads-do-reads yes # 开启读多线程
10.2.2 验证效果
通过redis-benchmark测试开启前后的吞吐量:
# 测试前(单线程IO)
redis-benchmark -h 192.168.1.100 -p 6379 -a YourStrongPass@2024 -t SET,GET -n 100000 -c 50# 开启多线程后(对比QPS提升,一般可提升30%-50%)
redis-benchmark -h 192.168.1.100 -p 6379 -a YourStrongPass@2024 -t SET,GET -n 100000 -c 50
10.3 客户端缓存(Client Side Caching)
客户端可缓存热点数据,减少与 Redis 服务器的交互,降低服务器压力。
10.3.1 启用客户端缓存
# 客户端连接时开启缓存(指定缓存前缀为"cache:",超时300秒)
redis-cli -h 192.168.1.100 -p 6379 -a YourStrongPass@2024 -c# 开启追踪模式(BCAST 表示广播失效通知)
192.168.1.100:6379> CLIENT TRACKING ON PREFIX cache: TIMEOUT 300 BCAST
OK# 写入数据(服务器会记录客户端缓存的键)
192.168.1.100:6379> SET cache:user:100 "Alice"
OK# 其他客户端修改该键时,服务器会向所有缓存该键的客户端发送失效通知
十一、运维自动化脚本开发
通过 Shell 脚本实现 Redis 日常运维任务的自动化,减少人工操作成本。
11.1 自动备份脚本(支持 RDB/AOF 备份)
#!/bin/bash
# 脚本功能:自动备份Redis RDB/AOF文件,并保留7天历史备份
# 使用方法:添加到crontab,每日凌晨2点执行(0 2 * * * /usr/local/redis/scripts/auto_backup.sh)# 配置参数
REDIS_CLI="/usr/local/redis/bin/redis-cli"
PASSWORD="YourStrongPass@2024"
BACKUP_DIR="/backup/redis"
RETENTION_DAYS=7 # 备份保留天数
DATE=$(date +%Y%m%d_%H%M%S)# 创建备份目录
mkdir -p $BACKUP_DIR# 1. 备份RDB文件(先执行BGSAVE生成最新快照)
echo "[$DATE] Starting RDB backup..."
$REDIS_CLI -a $PASSWORD BGSAVE
# 等待BGSAVE完成(最多等待60秒)
for ((i=0; i<60; i++)); doBGSAVE_STATUS=$($REDIS_CLI -a $PASSWORD INFO persistence | grep "bgsave_in_progress" | awk -F: '{print $2}')if [ $BGSAVE_STATUS -eq 0 ]; thenbreakfisleep 1
done
# 复制RDB文件
cp /var/lib/redis/dump.rdb $BACKUP_DIR/rdb_backup_$DATE.rdb# 2. 备份AOF文件(若开启AOF)
AOF_ENABLED=$($REDIS_CLI -a $PASSWORD CONFIG GET appendonly | grep "yes" | wc -l)
if [ $AOF_ENABLED -eq 1 ]; thenecho "[$DATE] Starting AOF backup..."# 执行AOF重写,生成干净的AOF文件$REDIS_CLI -a $PASSWORD BGREWRITEAOF# 等待重写完成for ((i=0; i<120; i++)); doREWRITE_STATUS=$($REDIS_CLI -a $PASSWORD INFO persistence | grep "aof_rewrite_in_progress" | awk -F: '{print $2}')if [ $REWRITE_STATUS -eq 0 ]; thenbreakfisleep 1done# 复制AOF文件cp /var/lib/redis/appendonly.aof $BACKUP_DIR/aof_backup_$DATE.aof
fi# 3. 删除过期备份(保留指定天数)
echo "[$DATE] Cleaning up old backups..."
find $BACKUP_DIR -name "rdb_backup_*.rdb" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "aof_backup_*.aof" -mtime +$RETENTION_DAYS -deleteecho "[$DATE] Backup completed successfully!"
11.2 集群健康检查脚本
#!/bin/bash
# 脚本功能:检查Redis集群状态,异常时发送邮件告警
# 使用方法:添加到crontab,每5分钟执行(*/5 * * * * /usr/local/redis/scripts/cluster_health_check.sh)# 配置参数
REDIS_CLI="/usr/local/redis/bin/redis-cli"
PASSWORD="YourStrongPass@2024"
CLUSTER_NODES=("192.168.1.100:6379" "192.168.1.102:6379" "192.168.1.104:6379")
ALERT_EMAIL="admin@example.com"
DATE=$(date +%Y%m%d_%H%M%S)
ERROR_MSG=""# 检查每个主节点状态
for NODE in "${CLUSTER_NODES[@]}"; doecho "[$DATE] Checking node $NODE..."# 检查节点是否存活PING_RESULT=$($REDIS_CLI -h ${NODE%:*} -p ${NODE#*:} -a $PASSWORD PING 2>/dev/null)if [ "$PING_RESULT" != "PONG" ]; thenERROR_MSG+="Node $NODE is down!\n"continuefi# 检查节点是否为主节点且Slot正常NODE_ROLE=$($REDIS_CLI -h ${NODE%:*} -p ${NODE#*:} -a $PASSWORD INFO cluster | grep "role:" | awk -F: '{print $2}')if [ "$NODE_ROLE" = "master" ]; thenSLOT_COUNT=$($REDIS_CLI -h ${NODE%:*} -p ${NODE#*:} -a $PASSWORD CLUSTER COUNTKEYSINSLOT 0 | grep -v "error" | wc -l)if [ $SLOT_COUNT -eq 0 ]; thenERROR_MSG+="Master node $NODE has no assigned slots!\n"fifi
done# 检查集群整体状态
CLUSTER_STATE=$($REDIS_CLI -h ${CLUSTER_NODES[0]%:*} -p ${CLUSTER_NODES[0]#*:} -a $PASSWORD CLUSTER INFO | grep "cluster_state:" | awk -F: '{print $2}')
if [ "$CLUSTER_STATE" != "ok" ]; thenERROR_MSG+="Cluster state is $CLUSTER_STATE (expected ok)!\n"
fi# 若有异常,发送邮件告警
if [ -n "$ERROR_MSG" ]; thenecho -e "Redis Cluster Health Alert ($DATE)\n\n$ERROR_MSG" | mail -s "Redis Cluster Alert" $ALERT_EMAILecho "[$DATE] Alert sent to $ALERT_EMAIL: $ERROR_MSG"
elseecho "[$DATE] All nodes are healthy!"
fi
十二、总结与扩展建议
12.1 文档核心回顾
本文从 Redis 基础概念到高级应用,覆盖了:
- 基础运维:安装配置、日常命令、数据备份恢复
- 高可用架构:哨兵模式(中小规模)、集群模式(大规模)
- 实战场景:缓存设计、分布式锁、性能优化
- 自动化运维:备份脚本、健康检查脚本
12.2 扩展学习建议
- 进阶特性:深入学习 Redis Stream(消息队列)、RedisSearch(全文检索)、RedisGraph(图数据库)等扩展模块
- 云原生部署:尝试在 Kubernetes 上部署 Redis 集群(使用 Redis Operator),实现容器化运维
- 性能调优:结合 perf 工具分析 Redis 性能瓶颈,优化内核参数(如 TCP 队列、内存页大小)
- 安全加固:配置 TLS 加密(Redis 6.0 + 支持)、限制 IP 访问、定期漏洞扫描
12.3 生产环境注意事项
- 版本选择:优先使用稳定版(如 7.2.x),避免使用最新测试版
- 资源隔离:Redis 服务器不部署其他服务,避免资源竞争
- 监控升级:除基础指标外,新增慢查询、Slot 迁移、ACL 权限变更等监控项
- 灾备演练:每季度进行一次故障切换与数据恢复演练,确保方案可行
通过本文的实践指南,可满足大部分企业的 Redis 运维需求。随着业务发展,需持续关注 Redis 社区动态,结合实际场景优化架构与运维策略,充分发挥 Redis 的高性能优势。