redis持久化

持久化

Redis有两种持久化机制,第一种是快照RDB,第二种是AOF日志。快照是一次全量备份,AOF日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而AOF日志记录的是内存数据修改的指令记录文本。AOF日志在长时间运行会变很大,需要定期AOF重写,给AOF日志进行瘦身

在这里插入图片描述

快照原理

问题:

1、在服务线上请求同时,Redis还要进行内存快照,内存快照要求Redis必须进行文件IO操作,可文件IO操作不能使用多路复用API

2、为了不阻塞线上业务,Redis要一边持久化、以便响应客户端请求。

Redis使用操作系统的多进程COW(copy and write)机制来实现持久化快照

fork(多线程)

Redis在持久化时会调用glibc的函数fork产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求。子进程刚产生时,它和父进程共享内存里面的代码段和数据段

fork函数会在父子进程同时返回,在父进程里返回子进程的pid,在子进程里返回0.如果操作系统内存资源不足,pid会是负数,表示fork失败

子进程做数据持久化,只会遍历读取数据结构,然后序列化到磁盘,不会改变现有内存数据结构

父进程,必须持续服务客户端请求,然后对内存数据结构进行不间断的修改

在这里插入图片描述

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

AOF原理

AOF日志存储的是Redis服务器的顺序指令序列,AOF日志只记录堆内存进行修改的指令记录

Redis会在收到客户端修改指令后,进行参数校验,逻辑处理,没问题,就立即将该指令文本存储到AOF日志中,也就是,先执行指令才将日志存盘

AOF重写

redis提供bgrewriteaof指令对于AOF日志进行瘦身,原理就是开辟一个子进程对内存进行遍历,转换成一系列Redis的操作指令,序列化到一个新的AOF日志文件中。序列化完后在将操作期间发生的增量AOF日志追加到新的AOF日志文件中。

fsync

如果机器宕机,AOF日志文件没有来得及刷到磁盘中

Linux中glibc提供了fsync(int fd)函数可以将指定文件的内容强制从内核缓存刷到磁盘。Redis进程实时的调用fsync函数就可以保证AOF日志不丢失,但是fsync是一个磁盘IO操作,很慢

生产环境中,每隔1s左右执行一次fsync操作

运维

Redis主节点一般不会持久化操作,主要是从节点进行,没有客户端的压力

出现网络分区,从节点长期连不上主节点,会出现数据不一致的问题

要做好监控工作

增加一个从节点以降低网络分区的概率

混合持久化

4.0之前重启Redis时,一般使用aof日志重放

将rdb文件的内容和增量的AOF日志文件存在一起,AOF日志不再是全量的日志,而是自持久化开始到持久化结束这段时间发生的增量AOF日志,通常这部分AOF日志很小

在这里插入图片描述

Redis重启时,先加载rdb内容,在重放增量AOF日志,就可以替代之前全AOF全量文件重放,重启效率得到大幅度提升

参考:Redis深度遍历

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久化的可能面试问题: 1. Redis持久化有哪些方式? Redis持久化有两种方式,一种是 RDB 持久化,一种是 AOF 持久化。 2. RDB 持久化和 AOF 持久化有什么区别? RDB 持久化是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久化则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久化可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久化可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久化机制是如何保证数据一致性的? Redis持久化机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久化可以在运行时进行吗? 可以,Redis持久化可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久化,或者从 AOF 切换到 RDB 持久化。 5. Redis持久化会对性能产生影响吗? 会,Redis持久化会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久化可以与 Redis 集群一起使用吗? 可以,Redis持久化可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久化是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久化方式,并进行合理的配置和优化。在面试中,还需要了解 Redis 持久化的原理、机制、优缺点、与集群的结合等方面的知识。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值