Java essay Java essay
首页
  • Java基础
  • Java进阶
  • 设计模式
  • 多线程
  • Java你不知道的小事
  • Spring初识
  • Spring进阶
  • SpringBoot基础
  • SpringBoot进阶
  • 什么是微服务
  • SpringCloud全家桶
  • Dubbo
  • SpringCloud Alibaba
  • Vue
  • 小程序
  • 博客搭建
  • 数据库
  • python
  • 大数据
  • 性能分析优化
  • 中间件
  • 云原生
  • 面试
  • 外卖霸王餐
  • 打工人的带饭生活
  • 30岁我该怎么办
友链
关于我
GitHub (opens new window)

Mr.Fire

全栈工程师
首页
  • Java基础
  • Java进阶
  • 设计模式
  • 多线程
  • Java你不知道的小事
  • Spring初识
  • Spring进阶
  • SpringBoot基础
  • SpringBoot进阶
  • 什么是微服务
  • SpringCloud全家桶
  • Dubbo
  • SpringCloud Alibaba
  • Vue
  • 小程序
  • 博客搭建
  • 数据库
  • python
  • 大数据
  • 性能分析优化
  • 中间件
  • 云原生
  • 面试
  • 外卖霸王餐
  • 打工人的带饭生活
  • 30岁我该怎么办
友链
关于我
GitHub (opens new window)
  • 微服务概述

  • SpringCloud全家桶

  • SpringCloudAlibaba

  • 分布式锁

    • 分布式锁的几种实现方式
      • 分布式锁特性
      • 实现方案
        • 数据库
        • Redis
        • Zookeeper
        • Redisson
  • 分布式微服务
  • 分布式锁
Mr.Fire
2023-03-05
目录

分布式锁的几种实现方式

# 分布式锁特性

  • 互斥(线程独享):即同一时刻只有一个线程能够获取锁
  • 避免死锁:获得锁的线程崩溃后,不会影响后续线程获取锁,操作共享资源
  • 隔离性:A获取的锁,不能让B去解锁(解铃还须系铃人)
  • 原子性:加锁和解锁必须保证为原子操作

# 实现方案

# 数据库

通过唯一索引的方式实现,创建not null union的索引,数据库中有相同记录会报错,没有则成功,插入成功获取锁,删除释放锁

# Redis

setnx + set expire +lua 或者 hsetnx + set expire +lua

# Zookeeper

方案一:创建临时顺序节点node_n(编号不可重复),对节点进行排序,是最小号则获取锁成功,通过watch机制监听节点的删除事件

  • 每个线程抢占锁之前,先尝试创建自己的 ZNode。
  • 同样,释放锁的时候需要删除创建的 Znode。创建成功后,如果不是序号最小的节点, 就处于等待通知的状态。
  • 每一个等通知的 Znode 节点,需要监视(watch)序号在自己前面的那个 Znode,以获取其删除事件。
  • 只要上一个节点被删除了,就进行再一次判断,看看自己是不是序号最小的那个节点,如果是,自己就获得锁。就这样不断地通知后一个 ZNode 节点。
  • 获得锁的客户端出现网络异常失联情况下,节点会自动删除,其他节点可获取锁。

方案二:创建相同key的临时节点,创建成功获取到锁,失败则获取不到,通过watch机制监听节点的删除事件

# Redisson

基于redis实现

最后更新时间: 2024/03/15, 17:35:22
Alibaba Nacos配置中心动态感知原理

← Alibaba Nacos配置中心动态感知原理

最近更新
01
SuperBuilder
12-29
02
30岁我该怎么办
12-29
03
关于存钱
12-29
更多文章>
Theme by Vdoing | Copyright © 2021-2025 Mr.Fire | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式