Redis持久化详解
Redis
是一款高性能的key-value
型数据库,在项目中使用也非常广泛,每一个开发人员都应该掌握这项技能。在今天的这篇文章中我们详细的介绍下Redis
持久化相关的内容。
我们都知道Redis
是基于内存的,读写数据都是操作的内存,但数据并不会因为我们重启服务而消失,这是通过Redis
的持久化保证的。
在Redis
中提供了RDB
和AOF
两种持久化方式,这两种方式可以单独使用,也可以同时使用,在一些情况下也可以都不使用。
一、RDB
RDB
持久化方式是通过生成内存快照的方式将某一时刻的状态以文件的形式保存到磁盘上,这个快照文件被称作RDB
文件。
当我们重启服务后直接读取这个文件进行数据恢复即可,这种持久化方式可以很快的进行数据恢复,但当服务发生宕机时,将丢失最近一次创建快照文件之后写入的所有数据,数据安全性较差。
以下情况Redis
服务会生成快照文件
- 客户端执行
save
或者bgsave
命令; - 使用
shutdown
命令关闭服务时会先执行下save
的逻辑; - 满足
redis
配置文件中save
配置项设置的条件时;
1、save和bgsave命令
save
命令是通过主线程创建快照文件,在处理完成之前主线程无法再处理其他客户端请求,因此这个命令要慎用。
bgsave
命令是通过fork的子线程来创建快照文件,主线程可以继续处理其他客户端的请求。
2、save配置项
RDB文件的生成规则还可以使用save配置项进行配置,在redis7.0版本的配置项说明如下:
配置格式为 save <seconds> <changes> [<seconds> <changes> ...]
save 3600 1 300 100 60 10000
上面的配置意义为
- 3600秒后有一条变更就生成快照
- 300秒后有100条变更就生成快照
- 60秒后有10000条变更就生成快照
这个配置需要根据业务系统允许丢失数据的多少进行配置。
3、rdb相关配置项
save
生成RDB文件的条件stop-writes-on-bgsave-error
rdbcompression
执行RDB快照时是否将string类型的数据进行压缩rdbchecksum
是否开启RDB文件内容的校验dbfilename
文件名称 默认为dump.rdbrdb-del-sync-files
dir
文件存放路径rdb-save-incremental-fsync
二、AOF
RDB
持久化方式可能会丢失最近一次创建快照文件之后写入的所有数据,如果我们对系统的安全性要求较高,可以使用AOF
这种持久化。
AOF
持久化是通过追加命令的方式实现的,Redis
执行完收到的写命令后,将这条命令以文本的形式记录到AOF
文件中。需要恢复数据时,从头到尾执行下AOF
文件中包含的所有命令即可。在Redis
中这种持久化方式默认是关闭的,可以通过appendonly
配置项开启。
以set key value
为例,AOF
日志格式如下图所示:
1、写回策略
磁盘操作是一个比较耗时的操作,如果每次执行完一条命令就更新磁盘肯定会影响Redis
的性能,在Redis
首先是将日志写入aof_buf
缓冲区,然后根据appendfsync
的配置使用具体的写回策略,在Redis
中提供了三种写回策略,如下:
always
同步写回:执行完一个写命令立马将日志写会磁盘。可靠性高,数据基本不丢失;性能影响较大。everysec
每秒写回:每隔一秒把缓冲区中的内容写入磁盘。性能适中,宕机时最多丢失1s内的数据。no
操作系统控制写回:由操作系统决定何时将缓冲区内容写回磁盘。性能好,宕机时丢失的数据较多。
具体选择哪种写回策略需要根据我们系统对性能和可靠性的要求进行决定,想要尽可能的获得高性能,就选择no
;想要尽可能的获得可靠性,就选择always
;允许数据有一点的丢失,同时又希望性能别受太大影响,就选择everysec
。
2、AOF重写
随着时间的推移,AOF
文件会越来越大,对该文件的读写性能都会变差。为了解决这个问题,Redis
中提供了AOF
重写机制。
进行Redis
重写是根据Redis
数据库当前的状态重新生成一个AOF
文件,也就是读取库所有的键值对,然后为每一个键值对生成一条命令进行记录。为何这样会使文件变小呢?举一个简单的例子大家就清楚了,例如我对一个key调用了10次set操作,在原来的AOF文件中会记录着10个命令,而进行重写后的文件中只会记录最后一条set日志。
什么时候会进行AOF重写呢,相关条件是在Redis
配置文件中指定的,内容如下:
# 文件大小的增长率
auto-aof-rewrite-percentage 100
# 文件的最小大小
auto-aof-rewrite-min-size 64mb
3、混合持久化
RDB
和AOF
有各自的优点和缺点,有没有什么方式兼顾RDB
文件快速恢复数据和AOF
数据可靠性的方式呢?在Redis
4.0版本中提供了混合持久化的功能。
混合持久化是指在进行AOF
文件重写时,将Redis
数据库当前状态以RDB
的格式写入AOF
文件中,在Redis
重启时会按照RDB
和AOF
两种解析方式进行数据恢复。
混合持久化功能需要使用如下配置项进行开启:
aof‐use‐rdb‐preamble yes
4、AOF相关配置项
appendonly
是否开启AOF功能 默认为noappendfilename
AOF文件名称 默认为appendonly.aofappendfsync
写回磁盘的策略 默认为everysecno-appendfsync-on-rewrite
默认为no
auto-aof-rewrite-percentage
AOF重写时需要满足的文件大小增长率 默认为100auto-aof-rewrite-min-size
AOF重写时需要满足文件的最小大小默认为64MBaof-load-truncated
在执行RDB生成或者AOF重写时是否进行写回磁盘 默认为noaof-use-rdb-preamble
是否开启混合持久化 默认yes
三、总结
在今天的文章中介绍了下Redis
中的持久化方式,都是些理论性的东西,无需死记硬背。希望大家能够了解一下几点
Redis
提供了哪些持久化方式;RDB
和AOF
两种持久化的区别及各自的优缺点;AOF
日志的写回策略、重写及混合持久化;
欢迎大家关注我的公众号:【Bug搬运小能手】
转载自:https://juejin.cn/post/7187377554100060215