哨兵原理、Redis分片、Redis数据结构、内存回收、缓存问题以及分布式事务相关内容(CAP、BASE、AT脏写及其解决、TCC、最大努力通知)

目录

一、哨兵原理

服务状态监控:

选举新的master:

如何实现故障转移:

哨兵原理总结:

二、搭建哨兵集群

三、Redis分片

搭建分片集群:

散列插槽:

四、Redis数据结构:

RedisObject:

SkipList:

SortedSet:

五、Redis内存回收:

内存淘汰策略:

六、缓存问题

缓存一致性:

缓存穿透:

缓存雪崩:

缓存击穿:

七、分布式事务理论基础------CAP和BASE

八、AT模式脏写问题

九、TCC模式

十、最大努力通知:


一、哨兵原理

服务状态监控:

选举新的master:

如何实现故障转移:

哨兵原理总结:

二、搭建哨兵集群

接下来我们开始手动搭建哨兵集群:

1.通过docker compose down指令关闭redis主从集群:

2.为三个哨兵创建各自的文件夹mkdir s1 s2 s3:

3.拷贝sentinel.conf配置文件到虚拟机当中,内容如下:

bash 复制代码
sentinel announce-ip "192.168.150.101" #虚拟机ip
sentinel monitor hmaster 192.168.150.101 7001 2 #告诉哨兵master的地址端口以及客观下线的quorum值
sentinel down-after-milliseconds hmaster 5000 #哨兵认为master宕机的连接超时时间
sentinel failover-timeout hmaster 60000 #哨兵对死去的master进行故障恢复的间隔时间,即每分钟进行连接重试

4.通过cp s1/sentinel.conf s2来快速拷贝文件:

5.修改原先的yml文件内容:

TypeScript 复制代码
version: "3.2"

services:
  r1:
    image: redis:6.2.7
    container_name: r1
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7001"]
  r2:
    image: redis:6.2.7
    container_name: r2
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7002", "--slaveof", "192.168.150.101", "7001"]
  r3:
    image: redis:6.2.7
    container_name: r3
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7003", "--slaveof", "192.168.150.101", "7001"]
  s1:
    image: redis:6.2.7
    container_name: s1
    volumes:
      - /root/redis/s1:/etc/redis
    network_mode: "host"
    entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27001"]
  s2:
    image: redis:6.2.7
    container_name: s2
    volumes:
      - /root/redis/s2:/etc/redis
    network_mode: "host"
    entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27002"]
  s3:
    image: redis:6.2.7
    container_name: s3
    volumes:
      - /root/redis/s3:/etc/redis
    network_mode: "host"
    entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27003"]

然后通过docker compose up -d指令启动:

这样我们就搭建好了哨兵集群

接下来我们来分析一下整个过程:

三、Redis分片

搭建分片集群:

1.在root目录下新建redis-cluster文件夹并添加yml配置文件,内容如下:

TypeScript 复制代码
version: "3.2"

services:
  r1:
    image: redis:6.2.7
    container_name: r1
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7001", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
  r2:
    image: redis:6.2.7
    container_name: r2
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7002", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
  r3:
    image: redis:6.2.7
    container_name: r3
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7003", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
  r4:
    image: redis:6.2.7
    container_name: r4
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7004", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
  r5:
    image: redis:6.2.7
    container_name: r5
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7005", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]
  r6:
    image: redis:6.2.7
    container_name: r6
    network_mode: "host"
    entrypoint: ["redis-server", "--port", "7006", "--cluster-enabled", "yes", "--cluster-config-file", "node.conf"]

然后手动关闭原先搭建好的哨兵集群(指令:docker compose down):

接着来到redis-cluster文件夹下通过docker compose up -d指令启动集群:

2.此时只是创建好了六个容器,它们之间并没有分片或者集群关系,所以我们接下来要配置分片集群关系:

bash 复制代码
# 进入任意节点容器
docker exec -it r1 bash
# 然后,执行命令
redis-cli --cluster create --cluster-replicas 1 \
192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 \
192.168.150.101:7004 192.168.150.101:7005 192.168.150.101:7006

命令说明:

  • redis-cli --cluster:代表集群操作命令

  • create:代表是创建集群

  • --cluster-replicas 1 :指定集群中每个master的副本个数为1

    • 此时节点总数 ÷ (replicas + 1) 得到的就是master的数量n。因此节点列表中的前n个节点就是master,其它节点都是slave节点,随机分配到不同master

随后,虚拟机会询问你是否接收配置结果,输入yes完成配置:

可以通过redis-cli -p 7001 cluster nodes指令查看分片集群部署关系:

散列插槽:

四、Redis数据结构:

RedisObject:

SkipList:

SortedSet:

五、Redis内存回收:

内存淘汰策略:

六、缓存问题

缓存一致性:

缓存穿透:

缓存雪崩:

缓存击穿:

七、分布式事务理论基础------CAP和BASE

八、AT模式脏写问题

回顾一下AT模式原理:

九、TCC模式

十、最大努力通知:

相关推荐
小林ixn2 小时前
用 Next.js 和 Redis 撸一个 Markdown 笔记系统:RSC 实战与组件化拆解
前端·redis·next.js
零域码客4 小时前
从 SQLite 到 PostgreSQL:轻量单机到分布式架构选型、避坑与迁移全解析
分布式·postgresql·sqlite·wal·架构设计·后端开发·数据库选型
北漂燕郊杨哥4 小时前
Win11 环境下 phpStudy 安装 Redis 最新版,并为 PHP 8.5.9(NTS)配置 redis 扩展
数据库·redis·php
ltl13 小时前
2PC 的真实失败模式:阻塞、脑裂与恢复
分布式
霸道流氓气质15 小时前
分布式系统设计:技术解析与实践
分布式
ACP广源盛1392462567318 小时前
蚂蚁百灵 Ling‑3.0‑flash 开源 + 昇腾 0‑Day 原生适配@ACP#GSV9001E 在国产算力矩阵中的机会与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
天疆说19 小时前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
嘟嘟071720 小时前
Next.js 博客左侧笔记列表是怎么从 Redis 渲染出来的?从组件、children 到动态路由一次讲清
redis·react.js·前端工程化
汽车仪器仪表相关领域1 天前
KRYPTON坚固型IP67 EtherCAT总线数据采集模块:工业级分布式采集方案
分布式·功能测试·汽车·压力测试·可用性测试
Rain的Java大神之路1 天前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构