Redis有三种持久化方式:
一、RDB
如何触发?
1.手工触发。save、bgsave命令。主要区别体现在:save阻塞 Redis 主线程的执行。而bgsave不阻塞。bgsave
会 fork() 一个子进程来执行持久化,整个过程中只有在 fork() 子进程时有短暂的阻塞,当子进程被创建之后,Redis 的主进程就可以响应其他客户端的请求了
2.自动触发save m n。
本质是 Redis 通过判断,如果满足设置的触发条件,自动执行一次 bgsave
命令。 注意:当设置多个 save m n 命令时,满足任意一个条件都会触发持久化。 例如,我们设置了以下两个 save m n 命令:
当 60s 内如果有 10 次 Redis 键值发生改变,就会触发持久化;如果 60s 内 Redis 的键值改变次数少于 10 次,那么 Redis 就会判断 600s 内,Redis 的键值是否至少被修改了一次,如果满足则会触发持久化。
flushall
命令用于清空 Redis 数据库,在生产环境下一定慎用,当 Redis 执行了 flushall
命令之后,则会触发自动持久化,把 RDB 文件清空。
主从同步,在 Redis 主从复制中,当从节点执行全量复制操作时,主节点会执行 bgsave
命令,并将 RDB 文件发送给从节点,该过程会自动触发 Redis 持久化。
rdb配置,配置查询命令config get xxx(如dbfilename)
# RDB 保存的条件 save 900 1 save 300 10 save 60 10000 # bgsave 失败之后,是否停止持久化数据到磁盘,yes 表示停止持久化,no 表示忽略错误继续写文件。 stop-writes-on-bgsave-error yes # RDB 文件压缩 rdbcompression yes # 写入文件和读取文件时是否开启 RDB 文件检查,检查是否有无损坏,如果在启动是检查发现损坏,则停止启动。 rdbchecksum yes # RDB 文件名 dbfilename dump.rdb # RDB 文件目录 dir ./
config set dir "/usr/data"
就是用于修改 RDB 的存储目录。注意:手动修改 Redis 配置文件的方式是全局生效的,即重启 Redis 服务器设置参数也不会丢失,而使用命令修改的方式,在 Redis 重启之后就会丢失。但手动修改 Redis 配置文件,想要立即生效需要重启 Redis 服务器,而命令的方式则不需要重启 Redis 服务器。
RDB恢复也简单,只需把dump.rdb放到根目录下,服务器启动就可以恢复。
禁止持久化,config save ""
RDB 优缺点
二、AOF
把 Redis 每个键值对操作都记录到文件(appendonly.aof)中。
查看AOF启动状态config get appendonly。设置AOF启动config set appendonly yes。或者手工修改redis.conf
自动触发,在redis.conf配置中加上配置,或者满足重写触发条件
# 开启每秒写入一次的持久化策略 appendfsync {策略}(如everysec) 策略有三种
每次写入磁盘都会对 Redis 的性能造成一定的影响,所以要根据用户的实际情况设置相应的策略,一般设置每秒写入一次磁盘的频率就可以满足大部分的使用场景了。
手工触发命令bgrewriteaof
AOF 是通过记录 Redis 的执行命令来持久化(保存)数据的,所以随着时间的流逝 AOF 文件会越来越多,这样不仅增加了服务器的存储压力,也会造成 Redis 重启速度变慢,为了解决这个问题 Redis 提供了 AOF 重写的功能。
AOF 重写指的是它会直接读取 Redis 服务器当前的状态,并压缩保存为 AOF 文件。例如,我们增加了一个计数器,并对它做了 99 次修改,如果不做 AOF 重写的话,那么持久化文件中就会有 100 条记录执行命令的信息,而 AOF 重写之后,之后记录一条此计数器最终的结果信息,这样就去除了所有的无效信息。
重写触发需要同时满足两个配置
AOF配置
# 是否开启 AOF,yes 为开启,默认是关闭 appendonly no # AOF 默认文件名 appendfilename "appendonly.aof" # AOF 持久化策略配置 # appendfsync always appendfsync everysec # appendfsync no # AOF 文件重写的大小比例,默认值是 100,表示 100%,也就是只有当前 AOF 文件,比最后一次的 AOF 文件大一倍时,才会启动 AOF 文件重写。 auto-aof-rewrite-percentage 100 # 允许 AOF 重写的最小文件容量 auto-aof-rewrite-min-size 64mb # 是否开启启动时加载 AOF 文件效验,默认值是 yes,表示尽可能的加载 AOF 文件,忽略错误部分信息,并启动 Redis 服务。 # 如果值为 no,则表示,停止启动 Redis,用户必须手动修复 AOF 文件才能正常启动 Redis 服务。 aof-load-truncated yes
默认情况下 appendonly.aof 文件保存在 Redis 的根目录下。
持久化文件加载规则
在 AOF 开启的情况下,即使 AOF 文件不存在,只有 RDB 文件,也不会加载 RDB 文件。
在 AOF 写入文件时如果服务器崩溃,或者是 AOF 存储已满的情况下,AOF 的最后一条命令可能被截断,这就是异常的 AOF 文件。
在 AOF 文件异常的情况下,如果为修改 Redis 的配置文件,也就是使用 aof-load-truncated
等于 yes
的配置,Redis 在启动时会忽略最后一条命令。
AOF 文件可能出现更糟糕的情况,当 AOF 文件不仅被截断,而且中间的命令也被破坏,这个时候再启动 Redis 会提示错误信息并中止运行,错误信息如下:
* Reading the remaining AOF tail... # Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
出现此类问题的解决方案如下:
redis-check-aof
命令,它会跳转到出现问题的命令行,这个时候可以尝试手动修复此文件;redis-check-aof --fix
自动修复 AOF 异常文件,不过执行此命令,可能会导致异常部分至文件末尾的数据全部被丢弃。flushall
命令删除了所有键值信息,只要使用 AOF 文件,删除最后的 flushall
命令,重启 Redis 即可恢复之前误删的数据。