这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战redis
Redis 是内存数据库,若是不将内存中的数据库状态保存到磁盘中,那么一旦服务器进程退出,服务器中的数据库状态也会消失,因此Redis提供了持久化功能。数据库
持久化就是把内存中的数据写到磁盘中去,防止服务器宕机了内存数据丢失;缓存
Redis 提供了两种持久化方式:RDB(默认)和 AOF安全
RDB 是 Redis Database的缩写服务器
把当前数据生成快照保存在硬盘上markdown
功能核心函数
rdbSave
(生成RDB文件)和rdbLoad
(从文件加载到内存)两个函数并发
快照是默认的持久化方式,这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb
app
RDB持久化能够手动触发,也能够自动触发函数
save
和bgsave
命令均可以手动触发RDB持久化。高并发
执行
save
命令会手动触发RDB持久化,可是save
命令会阻塞Redis服务,直到RDB持久化完成。当Redis服务储存大量数据时,会形成较长时间的阻塞,不建议使用。
127.0.0.1:6379> save
复制代码
20947:M 29 Jul 2021 23:28:56.615 * DB loaded from disk: 0.000 seconds
20947:M 29 Jul 2021 23:28:56.615 * Ready to accept connections
20947:M 29 Jul 2021 23:29:11.551 * DB saved on disk
复制代码
** ps:日志文件查看
(1). 查看 redis.conf
文件中 logfile
属性对应的文件位置;(我这里原本没有,本身写上想要保存日志的位置)
logfile "/usr/local/redis/log/redis.log"
复制代码
(2). 重启 redis 服务端
执行
bgsave
命令也会手动触发RDB持久化,和save
命令不一样是:Redis服务通常不会阻塞。Redis进程会执行fork操做建立子进程,RDB持久化由子进程负责,不会阻塞Redis服务进程。
Redis服务的阻塞只发生在fork阶段,通常状况时间很短。
执行
127.0.0.1:6379> bgsave
Background saving started
复制代码
日志文件
20947:M 29 Jul 2021 23:30:52.144 * Background saving started by pid 21044
21044:C 29 Jul 2021 23:30:52.148 * DB saved on disk
21044:C 29 Jul 2021 23:30:52.149 * RDB: 0 MB of memory used by copy-on-write
20947:M 29 Jul 2021 23:30:52.193 * Background saving terminated with success
复制代码
bgsave执行流程
自动触发的RDB持久化都是采用
bgsave
的方式,减小Redis进程的阻塞。那么,在什么场景下会自动触发呢?
在配置文件中设置了save的相关配置,如save m n
,它表示在m秒内数据被修改过n次时,自动触发bgsave操做;
save 900 1 # 每 900 秒(15分钟)至少 1 个key发生变化,产生快照
save 300 10 # 每 300 秒(5分钟)至少 10 个key发生变化,产生快照
save 60 10000 # 每 60 秒(1分钟)至少 10000 个key发生变化,产生快照
复制代码
当从节点作全量复制时,主节点会自动执行bgsave
操做,而且把生成的RDB文件发送给从节点;
执行debug reload
命令时,也会自动触发bgsave
操做;
执行shutdown
命令时,若是没有开启AOF持久化也会自动触发bgsave
操做。
AOF(Append Only File)持久化是把每次写命令追加写入日志中,当须要恢复数据时从新执行AOF文件中的命令就能够了。
AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式。
AOF持久化默认是不开启的,须要修改
redis.conf
配置文件,如:
# appendonly改成yes,开启AOF
appendonly yes
# AOF文件的名字
appendfilename "appendonly.aof"
# AOF文件的写入方式
# everysec 每一个一秒将缓存区内容写入文件 默认开启的写入方式
# appendfsync always
appendfsync everysec
# appendfsync no
# 运行AOF重写时AOF文件大小的增加率的最小值
auto-aof-rewrite-percentage 100
# 运行AOF重写时文件大小的最小值
auto-aof-rewrite-min-size 64mb
复制代码
always
:每次写入缓存区都要同步到AOF文件中,硬盘的操做比较慢,限制了Redis高并发,不建议配置。no
:每次写入缓存区后不进行同步,同步到AOF文件的操做由操做系统负责,每次同步AOF文件的周期不可控,并且增大了每次同步的硬盘的数据量。eversec
(默认) :每次写入缓存区后,由专门的线程每秒钟同步一次,作到了兼顾性能和数据安全。是建议的同步策略,也是默认的策略。文件重写:由于若是重写写入命令,aof文件会愈来愈大,经过读取数据库的键值,来完成重写。
是为了合并多余命令,减少文件大小;
例如:对一个字符串进行四次操做,我只须要读取最终的值,最后用一条命令来写入;
fork 一个新的进程进行文件重写。
手动触发:使用 bgrewriteaof
命令
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
复制代码
日志
20947:M 30 Jul 2021 15:04:54.888 * Background append only file rewriting started by pid 6083
复制代码
自动触发:
根据
auto-aof-rewrite-min-size
和auto-aof-rewrite-percentage
配置肯定自动触发的时机。
auto-aof-rewrite-min-size
表示运行AOF重写时文件大小的最小值,默认为64MB;
auto-aof-rewrite-percentage
表示当前AOF文件大小和上一次重写后AOF文件大小的比值的最小值,默认为100。只用前二者同时超过期才会自动触发 文件重写。
AOF
默认文件同步策略,当服务器宕机时,最多会丢失一秒钟的数据;AOF
文件的体积一般要大于 RDB
文件体积;AOF
运行效率低于 RDB