Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

  • 计算机基础

  • 框架|中间件

    • Spring

    • MyBatis

    • MySQL

    • Redis

      • Redis简介
      • Redis常用命令
      • Redis底层数据结构
      • Redis数据结构
      • Redis多线程单线程问题
      • Redis过期删除策略和缓存淘汰机制
      • Redis持久化
      • Redis分布式锁
        • 1 Redis分布式锁
        • 2 Redis和Zookeeper分布式锁的区别
        • 3 Redission
      • Redis事务
      • Redis缓存穿透、缓存击穿、缓存雪崩
      • Redis集群 - 哨兵模式
      • Redis集群 - Redis集群
    • 消息队列

    • Zookeeper

    • Git

    • Maven

    • Gradle

  • 架构

  • 后端
  • 框架|中间件
  • Redis
Marvel
2022-07-16
目录

Redis分布式锁

# Redis分布式锁

一文彻底弄清楚分布式锁 (opens new window)

# 1 Redis分布式锁

原理:多个服务,同一时刻内请求同一个共享资源,为防止关键业务出现数据冲突和并发错误,需要加分布式锁。

实现:set <key> <value> [EX seconds] [PX milliseconds] [NX|XX],如果key不存在就设置键值对并带有过期时间,如果存在就设置失败。

注意点:

  1. 设置Key的同时要设置过期时间,防止服务突然宕机,后续锁无法释放。设置key和过期时间的过程要保证原子性。
  2. 如果业务A执行的时间太长,锁已经过期了,此时其他线程获取了锁。当业务A执行完毕,此时将释放其他线程的锁,这将导致一系列问题。所以在释放锁的时候要通过Value判断是不是自己加的锁。(所以,value的选择要唯一,保证每一个服务线程的值是唯一的)
  3. 需要保证判断”是不是自己的锁“和”释放锁“的过程是原子性的,最常用的方法是写LUA脚本,也可以通过Redis的事务实现。

其他高级问题:

  1. 缓存续命:当分布式锁快要到期,业务还没有执行完的时候,需要给锁续命。
  2. Redis集群可能出现的问题,异步复制会造成锁丢失:主节点刚刚告诉线程加锁成功,还没来得及把这个数据复制给从节点就挂了。

# 2 Redis和Zookeeper分布式锁的区别

单机下:

  • redis 分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。
  • zk 分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。

如果是 Redis 获取锁的那个客户端出现 bug 挂了,那么只能等待超时时间之后才能释放锁;而 zk 的话,因为创建的是临时 znode,只要客户端挂了,znode 就没了,此时就自动释放锁。

集群下:

  • redis 集群保证了 AP:先通知线程加锁成功,再将数据复制给从节点。
  • zk 集群保证了 CP:先将数据复制给从节点,全部复制完毕后再告诉线程加锁成功,虽然安全,但效率低。

# 3 Redission

RedLock的实现,用于实现分布式锁,可以方便解决分布式锁的各类问题。

使用多个 Redis 节点,每个 Redis 节点都是独立的、不同的。想要加锁成功就必须获得超过一半以上的节点。

编辑 (opens new window)
#Redis
上次更新: 2024/04/26, 20:23:02
Redis持久化
Redis事务

← Redis持久化 Redis事务→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式