Redis常用进阶 存储原理和主从思路

Redis常用进阶 存储原理和主从思路

简介

此篇用于需要时随时查阅的知识. 由于不断的学习总是会忘记一些 所以用于记录

笔记对应视频为黑马redis

https://www.bilibili.com/video/BV1Pu411Y7bq

单点redis的问题 :

  1. 数据丢失问题 持久化
  2. 并发能力弱 主从集群
  3. 存储能力问题 ES
  4. 故障恢复问题 哨兵 健康监测 恢复 (此类不做了解)

所有例子采用的是win10的redis linux其实同理 环境搭建比较费事主要用于记录解决方案

使用的redis版本 Redis-6.0.17-Windows-x64

存储机制

RDB

RDB 全程为redis database backupfile 就是使用线程将内存中的数据记录到磁盘中 当做redis案例故障重启后 从磁盘读取的快照文件 用于恢复数据 默认是保存在当前目录

save 使用主进程执行RDB

bgsave是使用子线程执行rdb

当redis主线程停止的时候 会默认的执行一次RDB

image-20250319172453868

默认情况下 redis只有在结束主线程之前才会执行一次rdb 但是如果出现宕机数据就会出现丢失

image-20250319174724222

配置定时RDB

我们可以通过配置文件的配置项 来设置多少时间内有多少数据变动来触发rdb

这是redis的默认出发设置

image-20250319172809753

我们也可以通过 dir来设置文件存储的位置 不推荐开启压缩 因为cpu资源更加宝贵

image-20250319174740420

bgsave

开始的时候会fork主进程到子进程 子进程共享内存数据 完成之后读取内存数据到RDB文件

image-20250319174905955

RDB缺点
  • RDB执行时间长 可能存在数据丢失风险
  • 子进程压缩和写出比较耗时

AOF

Append Only File Redis处理的每一个写命令都会记录在AOF文件中 可以当做命令日志文件,如果redis出现了故障 恢复的时候就读取日志文件恢复

AOF默认是关闭的 我们需要去配置打开

image-20250319175205840

aof 有三种频率 自上向下

  • 每执行一次就存
  • 写命令执行完先放入缓冲区 一秒一秒的写入 最多丢失1秒的数据
  • 执行完命令直接放入缓冲区 由系统决定什么时候写到磁盘

image-20250319175242959

性能对比:

image-20250319175411717

使用

image-20250319180112076

image-20250319180136855

AOF文件的缺点

AOF占用的硬盘体积会比RDB大很多很多 因为AOF记录的是写命令 如果修改的key重复那么会多出很多无意义的记录

可以通过 执行 bgrewriteaof命令来让AOF执行重写功能 用最少的命令达到相同的记录效果

image-20250319180435225

虽然变成了乱码 但是可以从一些片面的信息看到我们的key和一些值

redis给我们提供了配置 可以设置 AOF文件大于一定体积的时候就执行一次bgrewriteaof命令来最大限度的提升使用效率 分别是

  • 根据上次文件的体积
  • 根据固定的大小

image-20250319180717849

对比

image-20250319180803045

主从架构

主从架构是用来提升redis的并发上限的 主从之间会同步数据来达到承载更多数据压力的效果, 主节点来执行写操作 从节点来执行读操作就可以提升上限

这次根据教程的例子 我们搭建一主二从

  • 7001 master
  • 7002 slave
  • 7003 slave

架构搭建

恢复配置 关闭 aof 开启 rdb 创建三个文件夹 每一个redis实例都需要自己的配置文件

创建完毕后将 redis.conf复制到每一个目录 然后修改端口号

我们配置主从可以使用 replicaof或者slaveof命令 来使用

也可以使用配置文件的方式来完成主从绑定

启动所有实例

image-20250319182147939

配置主从的命令如下:

SLAVEOF 主节点的ip 主节点的端口

image-20250319182415962

这样主从的配置就配置好了 , 我们可以使用 INFO REPLICATION命令来查看主从信息

image-20250319182558308

我们在主节点写入 所有的从节点都可以查询到数据

数据同步原理

主从数据的第一次同步 是全量的同步 ,交流信息校验过程如下:

而主从之间的同步需要使用 RDB 文件这也是为什么配置架构的时候我们需要打开RDB

image-20250319182912396

master持有数据集id这个id具有唯一性 对应着一个数据集 所有slave都回去继承这个repid,

主机通过偏移量来确认主从同步的数据是否一致 ,所以slave同步时需要将repid和偏移量体提交给master来判断数据的同步容量,

主从之间的增量同步 : 如果主从之间的断开时间太多 slave和master差距太大 就只能全量同步了,如果没有超出设定的范围则根据偏移量来完成增量同步

image-20250319183548540

数据同步优化原理

  • 在主节点中配置启用无磁盘复制 REPL-DISKLESS-SYNC 避免全量同步时磁盘io的占用 尽可能减少全量同步
  • 我们可以适当的提高 repl-baklog的大小 增加缓冲区 及时的恢复宕机的slave
  • 如果主节点压力太大 slave太多 可以采用链式的方法来降低各个主节点的压力
<think> 嗯,用户明确提出了想获取Redis高级进阶学习的相关知识。从用户引用的多个资料片段来看,用户应该已经掌握了Redis的基础知识,现在希望向更深入的领域探索。 用户引用的资料[1]特别提到了一份涵盖原理、集群、应用、拓展、源码五个方面的Redis高级笔记,这正好符合用户当前的需求阶段。资料[2]也验证了这个知识框架的完整性。而资料[3]提到的数据类型深度解析优化方法,资料[5]涉及的持久化配置细节,都是进阶学习的关键内容。 考虑到用户可能的发展方向,需要覆盖以下几个方面:首先是底层原理,包括内存管理、线程模型等;其次是集群方案,特别是分布式场景下的解决方案;然后是实战优化,如何提升Redis在生产环境中的表现;最后是源码层面,为深度定制做准备。 在组织回复时,应该突出知识体系的层次性。把最核心的原理放在第一部分,因为这是理解后续内容的基础。集群方案要强调主从复制分片的区别,这是很多开发者容易混淆的点。优化部分需要给出具体可操作的技巧,比如连接池配置慢查询分析方法。源码学习路径要降低用户的学习门槛,建议从核心数据结构开始。 用户提到"面试跟日常开发肯定够用",说明可能有职业发展需求,所以补充了面试加分项这个实用模块。同时注意到资料[4]提到面试官会随机考察知识广度,因此在集群方案中特意加入了Codis等生态工具的介绍。 最后用资料[1]的"原来Redis还能这么玩"作为结尾呼应,保持轻松专业的语气。相关问题设计覆盖了用户可能继续探索的方向,特别是源码性能优化这类深度话题。 </think> 以下是Redis高级进阶学习的核心知识体系,结合权威资料整理为系统化框架,助你全面提升Redis实战与原理理解: --- ### **一、底层原理深度解析** [^1][^2] 1. **内存管理机制** - 动态字符串(SDS)设计与优势 - 字典(rehash)渐进式迁移策略 - 跳表(zskiplist)实现有序集合 - 内存碎片优化方案 2. **多线程模型演进** - Redis 6.0+多线程IO原理 - 单线程命令处理的原子性保障 - 后台线程处理过期键AOF ```c // SDS结构示例(源码简化版) struct sdshdr { int len; // 实际字符串长度 int free; // 剩余空间 char buf[]; // 字节数组 }; ``` --- ### **二、高可用集群架构** [^1][^2] | **方案** | **核心机制** | **适用场景** | |----------------|------------------------------|-------------------------| | 主从复制 | 全量同步+增量同步 | 读写分离基础架构 | | Redis Sentinel | 哨兵选举、故障自动转移 | 高可用监控解决方案 | | Redis Cluster | 虚拟槽分区(16384 slots) | 分布式横向扩展 | | Codis | Proxy层分片方案 | 大规模集群迁移过渡方案 | --- ### **三、性能优化实战** [^3][^5] 1. **持久化调优** - RBD配置策略:`save 900 1` vs `save 60 10000` - AOF重写优化:`auto-aof-rewrite-percentage 100` - 混合持久化:`aof-use-rdb-preamble yes` 2. **高并发陷阱规避** - Pipeline批量操作减少RTT - 连接池配置:`maxTotal`与`maxIdle`比例 - 慢查询监控:`slowlog-log-slower-than 10000` --- ### **四、源码级深度探索** [^1][^2] 1. **学习路径建议:** - ① 事件驱动框架:`aeEventLoop` - ② 数据结构实现:`dict.c` / `ziplist.c` - ③ 网络通信模型:`networking.c` 2. **调试技巧:** ```bash # GDB调试Redis实例 gdb --args ./src/redis-server redis.conf break processCommand ``` --- ### **五、应用场景进阶** [^3][^4] 1. **分布式锁方案** - Redlock算法实现与争议 - SETNX + Lua原子释放 2. **二级索引构建** - 利用ZSet实现多维度排序 - GEO模块实现地理位置查询 3. **流处理系统** - Stream数据结构实现消息队列 - 消费者组(Consumer Group)负载均衡 --- ### **六、面试深度考点** [^4] ```markdown 高频问题示例: 1. Redis事务与MySQL事务的本质区别? 2. 缓存雪崩/穿透/击穿解决方案对比 3. 集群脑裂(Split-Brain)的产生与预防 4. Redis7新特性(Function API、ACL增强) ``` > 资料建议:结合《Redis设计与实现》+ Redis官方源码注释学习[^1][^3],实战推荐通过`redis-benchmark`压测不同配置的性能差异[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值