Redis作为目前最流行的缓存系统,当然它也是一种基于内存的数据库,所以能够拥有良好的性能。如何将内存中的数据进行持久化?
RDB方式持久化
RDB持久化操作的时机:
- 根据配置规则进行自动快照
redis的配置文件中你可以自定义快照条件,就像这样:
save 900 1
save 300 10
save 60 10000
时间窗口M和改动的键的个数N,每当在时间窗口M内改动的键数大于N,RDB持久化操作就会被出发。 - 用户执行save或者bgsave命令
save命令会阻塞所有来自客户端的连接,不推荐使用。
bgsave命令会后台异步地进行快照操作,快照的同时服务器还可以继续处理来自客户端的请求。
bgsave命令进行快照的原理:
1、redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。
2、父进程继续处理客户端的请求,子进程进行快照操作。
3、当子进程把内存中的所有数据当写入临时文件之后,覆盖旧的RDB文件。(RDB文件始终是完整的!!) - 执行flushall命令
执行flushall命令时,会清除内存中的所有数据。只要快照条件不为空,即使没有触发快照条件,也会进行一次RDB持久化操作。 - 主从节点进行复制时
主从服务架构下,只要数据库接受到sync命令(从数据库启动后,会向主数据库发送sync命令),就会进行后台快照。
AOF方式持久化
Redis默认是不开启AOF持久化方式的,当时如果数据库中存放是非常重要的数据亦或是非临时数据,这个时候就要开启AOF持久化方式。
- AOF持久化方式的实现
RDB文件中存放的内存中键值对(当然这些数据经过压缩,以二进制形式存储),而AOF文件中存放的是对redis进行的写命令。没当进行写操作时,redis就会将写命令追加到AOF文件中(类似于日志的方式)。 - AOF文件重写
假如我们执行三条如下命令
set age 10
set age 20
set age 25
内存中有效的数据仅仅是age 25,当时第一条和第二条命令同样会被追加到AOF文件中,随着时间积累,AOF文件中无效的命令越来越多,这个时候就需要进行AOF重写。
重写的过程只和内存中的数据有关,和之前的AOF文件无关。
同步硬盘数据
开启AOF的情况下,每当redis执行一条写命令时,都会将命令追加到AOF文件中,但是由于操作系统的缓存机制,命令本身并没有真正被写入到文件中,还在操作系统的硬盘缓存中(内存中),所以我们需要进行同步操作。
redis有三种同步规则
appendfsync always 每次执行写入操作时都会进行同步操作
appendfsync everysec 每隔一秒就有子进程进行同步操作
appendfsync no 从不主动进行同步操作,而是由操作系统进行同步操作(默认30秒进行一次同步操作)
网友评论