Redis我们通常用来作为缓存来用,减少服务器数据库的压力,也有用Redis作为数据库来用的,效率肯定比关系型数据库效率高很多。
当用Redis来存储数据时,我们都要考虑Redis意外宕机怎么办,因为一旦Redis挂掉,我们上面存储的数据都会丢失,大量的请求会直接访问我们的数据库,这样的后果是很严重的。
这就要介绍Redis的持久化机制,我们首先讲第一种快照机制(RDB),持久化就是我们把Redis的数据生成RDB文件永久保存在磁盘上,当Redis停止服务时,数据还可以存储起来,服务重启后,还可以重新把磁盘上面的数据重新读取出来。
生成快照文件(RDB)可以用命令SAVE和BGSAVE,其中SAVE是同步的,因为Redis是单线程的(6.0以后是多线程了),所以其他任何请求都会阻塞,直到持久化完成。另外一个是异步的,Redis会调用glibc的函数fork产生一个子进程,父进程正常处理请求,子进程负责持久化。
因为SAVE是同步的,在Redis执行SAVE命令时,任何命令都不会执行,但是BGSAVE是异步的,如果我们在执行BGSAVE的时候在输入执行SAVE命令时,Redis会拒绝,因为如果执行的话,父进程和子进程会都去产生RDB文件。
如果在执行BGSAVE命令,用户再次发出执行BGSAVE命令,Redis同样也会拒绝。
RDB文件的载入没有命令,它是在Redis启动以后就开始读取,如果我们同时采用快照机制和AOF日志,redis会觉得AOF持久化效率高,默认使用AOF来还原数据,不读取RDB文件。
我们打开Redis的.conf文件,会看到默认配置。
当Redis启动时,它会读取我们的配置,然后根据配置设置redisServer的saveparams属性,
saveParams是一个数组,里面存储的是我们设置的条件,Redis会每隔100ms执行一次saveCron,循环遍历saveParams数组,只要有一个条件满足,就执行BGSAVE命令。
好的以上就是对快照机制的简单介绍,如果想要更加深入了解话,推荐阅读《Redis的设计与实现》。