陪你一起学redis(三)——redis数据持久化

152 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

前言

redis本质上是一个内存数据库,为了保证数据的安全性,对redis的数据进行持久化是很有必要的。本文我们一起探讨下redis的持久化问题

分类

  • RDB持久化
  • AOF持久化
  • RDB和AOF混合持久化

RDB持久化

RDB持久化方式,又叫快照,是redis默认采用的持久化方式,即当符合一定条件的时候,redis会将内存中的数据进行快照并持久化到硬盘。

设置规则

编辑redis.conf配置文件,如下图: image.png

#save 多少秒内 数据变了多少 
save "" : #不使用RDB存储 
save 900 1 : #表示15分钟(900秒钟)内至少1个键被更改则进行快照。 
save 300 10 : #表示5分钟(300秒)内至少10个键被更改则进行快照。 
save 60 10000 :#表示1分钟内至少10000个键被更改则进行快照。

什么时候触发RDB

  • 符合指定配置的快照规则
  • 执行sava或bgsave命令
  • 执行flushall 或flushdb
  • 执行主从复制操作

实现原理

RDB的过程

  1. Redis 调用系统中的 fork 函数复制一份当前进程的副本(子进程)
  2. 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。
  3. 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此,一次快照操作完成。 1650622029(1).jpg

注意事项

  1. Redis 在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的
  2. 我们可以通过定时备份RDB文件来实现Redis数据库的备份,RDB文件是经过压缩的二 进制文件,占用的空间会小于内存中的数据,更加利于传输

RDB优缺点

  • 缺点:使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。
  • 优点:RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子 进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘 I/O 操作。同 时这个也是一个缺点,如果数据集比较大的时候, fork 可以能比较耗时,造成服务器在一段时间 内停止处理客户端的请求。

AOF持久化

AOF持久化,默认情况下redis是没用开启的,需要我们手动开启。开启之后,每执行一条会更改Redis中的数据的命令,Redis 就会将该命令写入硬盘中的AOF文件,即为AOF持久化。

开启AOF持久化

编辑redis.conf配置文件,如下图:

1650622719(1).jpg

# 可以通过修改redis.conf配置文件中的appendonly参数开启 
appendonly yes 
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。 
dir ./ 
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改 
appendfilename appendonly.aof

同步磁盘数据规则

Redis每次更改数据的时候,AOF机制都会将命令记录到AOF文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存,再通过硬盘缓存机制去刷新到保存到文件。

image.png

# 每次执行写入都会进行同步, 这个是最安全但是是效率比较低的方式
appendfsync always
# 每一秒执行(默认)
appendfsync everysec
# 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
appendfsync no

AOF重写原理

Redis可以在AOF文件体积变得过大时,自动地在后台对AOF进行重写。重写后的新AOF文 件包含了恢复当前数据集所需的最小命令集合。由于AOF文件有序地保存了对数据库执行的所有写入操作,这些写入操作以 Redis 协议(RESP)的格式保存, 因此AOF文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。样例如下:

set k1 333 
lpush 1 2 3 
lpush 4 5 6

RDB和AOF混合持久化

RDB和AOF混合持久化是Redis4.0之后新增的方式,混合持久化是结合了RDB和AOF的优点,在写入的时候,先把当前 的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以AOF的格式存入文件,这样既能保证Redis重启时的速度,又能减低数据丢失的风险。

配置

编辑redis.conf配置文件,如下图:

1650623376(1).jpg

说明

RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响Redis 的启动速度,为了能同时拥有 RDB 和 AOF 的优点,Redis 4.0 之后新增了混合持久化的方 式,因此我们在必须要进行持久化操作时,应该选择混合持久化的方式

结束

需要交流学习可以关注公众号【温故知新之java】,互相学习,一起进步。