redis持久化探究

来源:互联网 发布:上海婚纱摄影推荐知乎 编辑:程序博客网 时间:2024/05/24 07:15

 redis支持两种持久化方式,一种是RDB方式,另一种是AOF方式。redis3.0windows版本默认关闭AOF(appendonly no),而开启RDB,当达到一定条件时,redis就会将内存中的所有数据生成一份副本并存储到硬盘上。

RDB持久化:

RDB持久化会在dir目录下产生一个以.rdb为后缀名的文件,在配置文件中配置dir目录及文件名,默认dir目录是跟目录,文件名是dump.rdb。

redis在4种情况下会进行RDB持久化:

1.根据配置规则自动进行RDB持久化

默认配置文件是这样写的:

save  900  1

save  300  10

save  60  10000

每一行第一个数是多少毫秒的意思,第二个数是被更改的键的数量。这三行条件是或的关系,无论达到哪一个条件,redis就会自动RDB持久化。比如说第一行,如果在900秒内有1个键被更改,redis就会自动RDB持久化。可以根据项目需要,更改此配置规则。

2.主动执行持久化命令

这样的命令有2个,save(对应jedis.save()方法)、bgsave(对应jedis.bgsave()方法),这两个命令一执行,不管配置文件中有没有配置自动持久化的条件,都会RDB持久化。但是值得注意的是,save命令是同步的持久化,会阻塞客户端的请求,不应避免在生产环境中用。bgsave命令是异步的持久化,不会阻塞客户端的请求。

3.执行清库命令

执行flushall命令(对应jedis.flushAll()方法)时,只要在配置文件中配置了自动RDB持久化的条件,即使达不到其中任何一条条件,也会进行RDB持久化。

4.主从复制时

当设置了主从模式时,即使没有设置自动RDB持久化的条件,也会在复制初始化时进行RDB持久化。

AOF持久化:

AOF是append only file,字面意思是往文件追加,其实就是把每一条写命令保存到硬盘上的一个文件上(读命令不会保存),文件名和文件路径在配置文件中配置,默认也在根目录,文件名是appendonly.aof。

redis默认关闭AOF,需要我们修改配置文件来开启AOF:appendonly yes,这样在redis服务一启动的时候就会在dir目录里创建aof文件,如果有的话(人为复制进去),就会读取aof文件内容,加载数据到内存。

将写命令保存到aof文件中的频率是可以在配置文件中配置的,默认是appendfsync everysec即每秒保存一次,这也是最好的方式。配置文件中还有另外两种可以选,appendfsync always即是每执行一条写命令就保存到文件中,这种方式是最安全的,但是要知道执行一条命令的速度是毫秒级的,所以这种方式是也是最耗费性能的。还有一种appendfsync no,最不常用,意思是由操作系统来决定,这简直是扯淡,不确定性太大。

aof文件还可以重写,为什么重写?比如说执行了100条写命令,但这些写命令都是对同一个键操作的,可能第100条命令就把前99条的结果覆盖了,这时候实际上只需要第100条命令就好了。aof文件重写可以自动重写,也可以调用命令直接重写。

自动重写条件可以在配置文件中配置,默认是

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb,即aof文件大小超过上次重写后的100%时会重写,但是文件大小要最少达到64M。

手动重写命令是bgrewriteaof(对应jedis.bgrewriteaof()),当执行了这个命令之后,aof文件就会立刻重写。

如果没有开启AOF,那么redis启动后redis会在dir目录中找rdb文件。如果有(在第一次启动时,人为添加一个rdb文件也可以),则读取rdb文件并加载数据到内存中,之后按照配置的规则来进行RDB持久化。如果没有(可能被人为删掉了),则在第一次RDB持久化的时候创建rdb文件,此后还是按照配置的规则来进行RDB持久化。

如果开启了AOF,那么redis就会在启动的时候读取aof文件的内容加载数据到内存中,即使aof文件内容为空,也不会去读取rdb文件。如果没有(可能redis上次运行的时候没有进行操作或者aof文件被人为的删掉了),则新建,之后按照配置的规则往文件里写数据。运行过程中,如果人为删掉aof文件,也不会再创建了,重启之后就会丢数据。

0 0
原创粉丝点击