当前位置: 首页 > news >正文

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的主从复制哨兵的配置及数据持久化RDBAOF)的实现,最后也提供了一个用来参考的Redis相关的命令和配置信息表

一、Redis主从复制

 (一)Redis主从复制介绍

  • Redis 主从复制是实现高可用性的重要机制。
  • 主节点负责处理客户端的读写请求,执行数据的写入操作并维护数据的最新状态
  • 从节点通过异步复制机制定期从主节点拉取数据,保持数据的一致性,并能够处理只读请求,从而实现读写分离,提升系统的读取性能。

 (二)基本环境准备

  • 主机准备
主机名IP地址角色密码
Redis57192.168.88.57Mastertest
Redis58192.168.88.58Slave1-
Redis59192.168.88.59Slave2-
  • :如无密码,则忽略所有 requirepass masterauth 配置即可,配置SELINUX和关闭防火墙。

(三)工作原理

  • 建立复制链路
    • 从节点启动后,向主节点发送 PSYNC <replid> <offset>2.8+ 支持部分同步;旧版发送 SYNC)。
    • 主节点根据 replidoffset 判断是否需要 全量同步增量同步
  • 全量同步流程
    • 主节点执行 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)已原生支持,无需人工介入。

故障转移流程

  • 持续探测:每个哨兵每秒向主节点及所有从节点发送 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-ipannounce-port,确保地址可识别;
  • 配置仅一行:sentinel monitor <master-name> <ip> <port> <quorum>

与 Redis Cluster 的差异

  • Sentinel 面向主从模式,单分片容量受单机内存限制,侧重“单分片高可用
  • Cluster 面向数据分片,横向扩展更佳,但无内置选主,需自行实现故障转移

(二)基本环境准备

节点IP角色端口作用
Redis60192.168.88.60Master6379读写主节点
Redis61192.168.88.61Slave6379主备切换候选
Redis62192.168.88.62Sentinel26379监控 + 故障转移

(三)哨兵配置

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地址
Redis63192.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 秒丢失平衡通用业务
noOS(操作系统) 调度不可控最高日志类

重写机制

  • 自动触发
    • 触发条件:文件大小 ≥ 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>设置监听 IPbind 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安装 Redisyum -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>是否启用 AOFconfig 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>将键的值加 1incr user:1012
incrby <KEY><INCREMENT>将键的值增加指定的增量incrby user:1012 2
decr <KEY>将键的值减 1decr 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>添加元素到 HyperLogLogpfadd hll:1 "Alice" "Bob"
pfcount <KEY>获取 HyperLogLog 中的近似元素个数pfcount hll:1
pfmerge <DESTKEY><SOURCEKEY1><SOURCEKEY2>合并多个 HyperLogLogpfmerge 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

 

http://www.dtcms.com/a/279301.html

相关文章:

  • 第五章 uniapp实现兼容多端的树状族谱关系图,剩余组件
  • 学习C++、QT---25(QT中实现QCombobox库的介绍和用QCombobox设置编码和使用编码的讲解)
  • SQL ORM映射框架深度剖析:从原理到实战优化
  • 【Unity】MiniGame编辑器小游戏(十三)最强射手【Shooter】(下)
  • ElasticSearch重置密码
  • 嵌入式 Linux开发环境构建之Source Insight 的安装和使用
  • c++算法二
  • 不同Linux版本下安装Synopsys工具的差异与选择建议
  • PyTorch 数据加载全攻略:从自定义数据集到模型训练
  • [Pytorch]深度学习-part1
  • 策略模式及优化
  • LangChain面试内容整理-知识点16:OpenAI API接口集成
  • Linux操作系统之信号:信号的产生
  • 观察应用宝进程的自启动行为
  • Spring Boot启动原理:从main方法到内嵌Tomcat的全过程
  • vue vxe-tree 树组件加载大量节点数据,虚拟滚动的用法
  • 每日mysql
  • # 检测 COM 服务器在线状态
  • 在Linux下git的使用
  • 7.14练习案例总结
  • 渗透第一次总结
  • ThreadLocal内部结构深度解析(Ⅰ)
  • Olingo分析和实践——整体架构流程
  • idea下无法打开sceneBulider解决方法
  • JavaScript书写基础和基本数据类型
  • 关于僵尸进程
  • SwiftUI 全面介绍与使用指南
  • SSM框架学习——day1
  • 爬虫-爬取豆瓣top250
  • webrtc之子带分割下——SplittingFilter源码分析