Redis 持久化

Redis 系列笔记:

第一篇:Redis 基础命令
第二篇:Redis 常见应用场景
第三篇:Redis Cluster集群搭建
第四篇:Redis 主从及哨兵搭建
第五篇:Redis 主从及集群
第六篇:Redis 持久化
第七篇:Redis 分布式锁
第八篇:Redis 底层数据存储结构
第九篇:Redis 面试常问问题


Redis的持久化

redis的持久化有两种aof和rdb,默认情况下,使用快照RDB的持久化方式。
配置可以在redis.conf文件中查看或者通过命令查看

1. RDB

1.1. 配置

命令查看:config get 配置项

127.0.0.1:6379> config get save
1) "save"
2) "900 1 300 10 60 10000"

配置文件redis.conf中RDB相关策略

save 900 1	#900秒内,如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内,如果超过10个key被修改,则发起快照保存
save 60 10000 #60秒内,如果1万个key被修改,则发起快照保存

dbfilename dump.rdb # RDB 文件名称

rdbcompression yes(|no) # rdb 文件中压缩启用配置,基本语法格式; 如果 rdbcompression 配置为 yes,那么即代表 redis 进行 RDB 文件生成中,如果遇到字符串对象并且其中的字符串值占用超过 20 个字节,那么就会对字符串进行 LZF 算法进行压缩。

stop-writes-on-bgsave-error yes(|no) # 如果进行 RDB 备份文件生成过程中,遭遇错误,是否停止 redis 提供写服务,以警示用户 RDB 备份异常,默认是开启状态。

dir ./ # dir 配置的是 rdb 文件存放的目录,默认是当前目录。

rdbchecksum yes(|no) # 是否使用 CRC64 校验算法校验 RDB 文件是否发生损坏,默认开启状态,如果你需要提升性能,可以选择性关闭。

1.2. 触发机制

触发RDB持久化过程分为 手动触发自动触发

1.2.1 手动触发

使用savebgsve两个命令触发RDB持久化。

save:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞。(save命令已经废弃)
bgsave:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。

1.2.2 自动触发

1)使用redis.conf中save相关配置,如“save m n ” 表示m秒内数据集存在n次修改时,自动触发bgsave
2)如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点。
3)执行debug reload 命令重新加载redis时,也会自动触发save操作
4)默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行bgsave.

1.3. 数据恢复

注意:数据恢复会优先加载 aof 文件,如果要记载 rdb 数据需要先将 appendonly 配置改为 no

保证安装目录下的dump.rdb存在,重新启动就能加载到数据,更复杂的情况这里就不多说了

127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/redis/bin"
127.0.0.1:6379> 
[root@VM-0-12-centos bin]# ls
dump.rdb redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server
[root@VM-0-12-centos bin]# 

1.4. 优缺点

优点

  • RDB文件是一个紧凑的二进制压缩文件,是Redis在某个时间点的全部数据快照。所以使用RDB恢复数据的速度远远比AOF的快,非常适合备份、全量复制、灾难恢复等场景。

缺点

  • 每次进行bgsave操作都要执行fork操作创建子经常,属于重量级操作,频繁执行成本过高,所以无法做到实时持久化,或者秒级持久化。
  • 由于Redis版本迭代问题,存在不同格式的RDB版本,有可能出现低版本的RDB格式无法兼容高版本RDB文件的问题。

2. AOF

AOF是每次写命令追加写入日志中,主要作用是解决了数据持久化的实时性。
AOF的持久化有三步:命令写入(append)、文件同步(sync)、文件重写(rewrite)。

2.1. 配置

redis.conf中AOF相关配置策略:

appendonly yes # 把 no 改为 yes

appendfilename "appendonly.aof" # 存储文件名

# 策略配置
# always: 每次操作都会立即写入aof文件中
# everysec(默认): 每秒持久化一次,默认
# no: 不主动进行同步操作,默认30s一次
appendsync always|everysec|no # 调用 fsync 函数,将缓冲区里面的命令写入到硬盘。

# 自动触发AOF重写配置策略。如下所示:修改 Redis 配置文件,让服务器自动执行 BGREWRITEAOF 命令。
# 该配置项表示:触发重写所需要的 aof 文件体积百分比,只有当 aof 文件的增量大于 100% 时才进行重写,也就是大一倍。
# 比如,第一次重写时文件大小为 64M,那么第二次触发重写的体积为 128M,第三次重写为 256M,以此类推。如果将百分比值设置为 0 就表示关闭 AOF 自动重写功能。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb #表示触发AOF重写的最小文件体积,大于或等于64MB自动触发。

2.2. 触发机制

2.2.1. 命令写入(append)触发机制

执行修改命令后保存至缓冲区等待 sync 同步到文件中

2.2.2. 文件同步(sync)触发机制

根据配置文件中的appendsync 参数配置触发

2.2.3. 重写(rewrite)触发机制

Rewrite原理 : 重写AOF文件的操作,并没有读取旧的AOF文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的AOF文件,这点和快照有点类似。

AOF文件的重写过程的触发,由上面配置的rewrite参数决定。可以手动触发和自动触发。

2.2.3.1. 手动触发

通过使用bgrewriteaof命令触发AOF的重写机制。

2.2.3.2. 自动触发

根据auto-aof-rewrite-min-sizeauto-aof-rewrite-percentage参数确定自动触发时机,当两个条件同时满足时,就会触发重写。

流程图如下:

2.3. 数据恢复

保证安装目录下的appendonly.aof存在,重新启动就能加载到数据。
当不小心执行了 flushall清除了所有的数据后,打开 appendonly.aof 的文件
删除末尾的

*2
$6
SELECT
v3
flushall
[root@VM-0-12-centos bin]# redis-check-aof appendonly.aof # 最好利用 redis-check-aof 这个工具来检测一下你修改过后的 AOF 文件是否正常,以防启动恢复数据的时候出错
AOF analyzed: size=100, ok_up_to=100, diff=0
AOF is valid

redis-check-aof --fix appendonly.aof 可对 appendonly.aof 进行修复

2.4. 优缺点

优点

  • 每一次修改都同步,文件完整性更高。
  • 可以根据具体业务,选择同步的参数,可以兼顾性能和同步的实时性。每一秒同步一次,可只会丢失1秒钟的数据。

缺点

  • AOF文件远大于RDB文件,数据恢复速度比rdb慢。

3. RDB和AOF混合方式

RDB 和 AOF 各有其优缺点, Redis 4.0 之后推出的 RDB-AOF 混合持久化模式,即以 RDB 作为全量备份,AOF 作为增量备份。修改配置文件redis.conf:

aof-use-rdb-preamble yes

aof-use-rdb-preamble 设置为 yes 时,表示开启 RDB-AOF 混合持久化模式

在该模式下,AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容,该文件的前半段是 RDB 格式的全量数据,而后半段是 Redis 命令格式的增量数据,这个方法既能享受到 RDB 文件快速恢复的好处,又能享受到 AOF 只记录操作命令的简单优势, 实际环境中用的很多


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久的可能面试问题: 1. Redis持久有哪些方式? Redis持久有两种方式,一种是 RDB 持久,一种是 AOF 持久。 2. RDB 持久和 AOF 持久有什么区别? RDB 持久是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久机制是如何保证数据一致性的? Redis持久机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久可以在运行时进行吗? 可以,Redis持久可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久,或者从 AOF 切换到 RDB 持久。 5. Redis持久会对性能产生影响吗? 会,Redis持久会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久可以与 Redis 集群一起使用吗? 可以,Redis持久可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久方式,并进行合理的配置和优。在面试中,还需要了解 Redis 持久的原理、机制、优缺点、与集群的结合等方面的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值