redis原理——持久化

拓展:

内存存储器属于DRAM(动态随机存取存储器),DRAM采用电荷存储信息,是易失性存储器,断电丢失信息。

磁盘属于ROM,采用存储介质存储信息,是非易失性存储器,断电不会丢失信息。

持久化就是将内存中易失性的数据刻写到磁盘中的存储介质中,保证断电后也能够长久保存。

Redis持久化的两种方式:RDB快照与AOF日志

一、RDB——快照

1、原理

①fork一个子进程生成快照。由于Redis是单线程的,同时处理请求和生成快照,会严重影响处理请求的效率,所以在进行RDB持久化时会调用glibc的fork函数产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端读写请求。子进程会生成一个临时快照文件,当RDB结束时,会替换原来的快照文件dump.rdb

②COW写时复制策略。fork的子进程刚刚产生时,和父进程共享内存;当子进程生成快照的同时,如果父进程接受写请求,需要对数据进行修改时,就会复制需要修改数据所在的页(内存管理方式——页式存储,1页4KB),然后父进程在复制页上修改,子进程根据原来的页生成快照。理论上不会超过原来内存的两倍,redis中冷数据比例较高,远达不到两倍。

2、RDB的时机

①调用指令SAVE与BGSAVE时,会生成快照。区别在于BGSAVE会fork子进程,子进程执行RDB工作;SAVE不会fork子进程,由主进程执行RDB工作(严重降低请求效率)。

②调用shutdown时如果没有开启AOF日志持久化,会触发RDB持久化。

③调用flushall清除所有缓存时,也会触发RDB持久化,此时RDB是空的。

3、RDB的相关配置

 启动时的配置文件redis.conf

①自动触发RDB:

save 900 1        //每900秒内至少有一个key值变化,默认BGSAVE触发RDB
save 300 10      //每900秒内至少有一个key值变化,默认BGSAVE触发RDB
save 60 10000  //每900秒内至少有一个key值变化,默认BGSAVE触发RDB

②stop-writes-on-bgsave-error:当BGSAVE触发RDB报错时是否停止写操作,提醒开发人员redisRDB持久化出错了。

 ③rdbcompression:生成的dump.rdb文件是否压缩

 ④rdbchecksum :dump.rdb文件生成后是否校验准确性

 ⑤dbfilename:生成的持久化文件名称,默认dump.rdb

 ⑥dir:生成持久化文件路径,也是rdb启动时读取文件目录

二、AOF——日志

 

猜你喜欢

转载自www.cnblogs.com/wqff-biubiu/p/12289614.html