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

Redis-持久化

Redis-持久化

  • 前言
  • 一、RDB
  • 二、AOF


前言

Redis是内存型数据库
当redis服务被Kill掉,重新启动,查看数据,发现数据会被清空

kill -9 20025
redis-server /etc/redis.conf
redis-cli -h 127.0.0.1 -p 6379 -a 12345678

持久化:将内存中数据存储到磁盘
两种模式:RDB和AOF


一、RDB

RDB - Redis DataBase
每隔一段时间(配置),将内存中的数据作为快照写入磁盘上的临时文件,恢复时将快照文件读入内存

快照文件RDB文件

优点

  • 每隔一段时间备份一次(快照) -> 全备
  • 异地备份很简单
  • 数据恢复速度快

缺点

  • 如果发生故障时,最后数据没有达到写入条件,无法及时备份(导致数据丢失)
  • RDB需要fork() 在磁盘上完成持久化,如果频率太高,增加CPU负担

适应场景

  • 大规模的数据恢复
  • 对数据完整性和一致性要求不高

配置/etc/redis.conf

# dir ./                  
dir /redisdata/
# 保存的文件名
dbfilename dump.rdb
# 配置保存触发条件
# 在3600s内,如果超过1个Key发生了变化就写一次RDB文件
# save 3600 1 300 100 60 10000
save 10 2

手动创建目录

mkdir /redisdata/

测试

  • 看是否触发了保存RDB文件:
    set k1
    ll /redisdata -> date

  • kill杀死
    会有一些没有保存的数据丢失

  • shutdown停服务
    会在停之前进行一次快照

保存备份

[root@db redisdata]# cp dump.rdb dump-202508301515.rdb

模拟数据误删除

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)

恢复数据

127.0.0.1:6379> shutdown# 恢复备份
[root@db redisdata]#cp dump-202508301515.rdb dump.rdb
# 重启服务
[root@db redisdata]#redis-server /etc/redis.conf 
[root@db redisdata]#redis-cli -a 123456# 查看
127.0.0.1:6379> keys *1) "k6"2) "k5"3) "k3"

手动触发保存RDB文件

127.0.0.1:6379> save
OK
127.0.0.1:6379> bgsave (默认-fork一个子进程)
Background saving started

save:同步生成快照,会阻塞主进程(不推荐在生产环境使用)
bgsave:后台异步生成快照,不阻塞主进程(推荐)

查看最后一次SAVE的时间

>127.0.0.1:6379> lastsave
(integer) 1756539119
# date -d @1756539119
2025年 08月 30日 星期六 15:31:59 CST

自动触发

  • 根据配置项自动触发
  • 当shutdown自动触发
  • flushall/flushdb自动触发
  • 主从复制,主节点自动触发

传输过程,异常宕机 -> 修复rdb

[root@db redisdata]# redis-check-rdb /redisdata/dump.rdb
[offset 0] Checking RDB file /redisdata/dump.rdb
[offset 26] AUX FIELD redis-ver = ‘8.2.1’
[offset 40] AUX FIELD redis-bits = ‘64’
[offset 52] AUX FIELD ctime = ‘1756539119’
[offset 67] AUX FIELD used-mem = ‘773448’
[offset 79] AUX FIELD aof-base = ‘0’
[offset 81] Selecting DB ID 0
[offset 168] Checksum OK
[offset 168] \o/ RDB looks OK! \o/
[info] 12 keys read
[info] 0 expires
[info] 0 already expired
[info] 0 subexpires

不想启用RDB快照
配置文件 -> save ""


二、AOF

Append Only File

用记写操作以日志的形式记录下来
文件被追加而不是修改

默认Redis没有开启AOF => appendonly no

AOF优势

  • AOF实时性比较好,当写之后,触发追加 => 缓存层(默认1s) => 磁盘
  • 当数据过大,redis会在后台自动 重写AOF文件,节省空间

AOF缺点

  • 相同数据集 AOF文件一般大于RDB文件
  • AOF有写入策略,整体速度慢于RDB

数据写入过程

AOF支持3种写入策略

  • everysec(默认):每秒一次
  • always: 每次将新命令附加到AOF,速度慢(磁盘IO大),但最安全
  • no: 操作系统控制回写,速度快,安全性差一点
  1. 配置启用AOF
[root@db redisdata]# vim /etc/redis.conf
appendonly yes 
appendfsync everysec
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
# 暂时停用RDB
save ""
  1. 重启
127.0.0.1:6379> shutdown
not connected> 
[root@db redisdata]# redis-server /etc/redis.conf 
[root@db redisdata]# redis-cli -a 12345678
  1. 测试
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k1 2
OK
127.0.0.1:6379> set k1 3
OK
# 观察AOF文件是否生成且更新 
[root@db appendonlydir]# ll
总用量 12
-rw-r--r-- 1 root root  88 830 16:17 appendonly.aof.1.base.rdb
-rw-r--r-- 1 root root 107 830 16:20 appendonly.aof.1.incr.aof
-rw-r--r-- 1 root root 102 830 16:18 appendonly.aof.manifest

xx.aof.base.rdb # 全备
xx.aof.1.incr.aof # 增量
xx.aof.mnifest # 清单/目录

  1. 重启看看数据有没有正常加载

修复AOF文件 -> redis-check-aof

模拟aof文件出错

vim appendonly.aof.1.incr.aof
在aof文件末尾添加一些内容

[root@db appendonlydir]# redis-check-aof --fix appendonlydir/appendonly.aof.1.incr.aof 
Start checking Old-Style AOF
AOF appendonlydir/appendonly.aof.1.incr.aof format error
AOF analyzed: filename=appendonlydir/appendonly.aof.1.incr.aof, size=130, ok_up_to=107, ok_up_to_line=27, diff=23
This will shrink the AOF appendonlydir/appendonly.aof.1.incr.aof from 130 bytes, with 23 bytes, to 107 bytes
Continue? [y/N]: y
Successfully truncated AOF appendonlydir/appendonly.aof.1.incr.aof

启动服务,查看数据

AOF瘦身

AOF持久化通过将写操作追加到AOF文件实现的 => AOF文件会不断变大

  1. 占磁盘空间
  2. 恢复时间变长

重写机制

  • 当AOF文件超过设置大小(条件),Redis自动启动AOF文件内容压缩
  • bgrewriteaof

AOF文件重写并不对原文件内容进行整理 => 而是直接读取服务器现有的键值对,用一条命令替代之前的修改操作,生成新的文件替换原来的AOF

两个条件需要同时满足

# 当前文件大达增长百分比(100)
auto-aof-rewrite-percentage 100
# 文件至少达到64M
auto-aof-rewrite-min-size 64mb

手动触发

127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

rewrite => 不是分析原来AOF文件,而是读取当前Redis内存中数据进行分析

  1. 启动一个重写子进程 -> 读取当前Redis内存中数据,将它分析压缩放到新AOF文件
  2. 主进程写命令放到内存缓冲区,同时写入原有AOF
  3. 重写子进制完成重写工作后,给父进程发一个信号 -> 父进程收到信号后会将数据写入新的AOF文件中

AOF和RDB可以共存
AOF优先级高
同时启用RDB和AOF,重启只会加载AOF文件,不会RDB
aof-use-rdb-preamble yes


文章转载自:

http://1XDhMUwj.jghqc.cn
http://khxLUIVL.jghqc.cn
http://zxcSEjAM.jghqc.cn
http://t5CaDscl.jghqc.cn
http://ev9R1ize.jghqc.cn
http://pOF8rTiX.jghqc.cn
http://sjC28zCF.jghqc.cn
http://dFOBFvvc.jghqc.cn
http://VEVl0L2a.jghqc.cn
http://2BwdbwgW.jghqc.cn
http://9q980cRL.jghqc.cn
http://h7q7wU1K.jghqc.cn
http://hNafKBgH.jghqc.cn
http://6NCFxcKk.jghqc.cn
http://ZdU6WKhp.jghqc.cn
http://jOQTezSF.jghqc.cn
http://T1qT4LHw.jghqc.cn
http://QGgYYTFj.jghqc.cn
http://AfvokeXX.jghqc.cn
http://wjzf5GZA.jghqc.cn
http://UNRmUYtw.jghqc.cn
http://S6sqlhR4.jghqc.cn
http://8YwLtVmX.jghqc.cn
http://48WU3znw.jghqc.cn
http://Bw4SLAa7.jghqc.cn
http://bEjWVwlJ.jghqc.cn
http://mwvClBm4.jghqc.cn
http://R6HbpDoP.jghqc.cn
http://cP67tD7a.jghqc.cn
http://7xF25Z5i.jghqc.cn
http://www.dtcms.com/a/368282.html

相关文章:

  • 寻找AI——初识3D建模AI
  • Playwright MCP Server - FAQ
  • Linux系统TCP/IP网络参数优化
  • 多模联邦查询网关:ABP + Trino/Presto 聚合跨源数据
  • 基于单片机智能家居环境检测系统/室内环境检测设计
  • 23种设计模式-模板方法模式
  • 容器学习day05_k8s(二)
  • ES04-批量写入
  • 大数据毕业设计推荐:基于Spark的零售时尚精品店销售数据分析系统【Hadoop+python+spark】
  • 企业数字安全双保险:终端安全与数据防泄漏如何构筑全方位防护体系
  • 信息系统安全保护措施文件方案
  • 【C++】 list 容器模拟实现解析
  • 鹿客发布旗舰新品AI智能锁V6 Max,打造AI家庭安全领域新标杆
  • 【GEOS-Chem 输入数据】使用 AWS CLI 访问 GEOS-Chem 数据
  • 23种设计模式——原型模式 (Prototype Pattern)详解
  • 《Cocos Creator的2D、3D渲染使用记录》
  • Conda 使用py环境隔离
  • 数据结构:栈和队列力扣算法题
  • 深度学习之第八课迁移学习(残差网络ResNet)
  • 数据一致性、AI样本可追溯性与数据治理
  • 基于MATLAB的CNN大气散射传播率计算与图像去雾实现
  • 【Redis】初识 Redis 与基础数据结构
  • 分布式常见面试题整理
  • “卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
  • 数字时代的 “安全刚需”:为什么销售管理企业都在做手机号码脱敏
  • 乐观并发: TCP 与编程实践
  • 两条平面直线之间通过三次多项式曲线进行过渡的方法介绍
  • if __name__=‘__main__‘的用处
  • MySQL知识回顾总结----数据类型
  • WeaveFox AI智能开发平台介绍