分布式锁
文章平均质量分 89
在应用开发中,特别是web工程开发,通常都是并发编程,不是多进程就是多线程。这种场景下极易出现线程并发性安全问题,此时不得不使用锁来解决问题。在多线程高并发场景下,为了保证资源的线程安全问题,jdk为我们提供了synchronized关键字和ReentrantLock可重入锁,但是它们只能保证一个工
孟德爱吃香菜
这个世界能轻而易举毫不费劲做到的,只有贫穷和衰老,其他的都需要努力。
展开
-
分布式锁之环境准备
在应用开发中,特别是web工程开发,通常都是并发编程,不是多进程就是多线程。在多线程高并发场景下,为了保证资源的线程安全问题,jdk为我们提供了synchronized关键字和ReentrantLock可重入锁,但是它们只能保证一个工程内的线程安全。在分布式集群、微服务、云原生横行的当下,如何保证不同进程、不同服务、不同机器的线程安全问题,jdk并没有给我们提供既有的解决方案。库存在并发量较大情况下很容易发生超卖现象,一旦发生超卖现象,就会出现多成交了订单而发不了货的情况。 工程构建工具:maven。原创 2023-10-20 17:38:01 · 258 阅读 · 0 评论 -
redisson中的分布式锁二
它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。1606960795秒有3次请求进来:控制台2有1次,控制台3有2次。1606960800秒有3次请求进来:控制台1有2次,控制台2有1次。1606960805秒有1次请求进来:控制台1有1次。基于Redis的Redisson的分布式信号量(原创 2023-11-09 11:51:11 · 310 阅读 · 0 评论 -
redisson中的分布式锁
它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。大家都知道,如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。的参数来指定加锁的时间。原创 2023-11-09 11:48:08 · 285 阅读 · 0 评论 -
lua脚本实现redis分布式锁(脚本解析)
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。设计目的 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua 特性轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。原创 2023-11-08 09:30:18 · 1083 阅读 · 0 评论 -
基于redis实现分布式锁
Redis 也保证脚本会以原子性(atomic)的方式执行: 当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。index1业务逻辑执行完成,开始调用del释放锁,这时释放的是index3的锁,导致index3的业务只执行1s就被别人释放。问题:setnx刚刚获取到锁,当前服务器宕机,导致del释放锁无法执行,进而导致锁无法锁无法释放(死锁)redis采用单线程架构,可以保证单个命令的原子性,但是无法保证一组命令在高并发场景下的原子性。index1业务逻辑没执行完,3秒后锁被自动释放。原创 2023-11-08 09:26:12 · 1220 阅读 · 0 评论 -
分布式锁之数据库锁
性能:一个sql > 悲观锁 > jvm锁 > 乐观锁如果追求极致性能、业务场景简单并且不需要记录数据前后变化的情况下。 优先选择:一个sql如果写并发量较低(多读),争抢不是很激烈的情况下优先选择:乐观锁如果写并发量较高,一般会经常冲突,此时选择乐观锁的话,会导致业务代码不间断的重试。 优先选择:mysql悲观锁不推荐jvm本地锁。原创 2023-10-20 17:46:38 · 331 阅读 · 0 评论