侧边栏壁纸
  • 累计撰写 57 篇文章
  • 累计创建 23 个标签
  • 累计收到 4 条评论

Redis持久化

cluski
2022-03-16 / 0 评论 / 0 点赞 / 287 阅读 / 2,361 字
温馨提示:
本文最后更新于 2022-04-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

持久化

Redis的高性能是由于其将所有数据都存储在了内存中,但由于记录在内存中的所有数据在系统断电之后就
会丢失,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是
持久化

Redis提供了三种持久化方式,分别是RDB持久化方式AOF持久化方式RDB-AOF混合持久化
DR蜡士

1 RDB模式

RDB (Redis DataBase)持久化是Redis默认使用的持久化功能,该功能可以创建出一个经过压缩的二进制
文件,其中包含了数据库中所有的数据信息。这种方式生成的数据文件也叫快照(snapshotting)文件,该
文件以.rdb后缀结尾,默认会在redis的启动目录下生成该文件。

Redis默认:在哪启动redis,在哪生成持久化文件。

image-20210911201727302

Redis提供了三种生成RDB文件的方法:

  1. SAVE:阻塞服务器并创建RDB文件

用户通过执行SAVE命令,要求服务器创建出一个记录了服务器当前所有数据的RDB文件。在SAVE命令执
行期间,,Redis服务器将被阻塞,无法对外提供服务,直到RDB文件创建完毕为止,所以不建议使用,尤
其是生产环境慎用。

127.0.0.1:6379> save
оK 
  1. BGSAVE:以非阻塞方式创建RDB文件

用户通过执行BGSAVE命令,Redis会创建出一个子进程进行创建RDB文件,此时Redis服务器仍然可以对外
提供服务。

127.0.0.1:6379> bgsave
Background saving started
  1. 通过配置选项自动创建RDB文件

除了手动执行命令外,还可以通过设置参数,让服务器在满足条件时自动执行BGSAVE命令。需要在
redis.conf配置文件中默认有此下配置:

save 900 1
save 300 10
save 60 10000

save <seconds> <changes>接收seconds和changes两个参数,

前者用于指定触发持久化操作所需的时长,后者用于指定触发持久化操作所需要的修改次数。

比如,save 900 1表示900秒钟内进行了一次修改则执行一次BGSAVE命令。

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,
这个时间也不同。通常将记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20 30秒钟

RDB持久化存在的缺陷

  • 停机时服务器丢失的数据量将取决于创建RDB文件的时间间隔:间隔越长,停机时丢失的数据也就越
    多。
  • RDB持久化是一种全量持久化操作,数据库中的数据量越大消耗的计算资源和内存资源越多,时间越
    久。

2 AOF模式

与全量式的RDB持久化功能不同,AOF (Append Only File)提供的是增量式的持久功能。这种持久化的核
心原理在于:服务器每次执行完写命令之后,默认每秒钟都会将被执行的命令追加到AOF文件的末尾。

AOF文件的保存位置和RDB文件的默认存储位置相同,都是在Redis的安装路径下,默认文件名称为:appendonly.aof

image-20210911202711689

默认情况下Redis没有开启AOF方式的持久化,需要通过appendonly参数开启:

appendonly yes

强制重写AOF文件

> bgrewriteaof

AOF持久化存在的缺陷

  • AOF文件存储的命令比较多,通常比RDB文件大得多。
  • 恢复数据时AOF需要通过执行AOF中的命令来恢复数据,所花费的时间就更多。而RDB恢复数据时属
    于直接恢复,速度更快。

概括:

  • RDB保存的数据的当前值,AOF保存的是所有的执行过的命令。
  • RDB文件更精简,AOF文件会有很多无用数据。
  • RDB可能丢失的数据更多,AOF可能丢失的数据更少。

如果有一条数据age为1,经过了一百次修改,修改为了age为100,那么RDB和AOF的存储数据为:

image-20210911203831122

3 RDB-AOF混合持久化方式(推荐)

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

image-20210911203840826

开启混合持久化需要做两步:

  1. 开启AOF持久化方式
appendonly yes
  1. 开启混合持久化方式

查询是否开启了混合持久化可以使用config get aof-use-rdb-preamble命令,执行结果

127.0.0.1:6379> config get aof-use-rdb-preamble
1) "aof-use-rdb-preamble"
2) "yes"

其中yes表示已经开启混合持久化,no表示关闭,Redis 5.0默认值为yes。如果是其他版本的Redis首先需
要检查一下,是否已经开启了混合持久化,如果关闭的情况下,可以通过以下两种方式开启:

  • 通过命令行开启
  • 通过修改Redis配置文件开启

① 通过命令开启

使用命令config set aof-use-rdb-preamble yes

命令行设置配置的缺点是重启Redis服务之后,设置的配置就会失效。

② 通过修改Redis配置文件开启

在Redis的配置文件redis.conf文件,把配置文件中的aof-use-rdb-preamble no改为aof-use-rdb- oreamble yes

配置完成之后,需要重启Redis服务器,配置才能生效,但修改配置文件的方式,在每次重启Redis服务之
后,配置信息不会丢失。

如果AOF文件过大时候,会自动重写AOF:把当前数据以RDB格式保存,后续指令用AOF。当然也可以
通过命令BGREWRITEAOF来强制服务器重写AOF文件。

0

评论区