缓存 —— Redis总结

一、持久化机制

  Redis是内存型数据库,为了避免应用重启、挂掉或断电等情况导致的数据丢失,Redis提供了持久化机制,即把内存中的数据持久化到磁盘,提升数据的可靠性。Redis提供了两种持久化方案:RDB持久化和AOF持久化。

方式1:RDB持久化

  RDB就是某时刻内存数据的快照,用于机器重启或者从机全量同步。RDB持久化过程为:

  1. 创建一个单独的子进程;
  2. 子进程启动后开始将内存数据dump到临时文件;
  3. 当拷贝完成后用临时文件替换现有的RDB文件(为了保证数据文件的完整性);
    在这里插入图片描述
方式2:AOF持久化

  AOF相当于MySQL的Binlog,每个被执行的写命令写到AOF文件的末尾,记录数据的变化。AOF持久化过程为:

  1. 先将写命令追加到aof_buf缓存区,避免每次有命令都直接写入硬盘;
  2. 按照配置的策略将缓存区数据写入磁盘,可以是同步写入,也可以是每秒同步等;

在这里插入图片描述

方案比较

  RDB丢失数据多,恢复快;AOF丢失数据少,恢复慢;

二、主从复制

  主从复制是为了解决单点问题,同时从节点可以提升读性能。主从复制都是异步进行的,不会阻塞主线程对请求的处理。
在这里插入图片描述

主从复制原理

  主要原理:首先利用RDB文件进行全量同步,将从节点数据恢复到某个时刻;然后进行增量同步,将从节点数据与主节点拉齐。
在这里插入图片描述

  • 全量同步的过程比较简单:主节点生成RDB文件,发送至从节点,从节点载入解析即可;
  • 增量同步:主节点每执行一条写指令,就会向从节点发送相同的指令,然后从节点接受并执行;

三、哨兵机制

作用: 当Master节点宕机时,动态选举产生Master节点,提升系统高可用性HA;

3.1 选主时机

  每个Sentinel节点会想所有的Redis节点发出心跳检测,当大多数Sentinel节点收到的心跳响应都超时时,则认为Master节点宕机,开始选择新的主节点;

3.2 选主规则
  1. 首先,选取优先级最高的节点;
  2. 如果节点优先级都相同,则选取复制数据最多的节点(偏移量最大);
  3. 如果都相同,则选择Run Id最小的节点;

在这里插入图片描述

四、Redis集群

  Redis集群的目的是解决扩展性,解决单机内存容量和写能力有限的问题。Redis集群方案可以分为三类:基于客户端分片、增加中间代理层,以及Redis官方方案。

方案1:Redis Cluster(官方版)
  1. Redis集群有固定的16384个槽位,每个Master节点负责管理一部分槽位;
  2. 集群各Master节两两互联,节点的信息(槽位、投票、迁移状态和选主等)基于Gossip协议广播到其它节点;
  3. 客户端发送请求时,随机连接到某台机器,根据key计算出对应槽位,并查询槽位所属的节点,如果不是当前节点则返回目标节点,客户端重连到目标节点;
    在这里插入图片描述

  哈希槽位将数据和节点解耦,方便集群动态调整。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了。
主从切换: 当多数Master节点认为某Master节点宕机时,会在集群中广播该节点的Fail状态,当该Master节点的Slave节点接收到Fail消息后,会立即发起投票广播到其它节点,如果有超过半数的Master节点投票通过,则Slave节点升级为新的Master节点,并广播到集群,集群其它Master节点接收消息,并更新路由表;
扩容/缩容原理
在这里插入图片描述
适用场景: Master节点数量在1000以内的场景,由于节点两两互联,节点数量过多会导致集群间网络拥堵。当节点数过多时,要么升级架构,要么创建其他独立的Redis集群。

方案2:中间层方案

  中间层方案是将数据功能和管理功能拆开,由两个集群分别负责。Redis集群(数据节点)只负责数据操作相关的功能,中间层(管理节点)负责集群的管理(数据路由、数据节点的监控和选主等);
在这里插入图片描述
适用场景: 适合对Redis写性能和内存容量有更高要求的场景(1000以上);

五、Lua脚本

支持Lua脚本原因
  1. 减少网络开销:多条命令合并到一个脚本中发送,减少RTT时间;
  2. 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入;
应用1:CAS操作

Redis中单个命令的执行是原子性的,如果想要实现多个命令的原子性,则需要将多个命令放入Lua脚本,借助Lua脚本执行的原子性来实现。

if Redis.call('get', KEYS[1]) == ARGV[1]  then
     Redis.call('set', KEYS[1], ARGV[2]);
     return 1
else
     return 0 end
应用2:分布式锁
  • 利用Lua脚本执行的原子性,实现加锁和解锁等多个判断逻辑的原子性;
  • 利用超时机制,避免死锁;
  • Value中包含拥有锁的线程信息,重入次数等,实现可重入锁等复杂工具;

参考:

  1. Redis持久化机制:RDB和AOF
  2. 第三十六章:Redis的主从复制
  3. 一文让你明白Redis主从同步
  4. Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了
  5. 第三十七章:Redis Sentinel哨兵机制
  6. 为啥RedisCluster设计成16384个槽
  7. Redis进阶应用:Redis+Lua脚本实现复合操作
基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值