持久化机制
Redis提供了两种持久化的方案,一种是RDB快照(Redis DataBase),一种是AOF(Append Only File)
RDB
RDB是Redis默认的持久化方案(注意如果开启了AOF,优先用AOF)。当满足一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件dump.rdb,Redis重启会通过加载dump.rdb文件恢复数据。
#文件路径
#rdb文件默认在启动目录下(相对路径)
#config get dir获取
dir./
#文件名称
dbfilename dump.rdb
#是否以LZF压缩rdb文件
#开启压缩可以节省存储空间,但是会消耗一些CPU的计算时间,默认开启
rdbcompression yes
#开启数据校验
#使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
rdbchecksum yes
RDB触发:
-
配置规则触发:
redis.conf,其中定义了触发把数据保存到磁盘的触发频率。如果不需要rdb方案,注释save或者配置成空字符串。#这里的配置是不冲突的,只要满足任意一个都会触发 save 9001#900秒内至少有一个key被修改(包括添加) save 300 10#400秒内至少有10个key被修改 save 60 10000#60秒内至少有10000个key被修改
-
shutdown触发,保证服务器正常关闭。
-
flushall,可以清空rdb文件
-
手动触发:
如果我们需要重启服务或者迁移数据,这个时候就需要手动触RDB快照保存。Redis提供了两条命令:
a) save
save在生成快照的时候会阻塞当前Redis服务器,Redis不能处理其他命令。如果内存中的数据比较多,会造成Redis长时间的阻塞。生产环境不建议使用这个命令。
b) bgsave
执行bgsave时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体操作是Redis进程执行fork操作创建子进程(copy-on-write),RDB持久化过程由子进程负责,完成后自动结束。它不会记录fork之后产生的数据。阻塞只发生在fork阶段,一般时间很短。
RDB文件的优势和劣势
优势
- RDB是一个非常紧凑(compact)的文件,它保存了redis在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。
- 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
- RDB在恢复大数据集时的速度比AOF的恢复速度要快。
劣势
- RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,频繁执行成本过高
- 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照之后的所有修改(数据有丢失)
如果数据相对来说比较重要,希望将损失降到最小,则可以使用AOF方式进行持久化。
AOF
Redis默认不开启。AOF采用日志的形式来记录每个写操作,并追加到文件中。开启后,执行更改Redis数据的命令时,就会把命令写入到AOF文件中。Redis重启时会根据日志文件的内容把写指令从前到后执行一次以完成数据的恢复工作。
AOF配置
配置文件redis.conf
#Redis默认只开启RDB持久化,开启AOF需要修改为yes
appendonly no
#文件名 路径也是通过dir参数配置config get dir
appendfilename "appendonly.aof"
数据都是实时持久化到磁盘吗?
由于操作系统的缓存机制,AOF数据并没有真正地写入硬盘,而是进入了系统的硬盘缓存。
什么时候把缓冲区的内容写入到AOF文件?
参数配置
- appendfsync everysec:AOF持久化策略(硬盘缓存到磁盘),默认everysec
- appendfsync no:表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但是不太安全;
- appendfsync always:表示每次写入都执行fsync,以保证数据同步到磁盘,效率很低
- appendfsync everysec:表示每秒执行一次fsync,可能会导致丢失这1s数据。通常选择everysec兼顾安全性和效率。
AOF优势与劣势
优点:
- AOF持久化的方法提供了多种的同步频率,即使使用默认的同步频率每秒同步一次,Redis最多也就丢失1秒的数据而已。
缺点:
- 对于具有相同数据的的Redis,AOF文件通常会比RDF文件体积更大(RDB存的是数据快照)
- 虽然AOF提供了多种同步的频率,默认情况下,每秒同步一次的频率也具有较高的性能。在高并发的情况下,RDB比AOF具好更好的性能保证。