分布式锁怎么实现?

发布时间:2026/10/31 1:15:15
分布式锁怎么实现? 分布式锁JVM内锁只能同时锁住同一个JVM内线程;而分布式场景下多服务实例需要跨进程、跨节点互斥就是分布式锁。一、Redis实现方案1SETNXEXPIRE;方案2set命令原子加过期// SET key value NX EX 30 原子命令 Boolean ok redisTemplate.opsForValue().setIfAbsent(lock:order:1001, uuid, 30, TimeUnit.SECONDS); if (ok) { try { // 业务逻辑 } finally { // 释放锁必须校验持有者防止删别人的锁 String script if redis.call(get,KEYS[1]) ARGV[1] then return redis.call(del,KEYS[1]) else return 0 end ; redisTemplate.execute(new DefaultRedisScript(script, Long.class), List.of(lock:order:1001), uuid); } }方案3RedissonRedisson的底层就是Redis具有 自动续期看门狗机制可重入锁公平锁、读写锁、锁超时、lua脚本。RLock lock redissonClient.getLock(lock:order:1001); try { // tryLock(等待时间, 锁持有时间, 时间单位) boolean acquire lock.tryLock(10, 30, TimeUnit.SECONDS); if (acquire) { // 业务代码 } } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); } }如果不指定leaseTimeRedisson默认30s后端线程每10s续期业务没跑完不会自动释放。二、Zookeeper实现分布式锁利用zk临时有序节点 Watcher1.抢锁在/lock/order下创建临时有序节点lock-000000012.判断自己是不是最小节点-拿到锁3.不是最小节点监听前一个节点等待释放通知4.断开连接临时节点自动删除不会死锁优点是天然支持监听不会死锁缺点是zk性能比较弱适合并发不高的场景。InterProcessMutex lock new InterProcessMutex(client, /lock/order); try { if (lock.acquire(10, TimeUnit.SECONDS)) { // 业务 } } finally { lock.release(); }三、数据库实现分布式锁乐观锁/悲观锁悲观锁select ... for update-- 注意必须索引命中否则会表锁InnoDB事务内生效 select * from distribute_lock where lock_key order:1001 for update;局限如下必须事务集群下数据库单点问题长时间不提交事务会连接占用只适合低并发乐观锁版本号机制无阻塞update goods set stock stock -1, version version 1 where id1 and version #{oldVersion};根据update返回行数判断是否抢到锁没有阻塞失败直接充实适合读多写少。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询