1.前言
redis的数据都是存在内存中的,所以读写速度非常快,经常用来做数据库的缓存,但是数据放在内存中,redis服务重启数据就会全部丢失,此时就需要用到redis的持久化功能,redis有两种持久化方式,分别是rdb持久化与aof持久化
2.rdb持久化
2.1rdb是在指定的时间间隔内生成数据集的时间点快照
2.2rdb持久化可以直接使用save或bgsave命令生成数据集的时间点快照文件,也可以通过redis的配置文件配置指定的条件触发rdb生成快照文件
2.3save命令是同步操作,当使用save命令进行持久化时,redis会阻塞save命令之后的所有客户端请求,直到数据同步完成,一般不适用save命令进行持久化
2.4bgsave命令是异步操作,当使用bgsave命令进行持久化时,redis会forks一个子进程来同步数据,而主进程仍然可以接受其它的客户端请求
2.5在reids配置文件中配置rdb持久化可以指定时间间隔内生成多少数据集来触发持久化操作
#redis默认启动rdb备份,注释掉所有的save就会关闭rdb备份
save 3600 1 #rdb备份的默认配置,3600秒后,如果至少有一个键值改变就执行rdb备份
save 300 100 #rdb备份的默认配置,300秒后,如果至少有一百个键值改变就执行rdb备份
save 60 10000 #rdb备份的默认配置,60秒后,如果至少有一万个键值改变就执行rdb备份
2.6当redis意外重启时,redis会自动调用rdb的持久化文件去恢复数据(在没有启用aof持久化的情况下)
2.7使用rdb持久化有可能丢失数据,例如备份的间隔时间点是三分钟,这样的话在这三分钟之中发生意外重启的话就会丢失掉一部分数据,生产中的数据量庞大,RDB 文件需要保存整个数据集的状态,所以不可能会短时间的连续做rdb持久化操作
3.aof持久化
3.1aof是在一定时间内将数据的变更记录到aof备份文件中与mysql的binlog类似
3.2aof持久化需要在reids配置文件中开启
appendonly yes #aof备份,默认为no关闭状态,yes为启用aof备份
3.3aof有三种写入策略
#appendfsync always #客户端的每一个写操作都保存到aof文件中
appendfsync everysec #每秒写入一次aof文件
#appendfsync no #redis不负责写入aof文件,而是交由操作系统来处理什么时候写入aof文件
3.4aof重写机制,手动执行bgrewriteaof命令,主进程fork一个子进程去读取主进程现有的内存数据,子进程使用命令将内存数据写入一个临时的aof文件中,父进程将累计的差异数据追加到重写缓冲区,重写过程中,父进程会将一部分差异数据通过管道发给子进程,当子进程将主进程的内存数据写入完成后会读取父进程发来的的差异数据并将其写入临时文件,然后退出,父进程捕捉到子进程的退出码,如果是OK,将累计的差异数据写入临时文件,并且对临时文件rename,用它代替旧的AOF文件,至此就完成AOF的重写
3.5在redis配置文件中配置aof重写机制
auto-aof-rewrite-percentage 100 #比上次重写后的体量增加了100%时自动触发重写,与下面的配置一起使用
auto-aof-rewrite-min-size 64mb #当aof备份文件大小超过64mb时触发重写,最好是使用手动执行bgrewriteaof
3.6aof持久化文件校验与修复(修复程序会扫描aof文件,当发现错误或者不完整的命令则会进行删除)
redis-check-aof --fix appendonly.aof
3.7aof作为持久化更好一点,保存的数据完整性更高,只是做恢复的时候会慢一点
4.aof案例演示
4.1不小心使用了flushall清除了redis中的数据(此时不可以用进行aof的重写操作,否则数据会全部丢失)
4.2先停止redis服务
systemctl stop redis
4.3编辑aof持久化文件删除关于flushall的内容
find / -name appendonly.aof #查找aof持久化文件
vim /etc/redis/appendonly.aof
*1
$8
fullshall #将这行与上面两行都删除
4.4启动redis服务会自动调用aof持久化文件去恢复数据
systemctl start redis