Redis 持久化、事务、管道、锁 完整总结

Redis 持久化、事务、管道、锁 完整总结

一、Redis 持久化

作用:将内存中的数据存储到磁盘,防止数据库意外宕机导致数据丢失。

方案:RDB、AOF


二、RDB 持久化

1.概念

每隔一段时间,将内存中的数据作为快照写入磁盘临时文件;恢复时将快照文件读入内存。

2.特点

  • 全备,恢复很快
  • 数据传输方便,只有 1 个文件
  • 数据较多时,生成快照速度较慢
  • 故障时可能丢失最后一次备份后的数据

3.配置与操作

  1. 查看配置

    • 存储位置:/etc/redis.confdir /opt/redis-8.6
    • 文件名:dbfilename "dump.rdb"
    • Redis 内查看:
      • config get dir
      • config get dbfilename
  2. 修改存储位置为 /redisdata

    • dir /redisdata
    • 注意:修改后旧数据无法加载,需手动迁移
  3. 设置快照时间

    • save 10 2:每 10 秒内有两次修改就备份
  4. 重启服务

    redis-cli -a 12345678 shutdown
    redis-server /etc/redis.conf
    
  5. 恢复旧数据

    • 停止服务

    • 拷贝原目录 dump.rdb 到新目录:

      cp /opt/redis-8.6/dump.rdb /redisdata/
      
    • 启动服务即可加载旧数据

  6. 常用命令

    • save:生成 RDB(阻塞,线上禁止)
    • bgsave:后台生成 RDB(不阻塞)
    • lastsave:查看上次保存时间戳
    • date -d @时间戳:转换为可读时间
    • redis-check-rdb 文件:检查 RDB 是否损坏
  7. 触发 RDB 条件

    • 达到 save 配置规则
    • 执行 shutdown
    • 手动 save /bgsave
    • 主从复制时触发
    • 禁用 RDB:save ""

三、AOF 持久化

1.概念

以日志方式记录用户写操作,追加到 AOF 文件;默认不开启。

Fork 子进程处理新数据,先写缓存再刷盘。

2.配置

save ""            # 禁用 RDB
dir /redisdata/
appendonly yes     # 开启 AOF
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec

3.appendfsync 策略

  • everysec:每秒同步(默认,最多丢 1s 数据)
  • no:由操作系统控制刷盘
  • always:每次操作都写磁盘(IO 大,不推荐)

4.重启与查看

redis-cli -a 12345678 shutdown
redis-server /etc/redis.conf
cd /redisdata/
ll
ll appendonlydir/

5.误操作 flushdb 恢复步骤

  1. 执行 flushdb,数据清空
  2. 停止 Redis 服务
  3. 编.辑 AOF 增量文件,删除最后 flushdb 命令
  4. 启动服务,数据恢复

6.AOF 重写

作用:AOF 文件过大时进行瘦身,合并冗余命令,节省空间。


四、RDB 和 AOF 对比

  • 生成速度:AOF 快,RDB 慢
  • 恢复速度:RDB 快,AOF 慢
  • 文件大小:RDB 小,AOF 大
  • 文件类型:RDB 二进制,AOF 文本可修改
  • 数据安全:AOF 丢失更少,RDB 可能丢较多

五、混合持久化

  • AOF 与 RDB 可同时开启,AOF 优先级更高
  • 重启只加载 AOF,不加载 RDB
  • 默认开启混合模式:aof-use-rdb-preamble yes

六、Redis 事务

1.概念

一组操作集合,不可分割;执行时不被其他命令插队;提交前只入队不执行。

Redis 单线程,事务不支持回滚。

2.与 MySQL 事务区别

MySQL 可回滚;Redis 事务只保证顺序执行,出错不回滚。

3.常用命令

  • MULTI:开启事务
  • 命令入队,显示 QUEUED
  • EXEC:执行事务
  • DISCARD:放弃事务

4.事务出错情况

  1. 语法错误

    (如不存在命令)

    → 整个事务被丢弃,EXEC 报错,全部不执行

  2. 逻辑错误

    (如对字符串 incr)

    → 正确命令执行,错误命令报错,部分成功


七、Redis 管道(PIPE)

1.作用

优化频繁命令往返的网络性能瓶颈,减少 TCP 连接开销。

2.特点

  • 一次发送多个命令
  • 依次执行,不保证原子性
  • 命令不宜过多,避免客户端阻塞

3.使用方式

  1. Python 使用

    • r.pipeline() 批量命令
    • 最后 pipe.execute()
  2. Shell 使用

    cat cmd.txt | redis-cli -a 12345678 --pipe
    

    命令独立执行,各自返回结果。

4.PIPE 与事务区别

管道仅打包发送命令,不保证原子性;事务保证原子性执行。


八、Redis 锁(乐观锁)

1.锁类型

  • 悲观锁:MySQL,先加锁再使用
  • 乐观锁:Redis,使用 WATCH 实现

2.使用步骤

  1. WATCH key 监控 key

  2. MULTI 开启事务

  3. 命令入队

  4. EXEC
    

    执行

    • 若执行前其他客户端修改了该 key → EXEC 返回 nil,事务失败
    • 未修改则正常执行

3.取消监控

  • UNWATCH:取消所有 key 监控
posted @ 2026-04-11 18:09  bx_xr  阅读(14)  评论(0)    收藏  举报