Redis技术笔记-主从复制、哨兵与持久化实战指南
目录
前言
一、Redis主从复制
(一)Redis主从复制介绍
(二)基本环境准备
(三)工作原理
(四)结构模式
(五)一主一从(无密码)
配置Master
配置Slave1
测试
(六)一主多从(无密码)
添加Slave2
Master查看
(七)级联复制(链式复制)
将 Slave2 改为 Slave1 的 Slave
查看链式结构
(八)带密码的主从复制
配置 Master 密码
配置Slave1认证
验证密码生效
二、Redis哨兵
(一)Redis哨兵介绍
定位
核心作用
故障转移流程
部署要点
与 Redis Cluster 的差异
(二)基本环境准备
(三)哨兵配置
Master 配置
Slave 配置
Sentinel 配置
测试
三、数据持久化
(一)RDB(Redis DataBase)快照
RDB介绍
工作原理
触发机制
RDB的优缺点
RDB配置
(二)AOF(追加文件)
结构与内容
刷盘策略
重写机制
AOF的优缺点
AOF配置
(三)持久化方式对比
四、Redis 命令分类整理及常用配置项
(一)配置信息
(二) 基础命令
(三) 数据操作命令
(四)集群命令
(五) 持久化命令
(六) 数据类型操作
(七)事务与锁
(八)数据库与迁移
前言
- 上一篇介绍了Redis的三大缓存问题和Redis集群的搭建,想要了解的可以参考Redis技术笔记-从三大缓存问题到高可用集群落地实战。
- 本篇介绍Redis的主从复制和哨兵的配置及数据持久化(RDB和AOF)的实现,最后也提供了一个用来参考的Redis相关的命令和配置信息表。
一、Redis主从复制
(一)Redis主从复制介绍
- Redis 主从复制是实现高可用性的重要机制。
- 主节点负责处理客户端的读写请求,执行数据的写入操作并维护数据的最新状态。
- 从节点通过异步复制机制定期从主节点拉取数据,保持数据的一致性,并能够处理只读请求,从而实现读写分离,提升系统的读取性能。
(二)基本环境准备
- 主机准备
主机名 | IP地址 | 角色 | 密码 |
---|---|---|---|
Redis57 | 192.168.88.57 | Master | test |
Redis58 | 192.168.88.58 | Slave1 | - |
Redis59 | 192.168.88.59 | Slave2 | - |
- 注:如无密码,则忽略所有
requirepass
与masterauth
配置即可,配置SELINUX和关闭防火墙。
(三)工作原理
- 建立复制链路
- 从节点启动后,向主节点发送
PSYNC <replid> <offset>
(2.8+ 支持部分同步;旧版发送SYNC
)。 - 主节点根据
replid
与offset
判断是否需要 全量同步 或 增量同步。
- 从节点启动后,向主节点发送
- 全量同步流程
- 主节点执行
fork()
创建子进程,触发 RDB 快照。 - 子进程生成
.rdb
文件;主节点同时维护 复制积压缓冲区(repl-backlog),记录后续写命令。 - RDB 文件通过 TCP 流 传输到从节点;传输期间主节点继续处理写请求,增量命令写入缓冲区。
- 从节点 热加载
.rdb
,完成基线数据恢复。 - 主节点将缓冲区中的增量指令 顺序发送 给从节点,从节点实时重放,实现最终一致。
- 主节点执行
- 增量同步流程
- 当从节点掉线后重连,且断线时间 < 缓冲区窗口期(默认 1 MB),主节点仅推送缺失指令,无需再次全量传输,显著减少网络开销。
(四)结构模式
- 一主一从
- 最简架构,主节点负责写,从节点负责读;故障时手动切换。
- 适用于读多写少、数据量较小的场景。
- 一主多从
- 主节点挂接多个从节点,横向扩容读能力。
- 从节点可部署在不同机架或可用区,提升读性能与容灾能力。
- 注意主节点网络带宽与
fork()
压力。
- 级联复制(链式复制)
- 主节点仅向第一层从节点同步,第一层从节点再向下一层同步,形成 主 → 从 → 从 的链式结构。
- 优点:减轻主节点网络与 CPU 负载;缺点:链路延迟逐级累加。
(五)一主一从(无密码)
配置Master
yum -y install redis #安装Redis服务
vim /etc/redis.conf #修改配置文件
#69行
bind 192.168.88.57 #指定Redis服务监听的IP地址#92行
port 6379 #指定Redis服务监听的端口号systemctl start redis #启动Redis服务#连接到Redis服务器查看当前Redis实例的主从复制状态
redis-cli -h 192.168.88.57 -p 6379 info replication
#预期输出
role:master
connected_slaves:0
配置Slave1
yum -y install redis #安装Redis服务
vim /etc/redis.conf #修改配置文件
#69行
bind 192.168.88.58 #指定Redis服务监听的IP地址#92行
port 6379 #指定 Redis 服务监听的端口号systemctl start redis #启动Redis服务redis-cli -h 192.168.88.58 -p 6379 #使用Redis客户端连接到当前主机的Redis实例
> replicaof 192.168.88.57 6379
#将当前Redis实例(192.168.88.58:6379)配置为从节点(Replica),并指向主节点(192.168.88.57:6379)> config rewrite #将当前Redis的运行时配置写入配置文件/etc/redis.conf,实现持久化配置
> exit #退出Redis客户端tail -1 /etc/redis.conf #检查配置是否成功
#输出
replicaof 192.168.88.58 6379
测试
- 在Master写入测试数据
#在Redis57执行
redis-cli -h 192.168.88.57 -p 6379
192.168.88.57:6379> mset k1 v1 k2 v2 k3 v3
192.168.88.57:6379> keys *
#预期输出
1) "k1"
2) "k2"
3) "k3"
- 立即在Slave1查看是否同步
#在Redis58执行
redis-cli -h 192.168.88.58 -p 6379
192.168.88.58:6379> keys *
#预期输出
1) "k1"
2) "k2"
3) "k3"192.168.88.58:6379> get k1
#预期输出
"v1"
(六)一主多从(无密码)
添加Slave2
yum -y install redis #安装Redis服务
vim /etc/redis.conf #修改配置文件
#69行
bind 192.168.88.59 #指定Redis服务监听的IP地址#92行
port 6379 #指定 Redis 服务监听的端口号systemctl start redis #启动Redis服务redis-cli -h 192.168.88.59 -p 6379 #使用Redis客户端连接到当前主机的Redis实例
> replicaof 192.168.88.59 6379
#将当前Redis实例(192.168.88.59:6379)配置为从节点(Replica),并指向主节点(192.168.88.57:6379)> config rewrite #将当前Redis的运行时配置写入配置文件/etc/redis.conf,实现持久化配置
> exit #退出Redis客户端
Master查看
redis-cli -h 192.168.88.57 -p 6379 info replication#预期输出
role:master
connected_slaves:2
(七)级联复制(链式复制)
将 Slave2 改为 Slave1 的 Slave
#Redis59主机执行
#使用Redis客户端连接到IP地址为192.168.88.59、端口为6379的Redis实例
redis-cli -h 192.168.88.59 -p 6379#将当前Redis实例(192.168.88.59:6379)从之前的主节点中脱离,使其成为独立的主节点
> replicaof no one#将当前Redis实例(192.168.88.59:6379)设置为从节点,并指向新的主节点192.168.88.58:6379
> replicaof 192.168.88.58 6379
> config rewrite
> exit
查看链式结构
#在Redis58主机执行
redis-cli -h 192.168.88.58 -p 6379 info replication#预期输出
role:slave
master_host:192.168.88.57
connected_slaves:1
(八)带密码的主从复制
配置 Master 密码
#Redis57执行
redis-cli -h 192.168.88.57 -p 6379
> config set requirepass test #动态设置Redis实例的密码为test
> auth test #向 Redis
#服务器发送密码test进行身份验证,验证成功后,才可以执行其他Redis命令(如 PING、GET 等)> config rewrite
> exittail -1 /etc/redis.conf
requirepass "test" # Redis 的配置项,用于设置密码
配置Slave1认证
#Redis58执行
redis-cli -h 192.168.88.58 -p 6379
> config set masterauth test
#动态设置当前Redis实例的masterauth配置项为test
#masterauth是Redis从节点的配置项,用于指定连接主节点时的密码(当主节点设置了requirepass时)> config rewrite
> exit
验证密码生效
#Redis57执行
redis-cli -h 192.168.88.57 -p 6379 -a test info replication
#预期输出
connected_slaves:1#Redis58执行redis-cli -h 192.168.88.58 -p 6379
> auth test
> info replication
#预期输出
role:slave
master_link_status:up
二、Redis哨兵
(一)Redis哨兵介绍
定位
- Sentinel 是 Redis 官方的高可用组件,一套独立的二进制可执行文件,与 Redis 节点松耦合部署。
- 它通过持续监控主从拓扑、自动选主、实时通知客户端,实现“故障发现 → 故障切换 → 配置刷新”全流程闭环,全程无需人工干预。
核心作用
- 故障检测
- 各哨兵持续向主、从节点发送 PING、INFO 与 PUBLISH 心跳;当 quorum 数量哨兵确认主节点不可达,即标记为客观下线(ODOWN)。
- 自动故障转移
- 哨兵集群通过 Raft-like 选举产生唯一领头哨兵;随后按复制偏移量最大原则选出新主,向其余从节点发送 SLAVEOF 指令,并将新拓扑写入 sentinel.conf。
- 配置推送
- 故障转移完成后,哨兵通过 +switch-master 广播新主地址;客户端调用
sentinel get-master-addr-by-name mymaster
即可实时获取,主流 SDK(Jedis/Lettuce/Redisson)已原生支持,无需人工介入。
- 故障转移完成后,哨兵通过 +switch-master 广播新主地址;客户端调用
故障转移流程
- 持续探测:每个哨兵每秒向主节点及所有从节点发送 PING,并收集 INFO 与 PUBLISH 心跳。
- 主观下线:若某节点在 down-after-milliseconds 内无响应,该哨兵将其标记为 sdown(主观下线)。
- 客观下线:当 ≥ quorum 个哨兵报告同一节点为 sdown 时,集群将其标记为 odown(客观下线),触发故障转移。
- 选主与晋升:哨兵内部通过 Raft-like 投票选出唯一的 Leader,Leader 在存活从节点中按复制偏移量、优先级、运行 ID 排序,选最优节点执行 SLAVEOF NO ONE 晋升为新主。
- 拓扑更新:Leader 向其余从节点发送 SLAVEOF new_host new_port 指令,完成数据追赶;同时向所有哨兵及客户端广播 +switch-master 事件,客户端 SDK 实时刷新主节点地址,整个切换过程通常在 1–3 秒内完成。
部署要点
- 奇数个哨兵(3、5、7)跨机架部署,保证半数以上存活;
- 与 Redis 节点物理隔离,防止“一机挂全挂”;
- 在 Docker/NAT 环境开启
sentinel announce-ip
与announce-port
,确保地址可识别; - 配置仅一行:
sentinel monitor <master-name> <ip> <port> <quorum>
。
与 Redis Cluster 的差异
- Sentinel 面向主从模式,单分片容量受单机内存限制,侧重“单分片高可用”;
- Cluster 面向数据分片,横向扩展更佳,但无内置选主,需自行实现故障转移。
(二)基本环境准备
节点 | IP | 角色 | 端口 | 作用 |
---|---|---|---|---|
Redis60 | 192.168.88.60 | Master | 6379 | 读写主节点 |
Redis61 | 192.168.88.61 | Slave | 6379 | 主备切换候选 |
Redis62 | 192.168.88.62 | Sentinel | 26379 | 监控 + 故障转移 |
(三)哨兵配置
Master 配置
yum -y install redisvim /etc/redis.conf
bind 192.168.88.60
port 6379systemctl start redis
- 验证
redis-cli -h 192.168.88.60 -p 6379 info replication
#预期输出
role:master
connected_slaves:0
Slave 配置
yum -y install redisvim /etc/redis.conf
bind 192.168.88.61
port 6379
replicaof 192.168.88.60 6379systemctl start redis
- 验证
redis-cli -h 192.168.88.61 -p 6379 info replication#预期输出
role:slave
master_host:192.168.88.60
master_link_status:up
Sentinel 配置
yum -y install redis
#哨兵服务器不需要存储数据所以不不需要启动redis服务vim /etc/redis-sentinel.conf
#15行
bind 192.168.88.62 #指定 Sentinel 监听的网络接口地址#21行
port 26379 #设置 Sentinel 的监听端口#26行
daemonize yes #以守护进程(后台)模式运行 Sentinel#84行
sentinel monitor mymaster 192.168.88.61 6379 1
#配置 Sentinel 监控的主节点(Master)
mymaster 用户自定义的主节点的逻辑名称
192.168.88.67 6379 主节点的 IP 地址和端口
1 Quorum(法定票数)表示至少需要 1 个 Sentinel 实例认为主节点不可用时,才会触发故障转移systemctl start redis-sentinel
systemctl enable redis-sentinel
测试
- 查看节点信息
#查看哨兵已识别拓扑
redis-cli -h 192.168.88.62 -p 26379 sentinel master mymaster#查看从节点列表
redis-cli -h 192.168.88.62 -p 26379 sentinel slaves mymaster
- 模拟主节点宕机
#Redis60执行
systemctl stop redis
- 观察故障转移
#等待 5-10 秒后,再次查询哨兵
redis-cli -h 192.168.88.69 -p 26379 sentinel master mymaster#预期输出
ip=192.168.88.61
port=6379
flags=master
- 验证客户端自动连接
#在任意客户端如Redis61执行
redis-cli -h 192.168.88.62 -p 26379 sentinel get-master-addr-by-name mymaster
#预期输出
1) "192.168.88.61"
2) "6379"
- 恢复旧主节点
systemctl start redis
- 再次查询
#
redis-cli -h 192.168.88.62 -p 26379 sentinel slaves mymaster
#预期能看到旧主节点已变为 slave
三、数据持久化
- 基本环境准备
主机名 | IP地址 |
---|---|
Redis63 | 192.168.88.63 |
- 手动:安装并启动redis服务。
(一)RDB(Redis DataBase)快照
RDB介绍
- RDB 是 Redis 提供的快照型持久化方案,以“时间点一致性”为目标,把某一时刻的全部内存数据序列化为紧凑的二进制
.rdb
文件,进程重启时可一次性完整加载。 - 文件构成:键值对及对应的元数据(过期时间、数据类型、编码方式),不包含任何增量日志。
- 设计定位:专为冷备份、灾难恢复以及主从复制初始同步而设计,不记录会话级增量变化。
- 关键特征:
- 体积小、加载速度快,适用于海量数据的快速回滚;
- 仅保留完整快照,对两次快照之间的变更不做记录,因此存在分钟级数据丢失风险。
工作原理
- 主进程收到触发条件后,调用
fork()
创建子进程;子进程获得父进程内存的只读快照,并按.rdb
协议顺序遍历所有数据库,将键值对及其元数据写入临时.rdb
文件。 - 父进程继续处理客户端请求,仅在
fork()
瞬间短暂阻塞;随后所有对被修改内存页的写入通过写时复制(Copy-On-Write)生成新副本,保证子进程所见数据与快照时刻完全一致。 - 子进程完成写盘后,原子地替换旧
.rdb
文件,父进程随后清理 COW 产生的额外内存。
触发机制
- 手动:
BGSAVE
立即后台快照;SAVE
会阻塞主线程,生产禁用。 - 优雅退出:执行
SHUTDOWN
或systemctl stop redis
时自动调用BGSAVE
。 - 配置规则:
- 满足
save <seconds> <changes>
条件时自动触发。 - 在配置文件中设定
save <seconds> <changes>
,如save 90 5
表示 90 秒内发生≥5 次写操作即触发后台快照。
- 满足
- 主从复制:从节点执行 SYNC/PSYNC 请求时,主节点自动触发 BGSAVE 生成 RDB 并发送给从节点完成全量同步。
RDB的优缺点
维度 | RDB 优点 | RDB 缺点 |
---|---|---|
数据粒度 | 完整快照,恢复时一次性加载 | 两次快照之间数据可能丢失 |
文件体积 | 紧凑二进制,体积小 | 不支持增量,每次全量 |
恢复速度 | 加载极快,秒级回滚 | 无法部分恢复 |
性能影响 | fork 子进程,主线程短暂阻塞 | 大实例 fork 时内存翻倍 |
生产运维 | 易于冷备份、跨机复制 | fork 失败风险,需监控 |
场景适用 | 冷备份、主从初始同步 | 不适用于秒级零丢失需求 |
RDB配置
- 恢复步骤:设定触发规则 → 写入测试数据 → 备份快照 → 清库并停止实例 → 覆盖快照文件 → 启动实例 → 验证恢复。
- 查看默认配置:
cat /etc/redis.conf
save 900 1 # 16分钟内至少有1次变更
save 300 10 # 5分钟内至少有10次变更
save 60 10000 # 1分钟内至少有10000次变更
- 修改配置文件:
vim /etc/redis.conf#修改默认配置
save 900 1
save 90 5 # 90秒内至少有5次变更
save 60 10000
- 写入测试数据(触发 RDB):
redis-cli -h 192.168.88.63 -p 6379
192.168.88.63:6379> mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5
- 等待 90 秒或立即强制触发:
redis-cli -h 192.168.88.63 -p 6379 BGSAVE
- 验证快照已生成
ls -l /var/lib/redis/dump.rdb #显示时间戳
- 备份快照
cp /var/lib/redis/dump.rdb /tmp/dump.rdb
- 模拟灾难(清空内存)
redis-cli -h 192.168.88.63 -p 6379 FLUSHALL
#FLUSHALL会删除Redis实例中所有数据库(默认16个数据库)中的所有键值对redis-cli -h 192.168.88.63 -p 6379 keys *
- 恢复数据
systemctl stop redis
cp /tmp/dump.rdb /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb
systemctl start redis
- 最终验证
redis-cli -h 192.168.88.63 -p 6379 keys *
#预期输出5条键值对
(二)AOF(追加文件)
- AOF 将每一次写操作按顺序追加到磁盘,形成可重放的指令流,保证秒级或毫秒级数据安全。
结构与内容
- 文本格式:每条写命令及其参数、时间戳、过期标志等完整记录。
- 无快照:全量历史,不含二进制数据,可直接 cat 查看。
刷盘策略
策略 | 命令 | 数据安全 | 性能 | 建议场景 |
---|---|---|---|---|
always | 每条写立即 fsync(同步) | 零丢失 | 最低 | 金融级 |
everysec(默认) | 每秒 fsync | ≤1 秒丢失 | 平衡 | 通用业务 |
no | 由 OS(操作系统) 调度 | 不可控 | 最高 | 日志类 |
重写机制
- 自动触发:
- 触发条件:文件大小 ≥ 64 MB 且增长率 ≥ 100 %。
- 流程:
- fork 子进程 → 把内存快照写成最简指令 → 追加增量 → 原子替换旧文件。
- 手动触发:BGREWRITEAOF(非阻塞)。
- 压缩文本:重写后文件体积可缩小 50 %–90 %。
AOF的优缺点
维度 | AOF 优点 | AOF 缺点 |
---|---|---|
数据安全 | 支持秒级或毫秒级持久化(always/everysec) | 极端宕机时可能丢失 1 秒数据(everysec) |
文件体积 | 可读文本,便于人工审计 | 体积膨胀快,需定期重写 |
恢复速度 | 需逐条重放指令,恢复慢于 RDB | 大文件恢复耗时 |
性能影响 | everysec 对主线程影响小,always 影响大 | always 模式显著降低写吞吐 |
运维复杂度 | 支持在线重写、修复、截断 | rewrite 时 CPU/IO 飙高 |
场景适用 | 金融、订单等零容忍业务 | 对恢复速度要求极高的冷备份不适用 |
AOF配置
- 恢复步骤:启用 AOF → 写入数据 → 备份 appendonly.aof → 清空内存 → 停止服务 → 覆盖文件 → 启动实例 → 验证数据完整性
- 启用 AOF
redis-cli config set appendonly yes #开启 Redis 的 AOF(Append Only File)持久化功能
redis-cli config rewrite
#将当前通过 CONFIG SET 修改的配置持久化到 Redis 的配置文件中,确保重启后配置仍然生效
- 写入测试数据
redis-cli -h 192.168.88.63 -p 6379 MSET a 1 b 2 c 3 #同时设置多个键值对
- 备份
cp /var/lib/redis/appendonly.aof /tmp/appendonly.aof
- 灾难模拟
redis-cli FLUSHALL
- 恢复
systemctl stop redis
cp /tmp/appendonly.aof /var/lib/redis/appendonly.aof
chown redis:redis /var/lib/redis/appendonly.aof
systemctl start redis
- 验证
redis-cli keys *
#预期显示a b c三键
- 注:在实际应用中,RDB 和 AOF 通常结合使用以平衡性能与数据安全性:
- 金融业务等强一致性场景:
- 采用
AOF always
(每次写操作同步到磁盘)配合 混合持久化(aof-use-rdb-preamble yes
),通过 RDB 快照实现较快速恢复,同时通过 AOF 日志确保最小数据丢失(最多丢失缓冲区未同步的数据)。
- 采用
- 通用业务场景:
- 采用
AOF everysec
(每秒同步一次)配合混合持久化,在性能(减少磁盘 I/O)与数据安全性(最多丢失 1 秒数据)之间取得平衡,并通过 RDB 快照加速恢复过程。
- 采用
- 金融业务等强一致性场景:
(三)持久化方式对比
对比维度 | RDB(快照) | AOF(追加日志) | 混合持久化(RDB+AOF) |
---|---|---|---|
持久方式 | 全量二进制快照 | 顺序追加写命令 | 快照头 + 增量 AOF |
数据粒度 | 分钟级 | 秒级 / 毫秒级 | 秒级 |
文件体积 | 最小(压缩后) | 最大(可重写瘦身) | 中等(重写后) |
恢复速度 | 最快(一次性加载) | 较慢(逐条重放) | 快(先加载 RDB 头,再重放尾部 AOF) |
数据安全 | 可能丢失两次快照间全部数据 | 最多丢失 1 秒(everysec)或零丢失(always) | 与 AOF 同级,取决于刷盘策略 |
性能影响 | fork 瞬间阻塞 | everysec 影响极小,always 影响较大 | 重写阶段 CPU/IO 峰值 |
触发条件 | 手动 BGSAVE / 优雅退出 / save 规则 / 主从同步 | 每条写命令 / 重写阈值 | 同 AOF,但重写时先产生 RDB 头 |
运维复杂度 | 低(文件单一) | 高(需重写、修复、截断) | 中(需监控重写) |
生产适用场景 | 冷备份、主从初始同步、容忍分钟级丢失 | 金融、订单、零丢失需求 | 兼顾恢复速度与数据安全 |
四、Redis 命令分类整理及常用配置项
(一)配置信息
配置项 | 描述 | 示例 |
---|---|---|
bind <IP> | 设置监听 IP | bind 192.168.88.64 |
port <PORT> | 设置监听端口 | port 6379 |
requirepass <PASSWORD> | 设置连接密码 | requirepass mySecurePassword |
daemonize yes | 以守护进程模式运行 | daemonize yes |
logfile "/var/log/redis/redis.log" | 设置日志文件路径 | logfile "/var/log/redis/redis.log" |
dir /var/lib/redis | 设置 RDB 文件存储目录 | dir /var/lib/redis |
dbfilename dump.rdb | 设置 RDB 文件名 | dbfilename dump.rdb |
appendonly yes | 开启 AOF 持久化 | appendonly yes |
appendfilename "appendonly.aof" | 设置 AOF 文件名 | appendfilename "appendonly.aof" |
save 900 1 | 设置 RDB 快照规则(900 秒内至少有 1 次写操作) | save 900 1 |
save 300 10 | 设置 RDB 快照规则(300 秒内至少有 10 次写操作) | save 300 10 |
save 60 10000 | 设置 RDB 快照规则(60 秒内至少有 10000 次写操作) | save 60 10000 |
maxmemory <bytes> | 设置最大内存限制 | maxmemory 1gb |
requirepass <PASSWORD> | 设置 Redis 服务的连接密码 | requirepass mySecurePassword |
maxmemory-policy allkeys-lru | 设置内存淘汰策略(LRU) | maxmemory-policy allkeys-lru |
(二) 基础命令
命令 | 描述 | 示例 |
---|---|---|
yum -y install redis | 安装 Redis | yum -y install redis |
systemctl start redis | 启动 Redis 服务 | systemctl start redis |
systemctl enable redis | 设置 Redis 服务开机自启 | systemctl enable redis |
systemctl stop redis | 停止 Redis 服务 | systemctl stop redis |
systemctl restart redis | 重启 Redis 服务 | systemctl restart redis |
systemctl status redis | 查看服务状态 | systemctl status redis |
vim /etc/redis.conf | 编辑 Redis 配置文件 | vim /etc/redis.conf |
ls /var/lib/redis/ | 查看持久化文件 | ls /var/lib/redis/ |
cp /var/lib/redis/dump.rdb <BACKUP_PATH> | 备份 RDB 文件 | cp /var/lib/redis/dump.rdb /tmp/backup.rdb |
cp <BACKUP_PATH> /var/lib/redis/dump.rdb | 恢复 RDB 文件 | cp /tmp/backup.rdb /var/lib/redis/dump.rdb |
chown -R redis:redis /var/lib/redis | 修改文件所有者 | chown -R redis:redis /var/lib/redis |
ss -utnlp | 查看 Redis 服务监听的端口 | ss -utnlp | grep redis |
(三) 数据操作命令
命令 | 描述 | 示例 |
---|---|---|
redis-cli -h <IP> -p <PORT> -a <PASSWORD> | 连接实例 | redis-cli -h 192.168.88.64 -p 6379 -a mySecurePassword |
redis-cli -h <IP> -p <PORT> | 无密码连接 | redis-cli -h 192.168.88.64 -p 6379 |
auth <PASSWORD> | 无密码连接后输入密码 | auth mySecurePassword |
keys <PATTERN> | 查找所有匹配给定模式的键 | keys user:* |
keys ??? | 匹配三个字符的键 | keys ??? |
keys a* | 匹配以 a 开头的键 | keys a* |
exists <KEY> | 检查键是否存在 | exists user:1001 |
del <KEY1> <KEY2> ... | 删除一个或多个键 | del user:1004 user:1003 |
type <KEY> | 查看键的数据类型 | type user:1001 |
ttl <KEY> | 查看键剩余生存时间(秒) | ttl session:1234 |
expire <KEY> <SECONDS> | 设置键的生存时间(秒) | expire session:1234 15 |
persist <KEY> | 移除过期时间 | persist session:1234 |
flushdb | 清空当前数据库 | flushdb |
flushall | 清空所有数据库 | flushall |
(四)集群命令
命令 | 描述 | 示例 |
---|---|---|
cluster-enabled <YES/NO> | 是否 启用集群 | cluster-enabled yes |
cluster-config-file cluster-config-file <FILENAME> | 集群节点文件 | cluster-config-file nodes-6379.conf |
redis-cli --cluster create <IP1>:<PORT1> ... --cluster-replicas <N> | 创建集群 | redis-cli --cluster create 192.168.88.51:6379 192.168.88.52:6379 192.168.88.53:6379 192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379 --cluster-replicas 1 |
redis-cli --cluster info <IP>:<PORT> | 查看集群状态 | redis-cli --cluster info 192.168.88.51:6379 |
cluster-node-timeout <MILLISECONDS> | 集群超时 | cluster-node-timeout 5000 |
redis-cli --cluster check <IP>:<PORT> | 校验槽完整性 | redis-cli --cluster check 192.168.88.51:6379 |
redis-cli --cluster reshard <IP>:<PORT> | 槽迁移 | redis-cli --cluster reshard 192.168.88.51:6379 |
(五) 持久化命令
命令 | 描述 | 示例 |
---|---|---|
config set <KEY> <VAL> | 运行时修改 | config set maxmemory 1gb |
config set appendonly <YES/NO> | 是否启用 AOF | config set appendonly yes |
config get <KEY> | 查看配置 | config get maxmemory |
config rewrite | 保存运行时配置到文件 | config rewrite |
BGSAVE | 手动触发 RDB 快照(后台) | redis-cli BGSAVE |
BGREWRITEAOF | 手动触发 AOF 重写 | redis-cli BGREWRITEAOF |
LASTSAVE | 查看上次成功 RDB 时间戳 | redis-cli LASTSAVE |
redis-check-rdb <FILE> | 校验 RDB 完整性 | redis-check-rdb /var/lib/redis/dump.rdb |
redis-check-aof <FILE> | 校验 AOF 完整性 | redis-check-aof /var/lib/redis/appendonly.aof |
(六) 数据类型操作
- 数据类型表
数据类型 | 对应名称 | 描述 |
---|---|---|
String(单值) | 字符串类型 | 存储字符串值,支持多种操作,如设置、获取、追加等。 |
Hash(对象) | 哈希类型 | 存储键值对集合,类似于编程语言中的字典或对象。 |
List(队列) | 列表类型 | 存储有序的字符串列表,支持从头部或尾部插入和删除元素。 |
Set(去重) | 集合类型 | 存储无序的字符串集合,支持集合操作,如交集、并集、差集等。 |
Sorted Set(排序) | 有序集合类型 | 存储有序的字符串集合,每个元素关联一个分数,支持按分数排序。 |
Bitmap(位图) | 位图类型 | 存储位数组,支持对单个位的操作,适用于高效存储布尔值。 |
HyperLogLog(去重计数) | 超日志日志类型 | 用于统计唯一元素数量,内存占用小,精度高。 |
Stream(消息流) | 流类型 | 存储消息流,支持发布/订阅模式,适用于消息队列和事件流处理。 |
- 数据类型操作命令表
数据类型 | 命令 | 描述 | 示例 |
---|---|---|---|
String | |||
set <KEY><VALUE><SECONDS> | 设置键值对并设置过期时间(秒) | set user:1008 "Hannah" ex 10 | |
set <KEY><VALUE><MILLISECONDS> | 设置键值对并设置过期时间(毫秒) | set user:1009 "Ian" px 10000 | |
set <KEY><VALUE> | 只在键不存在时设置键值对 | set user:1010 "Jack" NX | |
set <KEY><VALUE> | 只在键存在时设置键值对 | set user:1010 "Julia" XX | |
get <KEY> | 获取键的值 | get user:1008 | |
mget <KEY1><KEY2> | 获取多个键的值 | mget user:1008 user:1009 | |
mset <KEY1><VALUE1><KEY2><VALUE2> | 同时设置多个键值对 | mset user:1011 "Alice" user:1012 "Bob" | |
incr <KEY> | 将键的值加 1 | incr user:1012 | |
incrby <KEY><INCREMENT> | 将键的值增加指定的增量 | incrby user:1012 2 | |
decr <KEY> | 将键的值减 1 | decr user:1012 | |
decrby <KEY><DECREMENT> | 将键的值减少指定的减量 | decrby user:1012 3 | |
append <KEY><VALUE> | 将值追加到键的现有值 | append user:1013 " Hello" | |
strlen <KEY> | 获取键值的长度 | strlen user:1013 | |
getrange <KEY><START><END> | 获取键值的子字符串 | getrange user:1013 0 5 | |
setrange <KEY><OFFSET><VALUE> | 从指定偏移量处替换键值 | setrange user:1013 0 "Hi" | |
getset <KEY><VALUE> | 设置新值并获取旧值 | getset user:1013 "NewValue" | |
List | |||
lpush <KEY><VALUE1><VALUE2> | 将值插入到列表头部 | lpush users "Alice" "Bob" | |
rpush <KEY><VALUE1><VALUE2> | 将值插入到列表尾部 | rpush users "Frank" "Grace" | |
lrange <KEY><START><END> | 获取列表的指定范围 | lrange users 0 -1 | |
llen <KEY> | 获取列表的长度 | llen users | |
lindex <KEY><INDEX> | 获取列表中指定索引的值 | lindex users 0 | |
lset <KEY><INDEX><VALUE> | 设置列表中指定索引的值 | lset users 0 "Alex" | |
lpop <KEY> | 从列表头部移除并返回值 | lpop users | |
rpop <KEY> | 从列表尾部移除并返回值 | rpop users | |
linsert <KEY><PIVOT><VALUE> | 在列表中指定位置插入值 | linsert users before "Charlie" "Brian" | |
lrem <KEY><COUNT><VALUE> | 从列表中移除指定值 | lrem users 2 "Bob" | |
ltrim <KEY><START><END> | 截取列表的指定范围 | ltrim users 0 2 | |
Hash | |||
hset <KEY><FIELD><VALUE> | 设置哈希表中的字段值 | hset user:1014 name "Hannah" | |
hmset <KEY><FIELD1><VALUE1><FIELD2><VALUE2> | 同时设置多个字段值 | hmset user:1015 name "Ian" age 30 email "ian@example.com" | |
hget <KEY><FIELD> | 获取哈希表中指定字段的值 | hget user:1015 name | |
hmget <KEY><FIELD1><FIELD2> | 获取多个字段的值 | hmget user:1015 email phone | |
hgetall <KEY> | 获取哈希表中所有字段和值 | hgetall user:1015 | |
hkeys <KEY> | 获取哈希表中所有字段名 | hkeys user:1015 | |
hvals <KEY> | 获取哈希表中所有字段值 | hvals user:1015 | |
hdel <KEY><FIELD> | 删除哈希表中的字段 | hdel user:1015 email | |
hlen <KEY> | 获取哈希表中字段的数量 | hlen user:1015 | |
hexists <KEY><FIELD> | 检查字段是否存在 | hexists user:1015 age | |
Set | |||
sadd <KEY><MEMBER1><MEMBER2> | 将成员添加到集合 | sadd hobbies "reading" "traveling" | |
smembers <KEY> | 获取集合中的所有成员 | smembers hobbies | |
sismember <KEY><MEMBER> | 检查成员是否在集合中 | sismember hobbies "traveling" | |
scard <KEY> | 获取集合中的成员数量 | scard hobbies | |
srem <KEY><MEMBER> | 从集合中移除成员 | srem hobbies "gaming" | |
sunion <KEY1><KEY2> | 获取多个集合的并集 | sunion hobbies myhobbies | |
sinter <KEY1><KEY2> | 获取多个集合的交集 | sinter hobbies myhobbies | |
sdiff <KEY1><KEY2> | 获取多个集合的差集 | sdiff hobbies myhobbies | |
srandmember <KEY><COUNT> | 随机获取集合中的成员 | srandmember myhobbies 2 | |
spop <KEY> | 随机移除并返回集合中的成员 | spop myhobbies | |
sdiffstore <DESTKEY><KEY1><KEY2> | 将差集存储到目标集合 | sdiffstore diffhobbies hobbies myhobbies | |
sunionstore <DESTKEY><KEY1><KEY2> | 将并集存储到目标集合 | sunionstore bothhobbies hobbies myhobbies | |
sinterstore <DESTKEY><KEY1><KEY2> | 将交集存储到目标集合 | sinterstore commonhobbies hobbies myhobbies | |
ZSet | |||
zadd <KEY><SCORE1><MEMBER1><SCORE2><MEMBER2> | 将成员添加到有序集合 | zadd scores 88 "Alice" 90 "Bob" | |
zrange <KEY><START><END> | 获取有序集合的指定范围 | zrange scores 0 -1 | |
zrange <KEY><START><END> | 获取有序集合的指定范围及分数 | zrange scores 0 -1 withscores | |
zscore <KEY><MEMBER> | 获取成员的分数 | zscore scores "Alice" | |
zrangebyscore <KEY><MIN><MAX> | 获取有序集合中指定分数范围的成员 | zrangebyscore scores 80 90 | |
zincrby <KEY><INCREMENT><MEMBER> | 增加成员的分数 | zincrby scores 3 "Charlie" | |
zcount <KEY><MIN><MAX> | 获取有序集合中指定分数范围的成员数量 | zcount scores 80 90 | |
zrem <KEY><MEMBER> | 从有序集合中移除成员 | zrem scores "Charlie" | |
zrank <KEY><MEMBER> | 获取成员在有序集合中的排名(升序) | zrank scores "Bob" | |
zrevrank <KEY><MEMBER> | 获取成员在有序集合中的排名(降序) | zrevrank scores "David" | |
zcard <KEY> | 获取有序集合中的成员数量 | zcard scores | |
zremrangebyrank <KEY><START><END> | 移除指定排名范围内的成员 | zremrangebyrank scores 0 2 | |
zremrangebyscore <KEY><MIN><MAX> | 移除指定分数范围内的成员 | zremrangebyscore scores 80 85 | |
Bitmap | |||
setbit <KEY><OFFSET><VALUE> | 设置位图中指定偏移量的值 | setbit bitmap:1 0 1 | |
getbit <KEY><OFFSET> | 获取位图中指定偏移量的值 | getbit bitmap:1 0 | |
bitcount <KEY> | 获取位图中值为 1 的位数 | bitcount bitmap:1 | |
bitfield <KEY><OP><OFFSET><VALUE> | 对位图进行多种操作(如设置、获取、自增等) | bitfield bitmap:1 set u8 0 1 | |
bitpos <KEY><BIT> | 查找位图中第一个指定值的偏移量 | bitpos bitmap:1 1 | |
HyperLogLog | |||
pfadd <KEY><ELEMENT1><ELEMENT2> | 添加元素到 HyperLogLog | pfadd hll:1 "Alice" "Bob" | |
pfcount <KEY> | 获取 HyperLogLog 中的近似元素个数 | pfcount hll:1 | |
pfmerge <DESTKEY><SOURCEKEY1><SOURCEKEY2> | 合并多个 HyperLogLog | pfmerge hll:3 hll:1 hll:2 | |
Stream | |||
xadd <KEY><ID><FIELD1><VALUE1><FIELD2><VALUE2> | 添加消息到流 | xadd stream:1 * name "Alice" age 25 | |
xread <KEY><ID> | 读取消息流 | xread count 2 block 0 streams stream:1 0-0 | |
xlen <KEY> | 获取流中的消息数量 | xlen stream:1 | |
xrange <KEY><START><END> | 获取流中的消息范围 | xrange stream:1 - + | |
xdel <KEY><ID> | 删除流中的消息 | xdel stream:1 1626146017501-0 | |
xtrim <KEY><MAXLEN> | 修剪流,保留指定数量的消息 | xtrim stream:1 maxlen 100 | |
xack <KEY><GROUP><ID> | 确认消息已被消费 | xack stream:1 mygroup 1626146017501-0 | |
xpending <KEY><GROUP> | 查看待处理的消息 | xpending stream:1 mygroup | |
xgroup create <KEY><GROUP><ID> | 创建消费者组 | xgroup create stream:1 mygroup $ | |
xreadgroup <GROUP><CONSUMER><KEY><ID> | 消费者组读取消息 | xreadgroup GROUP mygroup CONSUMER alice COUNT 2 STREAMS stream:1 > |
(七)事务与锁
命令 | 描述 | 示例 |
---|---|---|
multi | 开启事务块 | multi |
exec | 提交事务 | exec |
discard | 取消事务 | discard |
watch <KEY> | 乐观锁 | watch balance |
set <KEY> <VAL> NX PX <MSEC> | 分布式锁 | set lock:order1 1 NX PX 30000 |
(八)数据库与迁移
命令 | 描述 | 示例 |
---|---|---|
select <DB> | 切换数据库 | select 3 |
move <KEY> <DB> | 迁移键 | move user:1 3 |
exists <KEY> | 键存在检查 | exists user:1 |