什么是redis持久化?
Redis持久化就是将内存数据保存到硬盘。
为什么要redis持久化?
redis是基于内存的Key Value类型的NoSQL数据库,也就是说redis的数据是存在内存 中,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证redis在内存中的数据不会丢失,这种机制就叫redis持久化机制。
redis持久化方案
redis有两种持久化方式:Snapshotting(RDB) 和 Append-Only File(AOF),redis默认的持久化方式是RDB
1、RDB
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。
RDB 是以二进制文件,是在某个时间 点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
缺点:RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候
对于RDB来说,提供了三种机制去触发持久化,分别是:自动触发、save触发、bgsave触发
自动触发
修改redis.config配置文件,摘出部分配置信息如下:
#dbfilename:持久化数据存储在本地的文件----可修改文件名称
dbfilename dump.rdb ---->此文件是一个二进制文件
#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
dir ./
##snapshot触发的时机,save
##如下为900秒后,至少有一个变更操作,才会snapshot
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度
##可以通过“save “””来关闭snapshot功能
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1 ------>900秒超过1个key被修改就会触发持久化
save 300 10 ------>300秒超过10个key被修改就会触发持久化
save 60 10000 ------>60秒超过10000个key被修改就会触发持久化
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
rdbcompression yes
save触发
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:
执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。
这种save触发为啥会阻塞redis服务器,是因为占用了redis主线程去进行rdb文件的处理。
bgsave触发
执行该命令时,Redis会在后台异步进行快照操作&