帮助中心/最新通知

质量为本、客户为根、勇于拼搏、务实创新

< 返回文章列表

【服务器相关】基于redis实现分布式锁的原理与方法

发表时间:2025-09-24 16:09:00 小编:主机乐-Yutio

前言

系统的不断扩大,分布式锁是最基本的保障。与单机的多线程不一样的是,分布式跨多个机器。线程的共享变量无法跨机器。

为了保证一个在高并发存场景下只能被同一个线程操作,java并发处理提供ReentrantLock或Synchronized进行互斥控制。但是这仅仅对单机环境有效。我们实现分布式锁大概通过三种方式。

  • redis实现分布式锁
  • 数据库实现分布式锁
  • zk实现分布式锁

今天我们介绍通过redis实现分布式锁。实际上这三种和java对比看属于一类。都是属于程序外部锁。

原理剖析

  • 上述三种分布式锁都是通过各自为依据对各个请求进行上锁,解锁从而控制放行还是拒绝。redis锁是基于其提供的setnx命令。
  • setnx当且仅当key不存在。若给定key已经存在,则setnx不做任何动作。setnx是一个原子性操作。
  • 和数据库分布式相比,因为redis内存轻量。所以redis分布式锁性能更好

实现

原理很简单。结合springboot项目我们实现一套通过注解形式对接口进行库存上锁案例进行理解

编写注解

我们编写注解。方便我们在接口上添加注解提供拦截信息

上述提及工具

RedisLock

问题分析

上面分析了一个死锁的场景,理论上出了死锁我们redis分布锁很好的解决了分布式问题。但是还是会出现问题。下面列举写小编遇到的问题。

业务处理时间>上锁过期时间

a线程获取到锁,开始进行业务处理需要8S,

在8S内,锁的有效期是5S,在锁过期后也就是第6S , b线程进入开始获取锁这个时候b是可以获取到新锁的。这个时候就是有问题的。

假设b线程业务处理只需要3S , 但是因为a线程释放了锁,所以在第8S的时候虽然b线程没有释放锁,b的锁也没有过期但是这时候也没有了锁。从而导致C线程也可以进入

总结

到此这篇基于redis实现分布式锁的原理与方法的文章就介绍到这了,更多相关redis分布式锁内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


联系我们
返回顶部