当前位置: 首页 > news >正文

如何用SETNX实现分布式锁

基于Redis单线程特性实现分布式锁,通过SETNX命令确保多个客户端中只有一个能成功获取锁。SETNX(SET if Not eXists)命令在键不存在时设置值,成功返回1,失败返回0。

获取锁成功后需要设置过期时间,防止客户端崩溃导致锁无法释放。释放锁时需先验证持有权,确认无误后通过DEL命令删除。

public class RedisDistributedLock {private final JedisPool jedisPool;public RedisDistributedLock(JedisPool jedisPool) {this.jedisPool = jedisPool;}public boolean tryLock(String lockKey, String requestId, int expireTime) {try (Jedis jedis = jedisPool.getResource()) {String result = jedis.set(lockKey, requestId, "NX", "PX", expireTime);return "OK".equals(result);}}public boolean unlock(String lockKey, String requestId) {try (Jedis jedis = jedisPool.getResource()) {String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));return Long.parseLong(result.toString()) == 1L;}}
}

实现说明

  1. tryLock方法通过set命令的NX/PX参数实现原子性加锁和过期时间设置
  2. unlock方法通过Lua脚本确保释放锁时的原子性校验
  3. SETNX不支持直接设置超时,可通过两种方式实现:
    • 组合命令:SETNX key value + EXPIRE key 10
    • 新版Redis支持:SET key value EX 10 NX

优缺点分析

优点:

  1. 实现简单直观
  2. 性能优异,利用Redis单线程特性保证原子性

缺点:

  1. 不支持锁续期
  2. 未设置超时可能导致死锁
  3. 高并发场景存在竞争
  4. 原生不支持可重入,可通过Redisson实现

对于更完善的分布式锁实现,建议采用Redisson框架。

http://www.dtcms.com/a/582965.html

相关文章:

  • 广州市品牌网站建设平台WordPress文章首页缩进
  • 泰兴网站推广wordpress vaptcha
  • AI与就业:在变革中主动驾驭未来
  • container_of宏
  • 创建网站要钱吗windows系统没有wordpress
  • 网站开发流程三大部分测评网站怎么做
  • iPhone 17 Pro Max 的评测和用户反馈
  • Python 中的异步编程:从基础到实战
  • 怎么制作自己的个人网站网址导航发布页
  • 网站建设售后服务方案百度招聘
  • 做网站编辑好还是美工好番禺区住房和建设局物业网站
  • Unity YooAsset HybridCLR 热更基础教程
  • 【Nginx】怎样清除 Nginx 的缓存?
  • 网站制作公海南省海口市龙华区
  • 【电子元器件·17】三极管的发射极e、基极b、集电极c 和 类型、主回路电流方向 的 快速判断方法
  • 浙江省城乡和住房建设厅网站首页dede做购物网站
  • ps做素材下载网站装潢设计和室内设计的区别
  • 程序员求职突围
  • 江苏营销型网站公司如何做网络推广推广
  • 网站建设与维护的论述题网站建设销售的技巧话语
  • 进程替换(主要接口讲解)
  • 网站开发常用语言总结怎么让别人访问我建的网站
  • 接平面设计私活的网站怎样做旅游城市住宿网站
  • nodejs同时做网站和后台管理怎么申请一个域名
  • 天津营销类网站设计网站建设管理要求
  • 地矿局网站建设方案深圳互联网设计公司
  • ubuntu更改使用期望的内核版本
  • 芋道后端部署后总自己挂?从 Nginx 报错到 OOM Kill 的完整排查与修复(2核2G 服务器实战)
  • 哪个网站可以做照片分享申远空间设计公司
  • 系统开发必须遵守的原则有哪些网站可以做多少优化关键词