首页 > 其他分享 >15 分布式锁和分布式session

15 分布式锁和分布式session

时间:2025-01-23 15:27:16浏览次数:3  
标签:加锁 15 lock session 进程 节点 资源 分布式

在java中一个进程里面使用synchronized在new出来对象头信息中加锁,如果是静态方法中在加载的类信息中加锁(我们在锁的原理中讲过)。如果使用lock加锁可以自己指定。这些都是在同一个进程空间中的操作。如果在分布式环境中由于程序不在一个进程空间,就没办法使用这些原子性的元素中加锁,我们需要在不同的进程空间中找原子性的元素。这就是分布式锁

基于数据库的分布式锁

该方式通过数据库的唯一索引来实现(比如数据库的主键索引)。当某个进程想要做唯一资源操作时,插入数据表示获得锁,并获得该资源的使用权,其他进程想要获取该资源的使用权时,发现数据库中已经有记录了,就需要等待。当该进程使用完该资源时,删除插入的数据,其他进程发现数据库中没有记录就插入数据表示占用了资源。该实现方式有以下的问题:
锁没有失效时间,同一进程如果释放锁失败,则会造成死锁,其他进程无法再获取资源
如果在进程插入数据的时候增加版本号(乐观锁的实现方式),如果进程操作完成资源回查发现版本号未被更新过则操作资源成功,如果发现版本号被更新过则该进程操作失败

基于redis的分布式锁

我们一个进程想要获取锁,在进程中生成uuid(保证唯一性即可)放入redis中,其他进程想要获得锁资源先判断本进程的uuid是否和redis中的uudi匹配,不匹配说明不能进行资源的操作。redis使用setnx(set if not exit)命令插入键值对。我们可以给该键值对设置超时时间避免死锁的发生。

基于zookeeper实现分布式锁

zookeeper是一个为分布式应用提供一致性服务的工具。它提供一种树形结构的命名空间。
节点的类型分为永久节点和临时节点。永久节点不会因为会话的结束而消失,临时节点随着会话的结束而结束
我们创建一个锁目录lock.在lock下面创建有序的子节点例如:lock/lock-001 lock/lock-002.
客户端获取/lock目录下的子节点列表并判断自己创建的子节点是否是按照序号的最小子节点,如果是则获得锁。否则监听前一个子节点的变更(zkclient).获得子节点的通知后重复判断该节点是否为最小的子节点,重复以往。
会话超时:如果一个子节点的会话超时了,因为创建的是临时节点,因此对应的临时节点也会被删除,这样避免了死锁的出现。
为什么我们前面只监听前面一个节点呢?如果监听所有的节点,在节点状态变更时,所有节点都会收到通知,并进行获取锁的操作。这样造成资源的浪费。

不管是我们的java锁还是分布式锁,都有一个原子性的元素作为锁的实体做加锁和解锁的操作。我们需要把这个问题想明白,其他的都是逻辑的问题

标签:加锁,15,lock,session,进程,节点,资源,分布式
From: https://blog.csdn.net/yusongcao/article/details/145324334

相关文章

  • Cookies,Session,Storage 封装方法,包含过期时间
    importCookiesfrom'js-cookie'importrouterfrom'@/router'constTokenKey='token'exportfunctiongetToken(){returnCookies.get(TokenKey)??''}exportfunctionsetToken(token:string){returnCoo......
  • leetcode155.最小栈
    leetcode155.最小栈思路用两个栈,一个用来存本身,一个用来存最小值。代码#include<iostream>#include<memory>#include<stack>classMinStack{public:MinStack(){}voidpush(intval){_normal_stack.push(val);if(_min_stack.empty......
  • 逆波兰表达式求值(力扣150)
    这道题也是一道经典的栈应用题。为什么这样说呢?我们可以发现,当我们遍历到运算符号的时候,我们就需要操控这个运算符之前的两个相邻的数。这里相邻数不仅仅指最初数组里相邻的数,在进行了运算之后,得到的结果与后面的数也可以理解为相邻。这样的涉及操作相邻元素描述是不是跟删除字......
  • 1.15
    《构建之法》的第二章主要讲述了作为软件工程师,在编写代码时应注重的方法和原则。其中,作者着重强调了DRY准则(Don’tRepeatYourself)的重要性,这让我深刻认识到重复代码的危害和避免重复代码的重要性。作者将重复的种类分为强加的重复、无意地重复、无耐的重复和开发者之间的重复,......
  • 【云平台】云平台存储主要路线比较分析:存储虚拟化、分布式存储、网络共享文件存储
    #信创#金融领域#云平台【摘要】随着金融数字化转型的推进和深入,大家在选择云架构时开始考虑的更长远、更谨慎。一方面会从企业级、集团级和行业级整体发展演进的眼光进行整体规划,避免出现云或资源池的孤岛林立:另一方面采用自主可控的信创云架构也成为众多金融企业的重要抉择......
  • clickhouse本地表和分布式表说明(3分片单副本)
    环境:clickhouse:24.8.11.5 1.创建本地表和分布式表在一个节点上执行即可,我这里配置的分片使用了defaultclickhouse-client--host192.168.1.102--port=9000usedb_testCREATETABLEtb_test_localONCLUSTERdefault(idInt32,nameString,timestamp......
  • nRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模
    nRF21540是一款射频前端模块(FEM),可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备,nRF21540是一种“即插即用型”的无线传输范围扩展器,可与nRF52和nRF53系列的高级多协议无线SoC搭配使用,所需的外部器件数量非常少。    nRF21540的+13dBRX增益和低噪声系......
  • P11592 [NordicOI 2024] Chair Game
    先直接从IMO2005预选赛C7开始看。问题:给定一个长度为\(n\)的序列\(a\),保证\(n\mid(\suma_i)\)。证明存在两个排列\(\sigma\)与\(\tau\),使得\(\sigma_i+\tau_i\equiva_i\pmodn\)。解:若存在一个序列\(a\)和其的一组解\((\sigma,\tau)\),同时存在一个序列\(b......
  • Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250115
    逐笔成交逐笔委托下载链接:https://pan.baidu.com/s/1uRCmUTFoUZShauQ0gJYFiw?pwd=f837提取码:f837--------------------Level2逐笔成交逐笔委托数据分享下载 采用Level2逐笔成交与逐笔委托的详细记录,这种毫秒级别的数据能揭露众多关键信息,如庄家意图、虚假交易,使所......
  • uart串口的低速通信基础知识及模块代码(来自正点原子P15)
    正点原子P15在PL端的uart电路参考,PS端uart和PL端一致,这里不做重复,uart电路由电脑端进行供电,即uart和主芯片之间除利用uart_tx和uart_rx通信外是独立的。从上图中可以看到,FPGA芯片的PL_UART1_TX连接到CH340的RXD管脚,FPGA芯片的PL_UART1_RX连接到CH340的TXD管脚,CH340的PL_CH......