| dbfilename | 文件名称 |
| rdbcompression | 开启压缩可以节省存储空间,但是会消耗一些CPU的计算时间,默认开启 |
| rdbchecksum | 使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。 |
如果需要关闭RDB的持久化机制,可以参考如下配置,开启save
,并注释其他规则即可
save “”
#save 900 1
#save 300 10
#save 60 10000
用户执行SAVE或者GBSAVE命令
除了让Redis自动进行快照以外,当我们对服务进行重启或者服务器迁移我们需要人工去干预备份。redis提供了两条命令来完成这个任务
- save命令
如图4-24所示,当执行save命令时,Redis同步做快照操作,在快照执行过程中会阻塞所有来自客户端的请求。当redis内存中的数据较多时,通过该命令将导致Redis较长时间的不响应。所以不建议在生产环境上使用这个命令,而是推荐使用bgsave命令
图4-24
- bgsave命令
如图4-25所示,bgsave命令可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。执行BGSAVE后,Redis会立即返回ok表示开始执行快照操作,在redis-cli终端,通过下面这个命令可以获取最近一次成功执行快照的时间(以 UNIX 时间戳格式表示)。
LASTSAVE
1:redis使用fork函数复制一份当前进程的副本(子进程)
2:父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件
3:当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此,一次快照操作完成。
注意:redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。 这就使得我们可以通过定时备份RDB文件来实现redis数据库的备份, RDB文件是经过压缩的二进制文件,占用的空间会小于内存中的数据,更加利于传输。
bgsave是异步执行快照的,bgsave写入的数据就是for进程时redis的数据状态,一旦完成fork,后续执行的新的客户端命令对数据产生的变更都不会反应到本次快照
Redis启动后会读取RDB快照文件,并将数据从硬盘载入到内存。根据数据量大小以及服务器性能不同,这个载入的时间也不同。
图4-25
执行FLUSHALL命令
该命令在前面讲过,会清除redis在内存中的所有数据。执行该命令后,只要redis中配置的快照规则不为空,
也就是save 的规则存在。redis就会执行一次快照操作。不管规则是什么样的都会执行。如果没有定义快照规则,就不会执行快照操作。
执行复制(replication)时
该操作主要是在主从模式下,redis会在复制初始化时进行自动快照。这个会在后面讲到;
这里只需要了解当执行复制操作时,即时没有定义自动快照规则,并且没有手动执行过快照操作,它仍然会生成RDB快照文件。
RDB数据恢复演示
- 准备初始数据
redis> set k1 1
redis> set k2 2
redis> set k3 3
redis> set k4 4
redis> set k5 5
- 通过shutdown命令关闭触发save
redis> shutdown
- 备份dump.rdb文件(用来后续恢复)
cp dump.rdb dump.rdb.bak
- 接着再启动redis-server(systemctl restart redis_6379),通过keys命令查看,发现数据还在
keys *
模拟数据丢失
- 执行flushall
redis> flushall
- shutdown(重新生成没有数据的快照,用来模拟后续的数据恢复)
redis> shutdown
-
再次启动redis, 通过keys 命令查看,此时rdb中没有任何数据。
-
恢复之前备份的rdb文件(之前保存了数据的rdb快照)
mv dump.rdb.bak dump.rdb
- 再次重启redis,可以看到之前快照保存的数据
keys *
文件的优势和劣势
一、优势
1.RDB是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集,这种文件非常适合用于进行备份和灾难恢复。
2.生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
3.RDB 在恢复大数据集时的速度比AOF的恢复速度要快。
二、劣势
-
1、RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,频繁执行成本过高
-
2、在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照之后的所有修改(数据有丢失)。
如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化。
AOF模式
=====
AOF(Append Only File):Redis 默认不开启。AOF采用日志的形式来记录每个写操作,并追加到文件中。开启后,执行更改Redis数据的命令时,就会把命令写入到AOF文件中。
Redis 重启时会根据日志文件的内容把写指令从前到后执行一次以完成数据的恢复工作。
AOF配置开关
开关
appendonly no /yes
文件名
appendfilename “appendonly.aof”
通过修改redis.conf重启redis之后:systemctl restart redis_6379。
再次运行redis的相关操作命令,会发现在指定的dir
目录下生成appendonly.aof文件,通过vim查看该文件内容如下
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$3
mic
*3
$3
set
$4
name
$3
123
AOF配置相关问题解答
问题1:数据都是实时持久化到磁盘吗?
虽然每次执行更改Redis数据库内容的操作时,AOF都会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。在默认情况下系统每30秒会执行一次同步操作。以便将硬盘缓存中的内容真正地写入硬盘。
在这30秒的过程中如果系统异常退出则会导致硬盘缓存中的数据丢失。一般来说能够启用AOF的前提是业务场景不能容忍这样的数据损失,这个时候就需要Redis在写入AOF文件后主动要求系统将缓存内容同步到硬盘中。在redis.conf中通过如下配置来设置同步机制。
| 参数 | 说明 |
| — | — |
| appendfsync everysec | AOF持久化策略(硬盘缓存到磁盘),默认everysec
1 no 表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;
2 always 表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低;
3 everysec表示每秒执行一次f
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
sync,可能会导致丢失这1s数据。通常选择 everysec ,兼顾安全性和效率。 |
问题2:文件越来越大,怎么办?
由于AOF持久化是Redis不断将写命令记录到 AOF 文件中,随着Redis不断的运行,AOF 的文件会越来越大,文件越大,占用服务器内存越大以及 AOF 恢复要求时间越长。
例如set gupao 666,执行1000次,结果都是gupao=666。
为了解决这个问题,Redis新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
可以使用命令下面这个命令主动触发重写
redis> bgrewriteaof
AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。
重写触发机制如下
| 参数 | 说明 |
| — | — |
| auto-aof-rewrite-percentage | 默认值为100。表示的是当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时AOF文件大小为依据 |