一:RBD
RBD方式是通过快照(snapshotting)完成的,当符合一定的条件时redis会自动将内存中所有数据生成一份副本并保存在硬盘上,这个过程即为快照。redis会在一下几种情况下对数据进行快照:
- 根据配置规则自动进行快照
- 用户执行save或者bgsave
- 执行flushall命令
- 执行复制操作
1 根据配置规则进行自动快照
redisyunxu允许用户自定义快照,当符合条件时,redis会自动执行快照操作。配置命令如下:save m n
其中m为时间窗口,n为改动的键的个数。
例如:
save 900 1 (每900秒有一个或者一个以上的键被改动)
save 300 10 (每300秒有至少十个键被修改)
save 60 10000 (每60秒至少有10000个键被修改)
每条快照条件占一行,并且以save开头。同时可以存在多个条件,条件之间是或的关系。
2 用户执行save或者bgsave命令
除了让redis自动进行快照外,当进行服务器重启、手动迁移以及备份我们也需要手动快照来操作。redis提供了两个命令来操作。
save
命令:快照执行过程中会阻塞所有来自客户端的请求。当数据库中的数据比较多时,这一过程会导致redis较长时间不响应,所以尽量避免在生产环境中使用这一命令。
bgsave
命令:在后台异步进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。执行完该命令后,redis会立刻返回OK表示开始执行快照操作,如果想知道快照是否完成,可以通过lastsave命令来获取最近一次成功执行快照的时间。
3 执行flushall命令
当执行flushall
命令时,redis会清除数据库中的所有数据。需要注意的是,不论清空数据库的过程是否触发了自动快照条件,只要自动快照不为空,redis就会执行一次快照操作。当没有定义自动快照条件时,执行 该命令则不会进行RDB快照文件。
4 快照原理
redis会默认将快照文件存储在redis当前进程的工作目录的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。快照过程如下:
(1)redis 使用fork函数复制一份当前(父进程)的副本(子进程)。
(2)父进程继续接收并处理客户端发来的命令,而子进程将内存中的数据写入硬盘的临时文件。
(3)当子进程写完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照过程完成。
RDB方式持久化,一旦redis异常退出,就会丢失最后一次快照以后更改的所有数据。
二:AOF
AOF会将redis执行的煤一条命令都追加到硬盘文件中,这一过程会降低redis的性能,但是大部分情况下都是可以接受的。默认情况下AOF是不开启的,设置参数appendonly yes
。AOF文件的保存位置和RDB文件位置相同,都是通过dir参数设置的,默认的文件名是appedonly.aof,可以通过appendfilename参数修改:
appendfilename appendonly.aof
AOF优化:希望redis优化AOF文件,删除重复的数据的无用命令,只保留有用的命令。配置参数:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-pewrite-min-size 64mb
auto-aof-rewrite-percentage 参数的意义是目前的aof文件大小超过上一次重写的aof文件大小的本分之多少再次进行重写。auto-aof-rewrite-pewrite-min-size参数限制了允许重写的最小文件大小。
也可以使用bgrewriteaof
命令手动执行aof重写。