Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • Redis基础

    • 安装配置
    • 数据类型
    • Redis使用
    • Redisson分布式锁
    • Redis分布式缓存
      • 1.Redis保证高可用
      • 2.Redis持久化
        • RDB
        • AOF
      • 3.Redis主从同步
      • 4.哨兵机制
      • 5.分片集群
  • 源码分析

  • 实战应用

  • 单机缓存

  • Redis
  • Redis基础
phan
2023-05-15
目录

Redis分布式缓存

# Redis分布式缓存

# 1.Redis保证高可用

  • 主从模式

只有一个主节点,和多个从节点,主节点进行写,然后会把数据同步到所有从节点上,而从节点只能读,用来缓冲高并发读下的流量冲击。缺点在于,主节点宕机后,需要手动设置把一个从节点提到主节点的位置,费时费力并且还会造成一段时间的停止服务。

  • 哨兵模式

哨兵进程通过发送哨兵命令来监控主从节点是否宕机,一旦发现主节点挂了,哨兵进程之间就会选举产生新的Master节点。

  • 集群模式

由于每台Redis机器都存储相同数据,很浪费内存。因此可以让数据分片,每台redis机器上都存储不同的内容。

# 2.Redis持久化

# RDB

  • RDB:把内存中的所有数据都记录保存在磁盘中一个RDB文件。当Redis实例故障重启后,能够从磁盘读取快照文件恢复数据。一般默认关机会自动保存,redis.conf中有触发RDB的机制,save 900 1 表示900秒内如果至少有一个key被修改,则执行bgsave后台保存。

  • 本质是fork主进程得到子进程,子进程复制主进程的页表,通过页表来读取物理内存。

  • 当主进程执行写操作时,采用copy-on -write会先拷贝一份数据,再执行写操作。

  • 缺点:耗时,两次备份之间宕机会丢失数据。

# AOF

  • AOF:redis处理的每一个写命令都记录在AOF文件中,Redis只需要重新执行一遍AOF中的写命令就可以恢复数据。实现时通过服务器创建一个没有网络连接的伪客户端(因为Redis命令只能在客户端上下文中进行),然后从AOF文件读一条指令,并写入到Redis中,不断重复。
  • RDB记录的是值,而AOF记录的操作中含有很多无效信息,因此AOF文件会比RDB文件大很多。
  • 缺点:AOF的文件体积可能会越来越大,比如不断对同一条记录添加删除添加删除。因此可以使用bgrewriteaof命令,让AOF文件执行重写功能,以最少的命令达到同样效果。(比如对相同key的覆盖操作)
  • AOF安全性比RDB高,数据恢复优先级先选AOF。

系统优先使用AOF持久化进行数据复原;若AOF关闭则使用RDB文件进行还原。

# 3.Redis主从同步

主节点负责写操作,其余的所有从节点负责读操作。主节点需要向从节点进行数据同步。

  • 全量同步:执行bgsave生成RDB+新的数据log,都发送给slave进行同步。从节点第一次和主节点会采用全量同步,master判断replid回复id一致则进行增量同步。
  • 增量同步:一般发生在从节点重启的情况。不需要发送RDB,仅发送offset后的数据。repl_baklog本质是一个环形数组,当master的offset和slave相差超过整个环时,master上还没同步的数据被覆盖了,因此slave需要去主节点内存中做全量同步。
image-20230308204421284
  • 优化主从同步
    • 主节点启用无磁盘复制,因为RDB正常是先写到磁盘中,然后再进行网络传输。启用后RDB直接写到网络IO流中传输,避免了磁盘IO。
    • Redis单节点内存占用不要太大,减少RDB导致的过多磁盘IO。
    • 提高repl_baklog的大小;从节点及时同步。
    • 减轻集群中master节点同步的压力,主-从-从结构,由同步了的从节点接下去给其它从节点进行同步。

# 4.哨兵机制

哨兵的作用:①监控主从节点是否按照预期工作②主节点故障后会将一个从节点提升为主节点③通知redis客户端

  • 选举规则

    • 哨兵会每隔1秒钟向redis发送ping命令进行心跳监测,如果发现主节点故障,则开始选举新的master。
    • 首先排除和主节点断开时间很长的slave
    • 然后判断从节点的优先级,越小优先级越高
    • 如果优先级一样则判定offset,越大说明数据越新
    • 最后是slave节点的运行id,越小优先级越高。
    • 选举成功后修改原先主节点的配置文件,变成slave节点。
  • RedisTemplate 配置读(从)写(主)分离

    • 引入maven依赖
    • 配置哨兵集群地址(redis-sentinel s1/sentinel.conf 启动哨兵节点)
    • 配置读写分离
@Bean
public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer(){
    return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
}
1
2
3
4
  • 哨兵模式下如何选取新的主节点

哨兵节点先给redis集群中的节点发送心跳包,对方未回应且超过一定数量哨兵节点都认为该节点下线,则该节点下线。

如果下线的是主节点,则哨兵集群中会先选择一个哨兵leader(每个哨兵给自己投票),然后由哨兵leader选主节点。依据的优先级:

①从节点优先级最大的作为主节点②复制偏移最大的作为主节点③runid最小的作为主节点。

# 5.分片集群

解决主从集群①高并发写②海量数据存储的问题。

多个master节点之间相互做哨兵,相互发送心跳监测。

编辑 (opens new window)
#Redis#高并发
上次更新: 2023/12/15, 15:49:57
Redisson分布式锁
数据结构

← Redisson分布式锁 数据结构→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式