一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情
前言
redis本质上是一个内存数据库,为了保证数据的安全性,对redis的数据进行持久化是很有必要的。本文我们一起探讨下redis的持久化问题
分类
- RDB持久化
- AOF持久化
- RDB和AOF混合持久化
RDB持久化
RDB持久化方式,又叫快照,是redis默认采用的持久化方式,即当符合一定条件的时候,redis会将内存中的数据进行快照并持久化到硬盘。
设置规则
编辑redis.conf配置文件,如下图:
#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的过程
- Redis 调用系统中的 fork 函数复制一份当前进程的副本(子进程)
- 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。
- 当子进程写入完所有数据后会用该临时文件替换旧的 RDB 文件,至此,一次快照操作完成。
注意事项
- Redis 在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的
- 我们可以通过定时备份RDB文件来实现Redis数据库的备份,RDB文件是经过压缩的二 进制文件,占用的空间会小于内存中的数据,更加利于传输
RDB优缺点
- 缺点:使用RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。
- 优点:RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子 进程,然后这个子进程就会处理接下来的所有保存工作,父进程无需执行任何磁盘 I/O 操作。同 时这个也是一个缺点,如果数据集比较大的时候, fork 可以能比较耗时,造成服务器在一段时间 内停止处理客户端的请求。
AOF持久化
AOF持久化,默认情况下redis是没用开启的,需要我们手动开启。开启之后,每执行一条会更改Redis中的数据的命令,Redis 就会将该命令写入硬盘中的AOF文件,即为AOF持久化。
开启AOF持久化
编辑redis.conf配置文件,如下图:
# 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。
dir ./
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof
同步磁盘数据规则
Redis每次更改数据的时候,AOF机制都会将命令记录到AOF文件,但是实际上由于操作系统的缓存机制,数据并没有实时写入到硬盘,而是进入硬盘缓存,再通过硬盘缓存机制去刷新到保存到文件。
# 每次执行写入都会进行同步, 这个是最安全但是是效率比较低的方式
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配置文件,如下图:
说明
RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响Redis 的启动速度,为了能同时拥有 RDB 和 AOF 的优点,Redis 4.0 之后新增了混合持久化的方 式,因此我们在必须要进行持久化操作时,应该选择混合持久化的方式
结束
需要交流学习可以关注公众号【温故知新之java】,互相学习,一起进步。