文章目录
Redis持久化
持久化就是把数据备份到硬盘或者远程位置上,Redis是内存型数据库,为了防止重启、宕机或者机器故障等,需要提前将内存的数据备份持久化,Redis提供了两种持久化的方式:
- RDB(Redis DataBase)
- AOF (Append Of File)
RDB持久化
1、简介
RDB持久化:将某个时间点的所有数据保存到磁盘上,Redis启动时会读取该文件重构数据。Redis默认使用RDB持久化。
2、备份操作
Redis会单独创建Fork一个子进程来进行持久化,先把数据写入到一个临时文件中,待持久化全部完成再用这个临时文件替换上次持久化好的文件。整个过程主进程不进行任何IO操作,以确保主进程性能。RDB要比AOF方式更加高效,但是RDB缺点是最后一次持久化后的数据可能会丢失。
3、Fork
Fork的作用是复制一个与当前进程完全相同的子进程,子进程去做持久化。
4、什么时候进行RDB备份:
- Bgsave命令:客户端发送此命令Redis会调用子进程fork创建一个进程来创建一个快照。
- Save命令:客户端还可以发送Save命令来创建快照,接收到Save命令Redis在创建完毕之前不会再响应其他命令,这个命令不常用。
- Save选项:参照下节配置介绍。
- Showdown命令:客户端发送关闭命令,Redis阻塞所有客户端,不接受所有命令,然后执行完save命令关闭服务器。
- 一个Redis链接到另一个Redis:连接时会向主Redis发送Sync命令来开始一次复制操作的时候,如果主服务器没有执行Bgsave或者主服务器并非刚执行完BgSave操作,那么主服务器就会进行一次Bgsave操作。
5、RDB持久化常用配置:
策略名 | 默认值 | 说明 |
---|---|---|
dbfilename | dbfilename dump.rdb | RDB持久化存放数据的文件名 |
dir | ./ | 存放路径 |
save | save 900 1 save 300 10 save 60 10000 | 以第一个为例:900秒(15分钟)至少有1条数据改变就会备份 |
stop-writes-on-bgsave-error | stop-writes-on-bgsave-error yes | Redis无法写入磁盘的话,直接关掉Redis的写操作 |
rdbcompression | rdbcompression yes | 开启后Redis会采用LZF算法进行压缩 |
rdbchecksum | rdbchecksum yes | 使用CRC64算法来进行数据校验,会增加约10%的性能消耗 |
AOF持久化
1、简介
AOF持久化的是以日志的形式记录每个写操作(增量保存),将所有执行的写指令记录下来,读取指令不记录,只许追加不许改写文件。Redis启动时会读取该文件重构数据,会读取文件中之前写的指令全部执行一次来完成恢复工作。与RDB快照持久化的方式相比,AOF实时性更好。Redis默认没有开启AOF的持久化,可通过appendonly yes参数开启。如果同时开启两种方式持久化,Redis会优先选择AOF还原数据。
2、备份过程
(1)客户端请求写的命令会被append追加到AOF的缓存区。
(2)AOF的缓存区根据持久化策略(always、everysec和no)将操作Sync同步到磁盘上的AOF文件中。
(3)AOF文件大小超过重写策略或手动重写时,会对AOF文件Rewrite重写,压缩文件容量。
(4)Redis重启后会重新加载AOF文件中的命令恢复数据。
3、AOF持久化常用配置:
策略名 | 默认值 | 说明 |
---|---|---|
appendonly | appendonly no | AOF持久化开关 |
appendfilename | appendfilename “appendonly.aof” | AOF持久化存放数据的文件名 |
appendfsync | appendfsync everysec | 同步频率:always每个命令都追加;everysec每秒追加;no不主动持久化,把时机交给操作系统 |
no-appendfsync-on-rewrite | no-appendfsync-on-rewrite no | 子进程执行bgrewriteaof操作和主进程写aof文件是否阻塞,如果no则主进程等待,最安全 |
auto-aof-rewrite-percentage | auto-aof-rewrite-percentage 100 | 重写文件百分比 |
auto-aof-rewrite-min-size | auto-aof-rewrite-min-size 64mb | 重写文件大小的最小值,AOF文件体积大于64mb,且文件体积比上一次重写之后的体积大了至少一倍(100%)的时候,Redis将执行bgrewriteaof命令 |
aof-load-truncated | aof-load-truncated yes | 是否忽略最后一个错误指令,有可能正在持久化断点,导致最后一个命令只持久化了一半,如果配置为no则恢复会失败 |
RDB和AOF对比
DRB | AOF | |
---|---|---|
恢复速度 | 快 | 慢 |
占用空间 | 较小 | 较大 |
数据完整性 | 丢失数据相对较多 | 几乎不丢失数据 |
影响性能 | 不影响主进程性能 | 同步频率较高会阻塞主进程,影响性能 |