一文深度剖析Redis6的持久化机制(简洁易懂)

这里只需要了解当执行复制操作时,即时没有定义自动快照规则,并且没有手动执行过快照操作,它仍然会生成RDB快照文件。

RDB数据恢复演示


  • 准备初始数据

redis> set k1 1

redis> set k2 2

redis> set k3 3

redis> set k4 4

redis> set k5 5

  • 通过shutdown命令关闭触发save

redis> shutdown

  • 备份dump.rdb文件(用来后续恢复)

cp dump.rdb dump.rdb.bak

  • 接着再启动redis-server(systemctl restart redis_6379),通过keys命令查看,发现数据还在

keys *

模拟数据丢失

  • 执行flushall

redis> flushall

  • shutdown(重新生成没有数据的快照,用来模拟后续的数据恢复)

redis> shutdown

  • 再次启动redis, 通过keys 命令查看,此时rdb中没有任何数据。

  • 恢复之前备份的rdb文件(之前保存了数据的rdb快照)

mv dump.rdb.bak dump.rdb

  • 再次重启redis,可以看到之前快照保存的数据

keys *

文件的优势和劣势


一、优势

1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集,这种文件非常适合用于进行备份和灾难恢复。

2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。

3.RDB 在恢复大数据集时的速度比AOF的恢复速度要快。

二、劣势

  • 1、RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,频繁执行成本过高

  • 2、在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照之后的所有修改(数据有丢失)。

如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化。

AOF模式

=====

AOF(Append Only File):Redis 默认不开启。AOF采用日志的形式来记录每个写操作,并追加到文件中。开启后,执行更改Redis数据的命令时,就会把命令写入到AOF文件中。

Redis 重启时会根据日志文件的内容把写指令从前到后执行一次以完成数据的恢复工作。

AOF配置开关


开关

appendonly no /yes

文件名

appendfilename “appendonly.aof”

通过修改redis.conf重启redis之后:systemctl restart redis_6379。

再次运行redis的相关操作命令,会发现在指定的dir目录下生成appendonly.aof文件,通过vim查看该文件内容如下

*2

$6

SELECT

$1

0

*3

$3

set

$4

name

$3

mic

*3

$3

set

$4

name

$3

123

AOF配置相关问题解答


问题1:数据都是实时持久化到磁盘吗?

虽然每次执行更改Redis数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。在默认情况下系统每30秒会执行一次同步操作。以便将硬盘缓存中的内容真正地写入硬盘。

在这30秒的过程中如果系统异常退出则会导致硬盘缓存中的数据丢失。一般来说能够启用AOF的前提是业务场景不能容忍这样的数据损失,这个时候就需要Redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中。在redis.conf中通过如下配置来设置同步机制。

| 参数 | 说明 |

| — | — |

| appendfsync everysec | AOF持久化策略(硬盘缓存到磁盘),默认everysec

1 no 表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;

2 always 表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低;

3 everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。 |

问题2:文件越来越大,怎么办?

由于AOF持久化是Redis不断将写命令记录到 AOF 文件中,随着Redis不断的运行,AOF 的文件会越来越大,文件越大,占用服务器内存越大以及 AOF 恢复要求时间越长。

例如set gupao 666,执行1000次,结果都是gupao=666。

为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。

可以使用命令下面这个命令主动触发重写

redis> bgrewriteaof

AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。

重写触发机制如下

| 参数 | 说明 |
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

[外链图片转存中…(img-HLiqomHl-1711482901919)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值