• Redis集群及分布式锁


    1、无中心化集群

    在这里插入图片描述

    2、redis集群搭建

    1、进入/root/myredis文件目录

    cd /root/myredis
    
    • 1

    在这里插入图片描述

    2、进入redis6378.conf,并添加一下内容

    cluster-enabled yes 打开集群模式
    cluster-config-file nodes-6379.conf 设定节点配置文件名
    cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    3、复制配置文件
    在这里插入图片描述

    4、修改配置文件

    批量修改命令

    :%s/被替换的内容/替换后的内容
    
    • 1

    在这里插入图片描述

    5、启动上面配置的六台redis服务
    在这里插入图片描述

    6、将六个节点合成一个集群

    组合之前,请确保所有redis实例启动后,node-xxxx.conf文件都生成正常。
    在这里插入图片描述

    7、Redis报错:-bash redis-cli command not found

    sudo cp src/redis-cli /usr/local/bin/
    
    • 1

    sudo cp src/redis-cli /usr/local/bin/

    8、执行下面的命令

    redis-cli --cluster create --cluster-replicas 1 192.168.18.135:6379 192.168.18.135:6380 192.168.18.135:6381 192.168.18.135:6389 192.168.18.135:6390 192.168.18.135:6391
    
    • 1

    在这里插入图片描述

    9、连接redis集群

    redis-cli -c -p 6379
    
    • 1

    10、通过cluster nodes 命令查看集群信息
    在这里插入图片描述

    11、分配原则

    分配原则尽量保证每个主数据库运行在不同的IP地址,每个主库和从库不在一个IP地址里面。

    127.0.0.1:6379> set k1 v1
    -> Redirected to slot [12706] located at 192.168.18.135:6381
    OK
    
    • 1
    • 2
    • 3

    底层有一个计算插槽的过程,k1 计算后的插槽值为12706,只要落在6381 【10923-16383】节点所在的区间。所有k1存放到6381这个主节点上。set值后自动切换到6381节点。【这里就体现了去中心化的过程

    在这里插入图片描述

    12、一次添加多个值

    分组添加

    mset name{user} lucy age{user} 20
    
    • 1

    13、查看k插槽的值

    cluster keyslot k名称
    
    • 1

    14、杀掉6379服务,再查看节点情况,发现6390(6379的从机)成为主机。

    在这里插入图片描述

    15、重启6379,再查看节点情况,发现6379从原来的主机变为现在的6390的从机。

    在这里插入图片描述

    如果某一段插槽的主从节点都宕机了,redis集群服务是否还能继续?

    • 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes,那么整个集群都挂掉

    • 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,那么,该插槽数据全部不能使用,也无法存储。其他插槽依然可以提供服务。

    3、Jedis - 通过java代码操作redis

    4、应用问题解决

    4.1 缓存穿透

    在这里插入图片描述

    ​ (4)进行实时监控:当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。

    4.2 缓存击穿

    现象:

    在这里插入图片描述

    4.3 缓存雪崩

    在这里插入图片描述

    5、分布式锁

    (1)redis中使用命令来设置分布式锁

    setnx k v
    
    • 1

    在这里插入图片描述

    第一次使用setnx设置值时是成功的,但是第二次设置就失败了,说明第一次就加锁了。

    (2)如何释放锁

    使用命令

    del k
    
    • 1

    在这里插入图片描述

    使用删除命令后,再设置值成功。

    (3)以上的设置锁的方式存在的问题?

    当锁一直不释放,那么后面的所有操作将搁置,怎么解决这个问题呢?很简单,就是给该锁加一个过期时间

    使用命令【这种方式不是原子操作

    setnx users 10
    expire users 10
    
    • 1
    • 2

    在这里插入图片描述

    总结:

    (1)使用setnx上锁,通过del释放锁

    (2)锁一直没有释放,设置key过期时间,自动释放

    (3)上锁之后突然出现异常,无法设置过期时间了

    • 上锁时候同时设置过期时间就可以解决这个问题

      给users设置值为10 ,并设置过期时间为12秒

      127.0.0.1:6379> set users 10 nx ex 12
      OK
      127.0.0.1:6379> ttl users
      (integer) 5
      
      • 1
      • 2
      • 3
      • 4

    6、分布式锁存在的问题

    1、问题描述

    在这里插入图片描述

    解决方案:

    在这里插入图片描述

    在设置锁的时候,将锁的值设置为一个随机的uuid值,再在需要释放锁的时候,获取该锁的值并进行比较,如果相等,则说明是同一把锁,再执行释放锁的操作,这样就有效的避免了误删其他的锁。
    在这里插入图片描述

  • 相关阅读:
    前端学习路线(一)
    【CTF机器人】文件头字节查询(Nonebot2+CQHTTP)
    【Arduino ESP32教程入门】Note
    Codeforces Round 932 (Div. 2) ---- E. Distance Learning Courses in MAC ---- 题解
    NDIR二氧化碳传感器原理介绍
    ZJU-199001 第三周练习 2 数字特征值 位运算算法
    获得进程的内核转储core
    Meta Learning
    黑猫带你学UFS协议栈第3篇:UFSHCI系统框架介绍
    监控易101:全方位解读运维的核心功能与特性
  • 原文地址:https://blog.csdn.net/java123456111/article/details/125418707