首页 > 数据库 >如何用Redis构建分布式锁系统?

如何用Redis构建分布式锁系统?

时间:2023-12-28 14:13:50浏览次数:30  
标签:synchronized Redis 阻塞 误删 构建 公平 分布式

      对常见的加锁场景的归纳,只涉及到了JVM的api锁和redis的分布式锁。其实也可以用zookeeper或者mysql,其他的以后在分享吧,其实最完美的还是老外那套saga状态机 解决分布式事务比较完美,缺点就是难度很大要用到领域驱动的思想,国内普遍用的贫血模型,切换到DDD还是需要些时间研究的,对了也可以用Etcd代替Redis。

A. JVM  synchronized 失效的场景

    1.多例模式 

    fe: (@Scope value="prototype",roxyMode = Scop)

    为啥synchronized 会失效?

    因为synchronized每一次锁的都是同一个对象,但是如果是多例模式,就会变化。

    2.事务模式  添加了@Transactional注解

    锁释放了,但是事务没提交! 你在先查询库存的时候,需要开启新的事务。所以必须用其他的service来封装这个逻辑。

    把synchronized放在controller层

    3.集群模式

B.Redis实现分布式锁

  互斥性、可重入、锁超时,放死锁、锁释放正确,防误删 、阻塞和非阻塞  、公平和非公平

  高并发 写和读

  原子操作

  支持分布式部署,节点数据复制和同步

  简单版本的分布式锁的缺点:

  1.没有实现可重入, 

  2解决锁超时, 

  3.超时问题, 死锁 (过期时间)

  4.锁释放正确,防误删 (增加uuid防止误删)

  5.非阻塞(阻塞几秒)

  6.公平和非公平    

  setnx的指令? 为啥要用luna代替setnx脚本

  1.先get,再判断,后set。 缺点:并发冲突。

  解决方式:luna脚本

  2.解决uuid值被替换

  3.读写锁。公平,实现原子性。

 

 

 

标签:synchronized,Redis,阻塞,误删,构建,公平,分布式
From: https://www.cnblogs.com/andrewlovemeimei/p/17932564.html

相关文章

  • TI 专访 Merlin Protocol:构建在比特币网络上的资产适配协议
    近期BTC生态上铭文的热度和流量为市场带起了一波小的高潮。越来越多的用户开始关注BRC-20赛道。但作为铭文,BRC-20稀缺的应用场景和价值也一直为人们所诟病。MerlinProtocol,一个构建在比特币网络上的资产适配协议,提出了自己独特的解决方案。今天,我们邀请到了MerlinProtocol......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、广播变量BroadcastVariables示例1、介绍2、广播变量示例3、验证三、BroadcastState与BroadcastVariable区别本文简单的介绍了flink中关于广播变量的简单使用示例。一、maven依赖为避免篇幅过长,所有基础依赖均在第一篇文章中列出,具......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、Flinksink介绍三、sink到文件、console示例1、console输出2、sink到文件1)、sinktxt文件到hdfs上2)、sinkcsv文件到本地3)、sinktext文件到hdfs上(writeUsingOutputFormat)四、sink到socket示例(writeToSocket)五、Jdbc/mysql示例1、maven依......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、分布式缓存(DistributedCache)示例1、介绍2、maven依赖3、实现4、验证1)、验证步骤2)、验证本文介绍了flink关于分布式缓存的使用示例,比较简单。本文除了maven依赖外,没有其他依赖。本示例需要hadoop环境可用。一、maven依赖为避免篇幅过长,所......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、sink到ClickHouse示例1、介绍2、maven依赖3、创建clickhouse表4、验证clickhouseweb页面是否正常5、实现1)、userbean2)、sink实现6、验证1)、nc输入2)、启动应用程序3)、观察应用程序控制台输出4)、查看clickhouse表中的数据本文介绍了nc作......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、环境或版本说明三、flinksink到kafka示例1、介绍2、1.13.6版本示例1)、maven依赖2)、实现3)、验证步骤3、1.17.0版本示例1)、maven依赖2)、实现3)、验证步骤本文介绍了flink将数据sink到kafka的示例,并提供了flink的1.13.6和1.17两个版本sink到......
  • 【SpringBoot快速入门】(1)SpringBoot的开发步骤、工程构建方法以及工程的快速启动详
    目录SpringBoot简介1SpringBoot快速入门1.1开发步骤1.1.1创建新模块1.1.2创建Controller1.1.3启动服务器1.1.4进行测试2对比3官网构建工程3.1进入SpringBoot官网3.2选择依赖3.3生成工程4SpringBoot工程快速启动4.1问题导入4.2打包4.3启动之前我们已经学习的Sprin......
  • Redis过期删除策略
    定时删除;惰性删除;定期删除;定时删除策略是怎么样的?定时删除策略的做法是,在设置key的过期时间时,同时创建一个定时事件,当时间到达时,由事件处理器自动执行key的删除操作。定时删除策略的优点:可以保证过期key会被尽快删除,也就是内存可以被尽快地释放。因此,定时删除对内存......
  • Redis事务
    其实redis的事务是个假事务,没有实现原子性,若要php支持事务,必须一起执行,其中incr会报错$status=$redis->multi()->lPush($key1,'1123')->lPush($key2,'2123')->incr("age","age")->exec();try{$redis=newRedis();$redis->c......
  • Redis进阶 使用Lua编写Redis脚本
    前面学习了Lua的基本语法,接下来是使用Lua编写脚本1.可以使用redis.call来调用redis命令使用redis.call会将redis命令返回的类型转换成对应的Lua数据类型。关系如下 与redis.call想类似的就是redis.pcall。【redis.call与redis.pcall的区别】当命令出错的时候,redis.pcall......