Redis之持久化数据

Redis持久化数据

Redis中的数据是存储在内存中,内存是DRAM动态随机存储器,断电就会丢失内容,所以需要使用持久化技术来内存中的数据存到磁盘中,以防止突然断电丢失

两种持久化机制:快照 和 AOF

Redis持久化之快照:

什么是快照?
快照就是内存在某一时刻的全数据备份,是数据的二进制序列,着眼于数据,在存储上来说,非常紧凑

快照原理

Redis是单线程程序,当进行快照的时候,如果数据量很大的话,那么处理起来就会需要很多时间,导致Redis服务不能及时响应其他客户端的请求,所以Redis每次需要进行快照的时候,都fork出一个子进程,父进程继续为客户端提供服务,而子进程则去备份数据,但是当备份数据的时候,如果此时有客户端更新了数据,那该如何处理呢?

为了防止备份时更新数据,Redis使用了Copy On Write机制

使用操作系统的 COW 机制来进行数据段页面的分离。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面的数据进行修改时,会将被共享的页面复制一份出来,然后对这个复制的页面进行修改。这时子进程相应的页面是没有变化的,还是进程产生时那一瞬间的数据。

Redis持久化之AOF机制

AOF 日志存储的是Redis 服务器的顺序指令序列,AOF 日志只记录对内存进行修改的指令记录。
假设 AOF 日志记录了自Redis 实例创建以来所有的修改性指令序列,那么就可以通过对一个空的Redis 实例顺序执行所有的指令,来恢复Redis 当前实例的内存数据结构的状态。下面的例子讲一下为什么AOF比快照更冗余

//指令序列
set key "hello";
set key "hello word"
set key "hello word 2"

此时key的值为:hello word 2,AOF详细记录了指令机制,但是由于快照只关注于数据本身,进行快照的时候,其实只需要1条指令,那就是 set key "hello word 2"即可,但是AOF却使用了3条指令,所以快照比AOF更加紧凑

AOF重写,对AOF进行瘦身

子进程对Redis中的数据进行转换成一系列的Redis指令,去掉冗余的指令序列,序列化后的指令存储到一个新的AOP日志文件中,序列化完毕后,再将在操作期间更新的数据的AOF日志追加到这个新的AOF文件中,再使用新的AOF文件替代旧AOF文件即可

Fsync机制

如果对AOF进行操作时候,其实AOF日志是存在内存缓存中的,为了防止突然宕机导致AOF数据丢失,使用Fsync机制将内存中的数据刷新到磁盘中,可以设置 fsync的执行间隔,比如设置2秒执行1次这样…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值