it编程 > 数据库 > Redis

Redis分布式缓存方式(RDB、AOF、主从同步)

2人参与 2026-03-20 Redis

1. redis持久化

实现redis数据持久化有三种方式

1.1 rdb快照

rdb快照又叫做redis数据快照,简单来说就是,将数据记录到磁盘中,当redis发生故障重启后,可以根据快照文件进行数据回复。

由于rdb保存的是全部数据,手动保存所需时间可能比较久,会阻塞线程。因此我们通常使用bgsave即创建一个子线程去进行数据备份。

# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用rdb
save 900 1  
save 300 10  
save 60 10000 

rdb在执行快照时,数据能修改吗?

可以,rdb中bgsave采用的是write-on-copy技术,主线程会fork一个子线程并复制主线程的页表,当主线程进行读操作时,会根据页表的映射关系读取到磁盘中的数据。

当主进程执行写操作时,会创建一个数据副本,子进程会把数据副本也写入磁盘。

小结:

rdb方式bgsave的基本流程?

rdb会在什么时候执行?save 60 1000代表什么含义?

rdb的缺点?

1.2 aof日志

aof日志是redis在执行完命令后会把每一个命令都追加到一个文件里,当redis重启后,可以根据文件里面的命令进行数据的恢复。

1.2.1 aof的三种回写策略

1.2.2 aof重写机制

当aof文件过大时会触发重写机制,简单来说就是会读取数据库中的键值对数据,然后将每个键值对用一条命令记录到aof文件中,将重复的命令合成为一个命令,全部完成后,再将新的aof文件替换掉旧的aof文件,比如:

原本是三个命令,修改了两次num但是实际起作用的只有最后一次修改,并且由于两次执行的都是set操作,因此可以合并为mset。

重写的过程:主进程创建重写aof的子进程,父子进程共享物理内存,重写子进程对这个内存为只读,重写子进程会读取数据库里的所有键值对,将每个键值对转化为一条命令。再将命令记录到重写日志(新的aof日志)

与此同时==主进程依然可以进行正常命令处理。但是这时有个新问题:如果主进程进行了key-value的修改,那主进程和子进程的内存数据不一样了怎么办?

这里redis设置了aof重写缓冲区==,当redis执行完一个命令后,它会同时将这个命令写入[aof缓冲区]和[aof重写缓冲区]

当子进程执行完重写操作后,会向主进程发送一条信号,主进程收到信号后会调用信号处理函数,作用是:将aof重写缓冲区的所有内容追加到新的aof文件中,将新的aof文件覆盖现在的aof文件

1.3 rdb和aof对比

1.4 混合持久化

即结合了rdb与aof的优点:aof前半部分是rdb格式的全量数据,后半部分是aof格式。

缺点:可读性差,兼容性差。

2.redis主从复制

如果我们将数据只存到一个redis服务器当中,如果该redis宕机,就会造成严重后果。因此我们将数据存到多个服务器中,其中把数据同步到其他服务器采用的就是redis主从复制。

2.1第一次同步

主从服务器的第一次同步可以分为三个阶段:

第一阶段:建立连接,协商同步

里面包含两个参数:

第二阶段:主服务器同步数据给从服务器

为了保持主从数据的一致性,主服务器将在下面三个时间间隔里进行的写操作记录到replication buffer缓冲区中

第三阶段:主服务器发送新的写操作给从服务器

2.2 命令传播

主从服务器第一次同步后双方就会简历一个tcp连接,后续的写操作可以通过这个连接来将命令传播给从服务器

2.3 增量复制

当主从服务器之间的连接断开后再次重新连接,同步数据的过程叫增量复制

这里也主要有三个步骤:

其中

repl_backlog_buffer,和offset起到关键作用

那repl_backlog_buffer里的内容是什么时候写入的呢?

在主服务器进行命令传播时,也会将命令存入repl_backlog_buffer,因此这个缓冲区里存放着最近的命令。

主服务器和从服务器之间的差,就是增量同步的数据

但是如果,主从服务器之间差的太多,已经将从服务器未同步的数据覆盖掉了,那接下来将使用全量同步的方式。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

Redis之分布式缓存使用解读

03-20

Redis缓存雪崩原理、防御策略与工程实践指南

03-19

详解Redis终端操作和Redis-plus-plus接口使用教程

03-18

Redis在jwt中作用小结

03-17

Redis的缓存机制用法及说明

03-17

基于Redis Set轻松实现简单的抽奖系统

03-17

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论