一、RDB:半持久化模式,也称为“快照模式”。
Redis在RDB模式下,会在指定的时间间隔内,检测到对redis数据库有对应次数的写入操作时,会触发一次持久化(I/O存储),它是Redis默认开启的持久化模式。RDB持久化是将数据库中的数据以二进制压缩格式保存在本地磁盘中(相当于数据复制,有点像Java中的序列化操作)。
redis.windows.conf 配置文件中可以看到RDB的默认设置——900秒内检测到1次key的变化,触发生成dump文件、300秒内检测到10次key的变化......(不重复描述),保存dump文件的频率可以自定义,比如save 1 1,1秒内检测到1次变化触发dump,当然这样的频率开销很大,实际情况下不推荐这样改。
RDB的工作模式是当触发持久化工作时,fork()一个子进程来执行I/O存储操作,主进程无需执行任何磁盘I/O的操作,可继续接收处理客户端的请求。
当然也可通过输入save与bgsave命令手动触发dump存储。save会阻塞当前主进程直至存储操作完成;而bgsave不会阻塞,它会fork()一个子进程来执行存储操作。
二、AOF:全持久化模式。
是以日志形式记录对数据库的写操作的持久化模式,它默认设置每秒中对数据库的写操作做命令记录(命令记录以在文件末尾追加的方式),AOF持久化模式默认不开启,需要我们手动配置开启。
AOF持久化开启步骤:
1、修改redis.windows.conf :
2、进入redis-server.exe目录下的cmd ,输入:redis-server.exe redis.windows.conf
如果只输入redis-server.exe 后面不跟配置文件,windows下对配置文件的加载就是默认的RDB模式(可能是不执行咱们修改过的 redis.windows.conf 配置文件)。
运行redis数据库后,可以看到文件夹中多了一个 appendonly.aof文件:
接下来启动redis-cli.exe,执行一条写操作语句:HSET 1 vivo 1 :
值得一提的是,如果不断的对appendonly.aof文件进行命令追加,那么必然引起.aof文件过大。此时主进程会fork()一个子进程来对旧的.aof文件进行压缩,压缩后的命令会放入一个新的.aof文件,主进程可以继续对来自客户端的命令进行持久化(主进程还是追加到旧的.aof文件中),当子进程压缩完成后,新的.aof文件会自动覆盖旧的.aof文件。
三、RDB 与 AOF 的区别总结
RDB是紧凑型文件,比AOF文件要小,它保存了某一个时间点数据库上的全部数据,恢复速度比AOF文件快(因为AOF需要先编译命令文件,然后执行;RDB则直接做数据解析迁移),持久化异步操作充分发挥了redis的性能。
AOF是命令日志文件,它保存了用户每秒对数据库的所有写命令操作,对数据的维护安全性能更高(记录每秒的写操作,对比RDB的快照存储,顶多丢失1s的数据,而RDB可能会丢失几分钟的数据),但是在数据恢复上,需要先对日志命令文件进行读取处理再执行编译,效率上要比RDB直接迁移数据文件来得慢。