Redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要Redis持久化
Redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制
Redis提供两种持久化机制:
-
RDB:存储数据结果,关注点在数据(快照)
-
AOF:存储操作过程,关注点在数据的操作过程(命令)
RDB(Redis DataBase)
在指定的时间间隔内将内存中的数据集中写入磁盘,也就是快照(Snapshot),数据恢复是将快照文件直接读到内存中。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入一个到一个临时文件(dump.rdb)中,待持久化过程结束后,再用本次的临时文件替换上次持久化后的文件。
fork函数的作用是复制一个与当前进程一样的进程,新进程的所有数据数值都和原进程一致,但是一个全新的进程,并作为原进程的子进程。
RDB的触发方式:
-
手动触发:通过命令手动生成快照 (save,bgsave)
-
自动触发:通过配置参数的设置触发自动生成快照
缺点:
-
快照时间有间隔,不能实时备份,丢失数据可能会比较多
-
开启子进程备份数据,在数据集比较庞大时,fork()可能会非常耗时,造成服务器在一定时间内停止处理客户端。
优点:
1.恢复数据比较快
2.备份的文件就是原始内存数据的大小,不会额外增加数据占用,
AOF(Append Only File)
将客户端的每一个写操作命令以日志的形式记录下来,追加到appendonly.aof的文件末尾,在redis服务器重启时,会加载aof文件中的所有命令,来达到数据恢复的目的
当有写命令请求时,会追加到AOF缓冲区内,AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作同步到磁盘的AOF文件中,当AOF文件大小超过重写策略或手动重写时,会对AOF文件进行重写来压缩AOF文件容量,redis服务重启时,会重新加载AOF文件中的写操作来进行数据恢复
AOF的触发方式
1.手动触发
通过bgrewriteaof
命令:重新AOF持久化生成aof文件(触发重写)
2.自动触发
默认情况,redis是没有开启AOF(默认使用RDB持久化),需要通过配置文件开启
AOF的优缺点
优点:
-
数据安全性高,不易丢数据
-
AOF文件有序保存了所有写操作,可读性强
缺点:
-
AOF方式生成文件体积变大
-
数据恢复速度比RDB慢
# 默认Redis 6之前的配置可能包括:
save 900 1
save 300 10
save 60 10000
# Redis 6及更高版本中的默认配置已经注释掉了所有save规则,
# 转而推荐使用更加灵活的aof持久化方式或通过redis-cli手动执行bgrewriteaof命令实现RDB持久化。
# 若要启用RDB的自动保存,需要取消下面注释或者添加自定义的save规则:
# save 900 1 如果在900秒(15分钟)内至少有一次数据库改动(key的变化),那么Redis会自动创建一个新的RDB快照并保存到磁盘上
# save 300 10 表示如果在300秒(5分钟)内数据库发生了至少10次改动,Redis也会触发一次RDB持久化操作