首页 > 其他分享 >分布式锁及其实现

分布式锁及其实现

时间:2023-07-09 16:11:56浏览次数:40  
标签:end 抢锁 实现 lock 及其 Redis 服务器 分布式

分布式锁

1. 锁

有限资源的情况下,控制同一时间(段)只有某些线程(用户 / 服务器)能访问到资源。
Java 实现锁:synchronized 关键字、并发包的类
问题:只对单个 JVM 有效

2. 分布式锁

为啥需要分布式锁?

  • 有限资源的情况下,控制同一时间( 段)只有某些线程(用户 / 服务器)能访问到资源。
  • 单个锁只对单个 JVM 有效

3. 分布式锁实现的关键

抢锁机制:
怎么保证同一时间只有1个服务器能抢到锁?
核心思想:
先来的人先把数据改成自己的标识(服务器 ip),后来的人发现标识已存在,就抢锁失败,继续等待。
等先来的人执行方法结束,把标识清空,其他的人继续抢锁。

MySQL 数据库:select for update 行级锁(最简单)(乐观锁)
✔ Redis 实现:内存数据库,读写速度快 。支持 setnx、lua 脚本,比较方便我们实现分布式锁。
setnx:set if not exists 如果不存在,则设置;只有设置成功才会返回 true,否则返回 false。

4. 使用锁的注意事项

  • 用完锁要释放
  • 锁一定要加过期时间
  • 如果方法执行时间过长,锁提前过期了?
    • 连锁效应: 释放掉别人的锁
    • 这样还是会存在多个方法同时执行的情况

解决方案: 续期机制!
``
boolean end = false;

new Thread(() -> {
   if (!end)}{
   续期
})

end = true;


问题:
  - 释放锁的时候,可能出现一种情况,先判断出是自己的锁,但这时锁过期了,最后还是释放了别人的锁
  - Redis如果是集群,并非单机Redis时候,如果出现分布式锁的数据不同怎么办?(多个redis里面的锁不同怎么办?)

// 原子操作
if(get lock == A) {
   // set lock B
   del lock
}

Redis + lua 脚本实现
[https://blog.csdn.net/feiying0canglang/article/details/113258494](https://blog.csdn.net/feiying0canglang/article/details/113258494)

标签:end,抢锁,实现,lock,及其,Redis,服务器,分布式
From: https://www.cnblogs.com/techgy/p/17538863.html

相关文章

  • JS 中单例模式的具体实现细节和实践
    通用的创建单例模式的方法:1创建实例对象的职责和管理单例的职责分别放置于两个方法中。2两个方法可以互相独立而互不影响。3惰性加载单例模式,等到用到的时候才加载。1letcreateSingle=function(fn){2letresult;3returnfunction(){4//app......
  • 业财一体化与数据集成平台:实现数字化转型的关键利器
    业财一体化一直是企业信息化领域的热门话题,而随着ERP技术的升级和发展,数据集成平台如轻易云正逐渐崭露头角。本文探讨了不同的业财一体化架构模式,并重点介绍了轻易云数据集成平台的强大集成优势。该平台通过一站式的服务,包括数据采集、实时传输、数据清洗和API管理等功能,助力企......
  • ds:队列的基本实现
     一.顺序队1.入队判断队满,出队判断队空;2.顺序队定义时,要注意front、rear是下标,不是指针。typedefstruct{intdata[maxsize];intrear,front;//front:队头元素的下标。rear:队尾元素的后一个位置的下标(下一个待插入的位置),}sqListQueue;3,如果判断队......
  • C# httpclient获取cookies实现模拟web登录
    目前在公司做一款平台化的产品,我主要负责PC端上的开发,在产品推荐过程中为了节省开发时间很多功能模块没来得及做原生,用CEF嵌入了很多带功能web页面,与客户端进行交互从而实现功能。在二期开发中,产品需求说明书中需要把登录功能放在客户端来做,这当中涉及到一个问题客户端做登入登出......
  • 基于MFC dll实现C++/CLI dll组件全过程详解(附完整源码) 浮云绘图
    ​模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导出类......
  • Typora 妙用+阿里云+Picgo上传--实现他人可以查看自己的博客
    Typora妙用+阿里云+Picgo上传关水水来源链接:大学生写博客,做笔记请你不要忘了Typora工具|带你从零开始认识和使用Typora_哔哩哔哩_bilibili如果还是不行可以根据此链接来排查自己的错误链接:Typora+PicGo+阿里云OSS实现图片上传_早上好我是DJ同学的博客-CSDN博客当时是无法在T......
  • m基于FPGA的图像Harris角点特征提取和图像配准verilog实现,包含testbench和MATLAB辅助
    1.算法仿真效果Quartusii18.0+ModelSim-Altera6.6d StarterEdition的测试结果如下:       MATLAB2022a测试结果如下:     2.算法涉及理论知识概要      在计算机视觉领域中,图像特征提取和图像配准是两个基本的问题。图像特征提取是指从图......
  • 使用UniApp实现数据绑定与响应式开发
    当涉及到跨平台应用开发时,UniApp是一个非常强大的选择。UniApp是一个基于Vue.js的开发框架,可以让你使用Vue.js的语法和特性来构建同时运行在多个平台(如iOS、Android、Web等)的应用程序。在UniApp中,数据绑定和响应式开发是其核心特性之一。本文将介绍如何使用UniApp实现数据绑定和响......
  • 中转转运运输问题——Python实现
    在供应链中,中转运输是一项关键活动,用于解决商品在运输过程中的各种限制和需求。商业部门承担中转运输的责任,组织商品的再次发运,以确保顺利的货物流动。中转运输在供应链中具有重要作用,主要原因如下:物流条件限制:由于运输条件的限制,商品可能无法直接一次性运送到目的地。这可能涉......
  • 数据查询慢问题以及实现缓存预热
    数据查询慢问题解决办法:使用缓存技术,提前把数据从数据库中取出来,就可以更快的进行读写。1.缓存的实现Redis(分布式缓存)memcached(分布式)Etcd(云原生架构的一个分布式存储,存储配置,扩容能力)ehcache(单机)本地缓存(Java内存Map)Caffeine(Java内存缓存,高性能)GoogleGuavaR......