iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java中怎么利用mongodb实现分布式锁
  • 249
分享到

java中怎么利用mongodb实现分布式锁

2023-06-20 19:06:20 249人浏览 安东尼
摘要

今天就跟大家聊聊有关java中怎么利用mongodb实现分布式锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原理 通过线程安全findAndModify 实现锁实现 定义

今天就跟大家聊聊有关java中怎么利用mongodb实现分布式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

原理

通过线程安全findAndModify 实现锁

实现 

定义锁存储对象:

@Data@NoArgsConstructor@AllArgsConstructor@Document(collection = "distributed-lock-doc")public class LockDocument {    @Id    private String id;    private long expireAt;    private String token;}

定义Lock api

public interface LockService {    String acquire(String key, long expiration);    boolean release(String key, String token);    boolean refresh(String key, String token, long expiration);}

获取锁:

  @Override    public String acquire(String key, long expiration) {        Query query = Query.query(Criteria.where("_id").is(key));        String token = this.generateToken();        Update update = new Update()            .setOnInsert("_id", key)            .setOnInsert("expireAt", System.currentTimeMillis() + expiration)            .setOnInsert("token", token);        FindAndModifyOptions options = new FindAndModifyOptions().upsert(true)                                                                 .returnNew(true);        LockDocument doc = monGoTemplate.findAndModify(query, update, options,                                                       LockDocument.class);        boolean locked = doc.getToken() != null && doc.getToken().equals(token);        // 如果已过期        if (!locked && doc.getExpireAt() < System.currentTimeMillis()) {            DeleteResult deleted = this.mongoTemplate.remove(                Query.query(Criteria.where("_id").is(key)                                    .and("token").is(doc.getToken())                                    .and("expireAt").is(doc.getExpireAt())),                LockDocument.class);            if (deleted.getDeletedCount() >= 1) {                // 成功释放锁, 再次尝试获取锁                return this.acquire(key, expiration);            }        }        log.debug("Tried to acquire lock for key {} with token {} . Locked: {}",                  key, token, locked);        return locked ? token : null;    }

原理:

  • 先尝试upsert锁对象,如果成功且token一致,说明拿到锁

  • 否则加锁失败

  • 如果未拿到锁,但是锁已过期,尝试删除锁

    • 如果删除成功,再次尝试拿锁

    • 如果失败,说明锁可能已经续期了

释放和续期锁:

   @Override   public boolean release(String key, String token) {       Query query = Query.query(Criteria.where("_id").is(key)                                         .and("token").is(token));       DeleteResult deleted = mongoTemplate.remove(query, LockDocument.class);       boolean released = deleted.getDeletedCount() == 1;       if (released) {           log.debug("Remove query successfully affected 1 record for key {} with token {}",                     key, token);       } else if (deleted.getDeletedCount() > 0) {           log.error("Unexpected result from release for key {} with token {}, released {}",                     key, token, deleted);       } else {           log.error("Remove query did not affect any records for key {} with token {}",                     key, token);       }       return released;   }   @Override   public boolean refresh(String key, String token,                          long expiration) {       Query query = Query.query(Criteria.where("_id").is(key)                                         .and("token").is(token));       Update update = Update.update("expireAt",                                     System.currentTimeMillis() + expiration);       UpdateResult updated =           mongoTemplate.updateFirst(query, update, LockDocument.class);       final boolean refreshed = updated.getModifiedCount() == 1;       if (refreshed) {           log.debug("Refresh query successfully affected 1 record for key {} " +                     "with token {}", key, token);       } else if (updated.getModifiedCount() > 0) {           log.error("Unexpected result from refresh for key {} with token {}, " +                     "released {}", key, token, updated);       } else {           log.warn("Refresh query did not affect any records for key {} with token {}. " +                    "This is possible when refresh interval fires for the final time " +                    "after the lock has been released",                    key, token);       }       return refreshed;   }

使用  

private  LockService lockService;private void tryAcquireLockAndSchedule() {        while (!this.stopSchedule) {            // 尝试拿锁            this.token = this.lockService.acquire(SCHEDULER_LOCK, 20000);            if (this.token != null) {    // 拿到锁            } else {                // 等待LOCK_EXPIRATION, 再次尝试                Thread.sleep(LOCK_EXPIRATION);            }        }    }
  • 先尝试拿锁,如果获取到token,说明拿锁成功

  • 否则可以sleep一段时间后再拿锁

看完上述内容,你们对java中怎么利用mongoDB实现分布式锁有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。

--结束END--

本文标题: java中怎么利用mongodb实现分布式锁

本文链接: https://www.lsjlt.com/news/299406.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中怎么利用mongodb实现分布式锁
    今天就跟大家聊聊有关java中怎么利用mongodb实现分布式锁,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原理 通过线程安全findAndModify 实现锁实现 定义...
    99+
    2023-06-20
  • Redis中怎么利用Redlock实现分布式锁
    Redis中怎么利用Redlock实现分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。普通实现说道Redis分布式锁大部分人都会想到:setnx+lua,或者知道se...
    99+
    2023-06-20
  • 怎么在MySQL中利用DB实现分布式锁
    怎么在MySQL中利用DB实现分布式锁?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。表设计首先要明确DB在系统中仍然需要认为是最脆弱的一环,因...
    99+
    2024-04-02
  • PHP中利用Redis实现分布式锁
    随着互联网的快速发展,网站访问量的急剧增加,分布式系统的重要性也逐渐凸显出来。在分布式系统中,不可避免地涉及到并发同步以及数据一致性的问题。而分布式锁,作为一种解决并发同步问题的手段,也逐渐被广泛应用于分布式系统中。在PHP中,可以利用Re...
    99+
    2023-05-15
    PHP redis 分布式锁
  • Spring Boot中怎么利用Redis实现分布式锁
    Spring Boot中怎么利用Redis实现分布式锁,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。分布式锁介绍Spring Boot 实现 Redis 分布式锁在 sprin...
    99+
    2023-06-16
  • Java中怎么使用Redis实现分布式锁
    这篇“Java中怎么使用Redis实现分布式锁”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇...
    99+
    2023-05-25
    java redis
  • 利用Python+Redis实现分布式锁
    利用Python+Redis实现分布式锁 欢迎一起交流技术:一个人可以走的很快,但是一群人却可以走的更远。 常见关系型数据库(Oracle+MySQL+PG+GP)+高可用企业解...
    99+
    2024-04-02
  • java怎么使用redis实现分布式锁
    在Java中使用Redis实现分布式锁可以通过以下步骤:1. 引入Redis相关的依赖,例如Jedis或Lettuce。2. 创建一...
    99+
    2023-10-09
    java redis
  • 怎么在Java中使用redis实现分布式锁
    本篇文章给大家分享的是有关怎么在Java中使用redis实现分布式锁,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。原理剖析上述三种分布式锁都是通过各自为依据对各个请求进行上锁,...
    99+
    2023-06-15
  • Redis中怎么实现分布式锁
    本篇内容介绍了“Redis中怎么实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么需要分布式...
    99+
    2024-04-02
  • mysql中怎么实现分布式锁
    这篇文章主要介绍“mysql中怎么实现分布式锁”,在日常操作中,相信很多人在mysql中怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中怎么实现分布式锁”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-27
  • java基于mongodb实现分布式锁的示例代码
    目录原理 实现 使用  原理 通过线程安全findAndModify 实现锁 实现 定义锁存储对象: @Data @NoArgsConstruc...
    99+
    2024-04-02
  • 怎么用Redis实现分布式锁
    本文小编为大家详细介绍“怎么用Redis实现分布式锁”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Redis实现分布式锁”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。单机...
    99+
    2024-04-02
  • MongoDB中怎么实现分布式集群
    本篇文章给大家分享的是有关 MongoDB中怎么实现分布式集群,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。集群概览mongodb 相关的进程...
    99+
    2024-04-02
  • 怎么实现Java可重入分布式锁
    本篇内容主要讲解“怎么实现Java可重入分布式锁”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么实现Java可重入分布式锁”吧!可重入说到可重入锁,首先我们来看看一段来自 wiki 上可重入的...
    99+
    2023-06-16
  • 怎么在springcloud分布式系统中实现分布式锁
    本篇内容介绍了“怎么在springcloud分布式系统中实现分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介一般来说,对数据进...
    99+
    2023-06-25
  • Java分布式锁如何实现
    这篇“Java分布式锁如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java分布式锁如何实现”文章吧。一、分布式锁介...
    99+
    2023-07-05
  • Redisson中怎么实现Redis分布式锁
    Redisson中怎么实现Redis分布式锁,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Redis几种架构Redis发展到现在,几种常见的部署架构有:单机模式;主从模式;...
    99+
    2023-06-20
  • 分布式锁的原理及Redis怎么实现分布式锁
    这篇文章主要介绍“分布式锁的原理及Redis怎么实现分布式锁”,在日常操作中,相信很多人在分布式锁的原理及Redis怎么实现分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-02-02
    redis
  • Redis分布式锁怎么实现
    这篇文章给大家分享的是有关Redis分布式锁怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分布式锁一般有三种实现方式:1、数据库乐观锁;2、基于Redis的分布式锁;3、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作