Redis持久化的两种方式
redis是一个支持持久化的内存数据库,也就是说,redis需要经常有内存中的数据同步到硬盘来保证持久化。为了保证数据数据的持久性,它提供了两种持久化方式。
- RDB方式
- AOF方式
RDB
什么是RDB
RDB是通过一条命令,将Redis内存中的数据完整的生成一个快照,然后保存到硬盘中,也就是RDB文件。RDB文件将内存中的数据以快照的方式写入二进制文件中,默认为dump.rdb,可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key修改就自动做快照。
触发机制-主要三种方式
- save(同步),同步命令,在执行完这条命令之前,其他所有命令都要进行排队,等它执行完之后,才能做一些其他的命令。
- 文件策略:如存在老的RDB文件,新的替换掉老的。
- bgsave(异步),执行完成后,会立刻返回OK,在后台单独线程去执行。
- 文件策略:与save相同。
- 自动:在达到某些条件后,自动进行RDB文件的生成。
save与bgsave
命令 | save | bgsave |
IO类型 | 同步 | 异步 |
阻塞? | 是 | 是(阻塞发生在fork) |
复杂度 | O(n) | O(n) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要fork,消耗内存 |
RDB配置
save 900 1 :900秒内如果超过1个key被修改,则发起快照
save 300 10:300秒内如果超过10个key被修改,则发起快照
save 60 10000:60秒内如果超过10000getkey被修改,则发起快照
dbfilename dump.rdb:生成的文件名称为dump.rdb
dir ./ :文件的存在位置
stop-write-on-bgsave-error yes:如果bgsave发生错误是否停止写入
rdbcompression yes:RDB文件是否采用压缩的格式
rdbchecksum yes:是否对RDB文件进行校验和检验
AOF方式
由于快照方式是在一定时间间隔做一次,所以可能发生redis意外down的情况就会丢失最后一次快照后的所有修改的数据。aof比快照的方式有更好的持久化性,是因为在使用aof时,redis会将每一个会将每一个收到的写命令都通过write函数追加到命令中,当redis重新启动时会重新执行文件中保存的写命令来在内存中重建这个数据库的内容,这个文件在bin目录下的appendonly.aof。
aof不是立即写到硬盘中,可以通过配置文件修改强制写到硬盘中。
AOF设置
appendonly yes:启动aof持久化方式,有三种修改方式
#appendfsync always:收到写命令就立即写入到磁盘,效率最慢,但是保证完全的持久化
#appendfsync everysec:每秒写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no:完全依赖OS,性能最好,持久化没保证