国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于Mongodb分布式鎖簡單實(shí)現(xiàn),解決定時任務(wù)并發(fā)執(zhí)行問題

這篇具有很好參考價值的文章主要介紹了基于Mongodb分布式鎖簡單實(shí)現(xiàn),解決定時任務(wù)并發(fā)執(zhí)行問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

我們?nèi)粘i_發(fā)過程,會有一些定時任務(wù)的代碼來統(tǒng)計(jì)一些系統(tǒng)運(yùn)行數(shù)據(jù),但是我們應(yīng)用有需要部署多個實(shí)例,傳統(tǒng)的通過配置文件來控制定時任務(wù)是否啟動又太過繁瑣,而且還經(jīng)常出錯,導(dǎo)致一些異常數(shù)據(jù)的產(chǎn)生

網(wǎng)上有很多分布式鎖的實(shí)現(xiàn)方案,基于redis、zk、等有很多,但是我的就是一個用了mysql和mongo的小應(yīng)用,不準(zhǔn)備引入其他三方中間件來解決這個問題,擼一個簡單的分布式鎖來解決定時任務(wù)并發(fā)執(zhí)行的問題,加鎖操作的原子性和防死鎖也都要支持,這里我使用mongodb寫了AllInOne的工具類

All in one Code

先上代碼

@Component
@Slf4j
public class MongoDBLock {

    private static final int DEFAULT_LOCK_TIMEOUT = 30;//鎖的默認(rèn)超時時間,單位秒

    private MongoTemplate mongoTemplate;
    private int lockTimeout;

    public MongoDBLock(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
        this.lockTimeout = DEFAULT_LOCK_TIMEOUT;
    }

    /**
     * 嘗試獲取分布式鎖
     *
     * @param lockKey 鎖的key
     * @return true:獲取鎖成功,false:獲取鎖失敗
     */
    private boolean acquireLock(String lockKey) {
        LockDocument document = new LockDocument();
        document.setId(lockKey);
        document.setExpireAt(Instant.ofEpochMilli(Instant.now().toEpochMilli() + lockTimeout * 1000));
        try {
            mongoTemplate.insert(document);
            return true;
        } catch (Exception e) {

        }
        return false;
    }

    /**
     * 釋放分布式鎖
     *
     * @param lockKey 鎖的key
     */
    private void releaseLock(String lockKey) {
        Query query = new Query(Criteria.where("_id").is(lockKey));
        mongoTemplate.remove(query, LockDocument.class);
        log.info("程序執(zhí)行成功,釋放分布式鎖,lockKey:{}",lockKey);
    }

    /**
     * 分布式鎖入口方法,參數(shù)lockName為鎖的名稱,lockKey為需要加鎖的key,執(zhí)行完成后自動釋放鎖
     *
     * @param lockKey
     * @param task
     * @param <T>
     * @throws Exception
     */
    public <T> void executeWithLock(String lockKey, ITask<T> task) throws Exception {
        boolean locked = acquireLock(lockKey);
        if (locked) {
            log.info("獲取分布式鎖成功,lockKey:{}",lockKey);
            try {
                task.execute();
            } finally {
                releaseLock(lockKey);
            }
        } else {
            log.warn("獲取分布式鎖失敗,lockKey:{}", lockKey);
            throw new AppException("獲取分布式鎖失??!");
        }
    }

    @Data
    @Document(collection = "lock_collection")
    static class LockDocument {
        @Id
        private String id;
        @Indexed(expireAfterSeconds = DEFAULT_LOCK_TIMEOUT)
        private Instant expireAt;
    }

    @FunctionalInterface
    public interface ITask<T> {
        T execute() throws Exception;
    }
}

調(diào)用示例文章來源地址http://www.zghlxwxcb.cn/news/detail-417569.html

    @Resource
    MongoDBLock mongoDBLock;

    mongoDBLock.executeWithLock("key", () -> {
        // do some thing
        return null;
    });

原理

  • 使用key作為主鍵,利用mongodb的insert原子性保障LockDocument不會重復(fù)插入
  • LockDocument中expireAt字段利用的mongodb索引過期機(jī)制,解決死鎖問題,這里設(shè)置超時時間是30秒,并在執(zhí)行完成之后會主動釋放鎖

到了這里,關(guān)于基于Mongodb分布式鎖簡單實(shí)現(xiàn),解決定時任務(wù)并發(fā)執(zhí)行問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 分布式鎖解決方案_Zookeeper實(shí)現(xiàn)分布式鎖

    提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 分布式鎖解決方案_Zookeeper實(shí)現(xiàn)分布式鎖 提示:寫完文章后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 提示:這里可以添加本文要記錄的大概內(nèi)容: Zookeeper 是一個開源的分布式協(xié)調(diào)服務(wù),它

    2024年02月03日
    瀏覽(16)
  • 基于zookeeper實(shí)現(xiàn)分布式鎖

    基于zookeeper實(shí)現(xiàn)分布式鎖

    目錄 zookeeper知識點(diǎn)復(fù)習(xí) 相關(guān)概念 java客戶端操作 實(shí)現(xiàn)思路分析? 基本實(shí)現(xiàn) 初始化鏈接 代碼落地? 優(yōu)化:性能優(yōu)化 ?實(shí)現(xiàn)阻塞鎖 監(jiān)聽實(shí)現(xiàn)阻塞鎖 優(yōu)化:可重入鎖 zk分布式鎖小結(jié)? Zookeeper(業(yè)界簡稱zk)是一種提供配置管理、分布式協(xié)同以及命名的中心化服務(wù),這些提供的 功

    2024年02月02日
    瀏覽(16)
  • 基于RocketMQ實(shí)現(xiàn)分布式事務(wù)

    基于RocketMQ實(shí)現(xiàn)分布式事務(wù)

    在一個微服務(wù)架構(gòu)的項(xiàng)目中,一個業(yè)務(wù)操作可能涉及到多個服務(wù),這些服務(wù)往往是獨(dú)立部署,構(gòu)成一個個獨(dú)立的系統(tǒng)。這種分布式的系統(tǒng)架構(gòu)往往面臨著分布式事務(wù)的問題。為了保證系統(tǒng)數(shù)據(jù)的一致性,我們需要確保這些服務(wù)中的操作要么全部成功,要么全部失敗。通過使用

    2024年03月12日
    瀏覽(20)
  • 3、基于Zookeeper實(shí)現(xiàn)分布式鎖

    3、基于Zookeeper實(shí)現(xiàn)分布式鎖

    3.1.1 安裝啟動 如下,說明啟動成功: 3.1.2 相關(guān)概念 Zookeeper提供一個多層級的節(jié)點(diǎn)命名空間(節(jié)點(diǎn)稱為znode),每個節(jié)點(diǎn)都用一個以斜杠(/)分隔的路徑表示,而且每個節(jié)點(diǎn)都有父節(jié)點(diǎn)(根節(jié)點(diǎn)除外),非常類似于文件系統(tǒng)。并且每個節(jié)點(diǎn)都是唯一的。 1、znode節(jié)點(diǎn)有四種類型

    2024年02月15日
    瀏覽(26)
  • 基于 Redis 實(shí)現(xiàn)分布式限流

    分布式限流是指通過將限流策略嵌入到分布式系統(tǒng)中,以控制流量或保護(hù)服務(wù),保證系統(tǒng)在高并發(fā)訪問情況下不被過載。 分布式限流可以防止系統(tǒng)因大量請求同時到達(dá)導(dǎo)致壓力過大而崩潰,從而提高系統(tǒng)的穩(wěn)定性和可靠性。同時,它可以使得業(yè)務(wù)資源能夠更好地分配,提高系

    2024年02月12日
    瀏覽(25)
  • 2、基于redis實(shí)現(xiàn)分布式鎖

    2、基于redis實(shí)現(xiàn)分布式鎖

    借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送setnx命令,只有一個客戶端可以成功,返回1(true);其他的客戶端返回0(false)。 多個客戶端同時獲取鎖(setnx) 獲取成功,執(zhí)行業(yè)務(wù)邏輯,執(zhí)行完成釋放鎖(del) 其他客戶端等

    2024年02月15日
    瀏覽(38)
  • 基于 SpringBoot + Redis 實(shí)現(xiàn)分布式鎖

    基于 SpringBoot + Redis 實(shí)現(xiàn)分布式鎖

    大家好,我是余數(shù),這兩天溫習(xí)了下分布式鎖,然后就順便整理了這篇文章出來。 文末附有源碼鏈接,需要的朋友可以自取。 至于什么是分布式鎖,這里不做贅述,不了解的可以自行去查閱資料。 1. 使用 Redis 的 Setnx(SET if Not Exists) 命令加鎖。 即鎖不存在的時候才能加鎖成功

    2024年02月05日
    瀏覽(18)
  • SpringBoot基于Zookeeper實(shí)現(xiàn)分布式鎖

    SpringBoot基于Zookeeper實(shí)現(xiàn)分布式鎖

    研究分布式鎖,基于ZK實(shí)現(xiàn),需要整合到SpringBoot使用 參考自SpringBoot集成Curator實(shí)現(xiàn)Zookeeper基本操作,Zookeeper入門 本篇的代碼筆者有自己運(yùn)行過,需要注意組件的版本號是否兼容,否則會有比較多的坑 采用Docker compose快速搭建ZK容器,很快,幾分鐘就好了,而且是集群方式搭建

    2024年02月12日
    瀏覽(23)
  • 自定義注解,基于redis實(shí)現(xiàn)分布式鎖

    自定義注解,基于redis實(shí)現(xiàn)分布式鎖

    1.1、注解的基礎(chǔ)知識 實(shí)現(xiàn)自定義注解其實(shí)很簡單,格式基本都差不多。也就參數(shù)可能變一變。 @Retention:取值決定了注解在什么時候生效,一般都是取運(yùn)行時,也就是RetentionPolicy.RUNTIME。 @Target:決定了這個注解可以使用在哪些地方,可以取方法,字段,類等。 注解這就定義

    2024年02月08日
    瀏覽(20)
  • 基于docker實(shí)現(xiàn)JMeter分布式壓測

    基于docker實(shí)現(xiàn)JMeter分布式壓測

    在工作中經(jīng)常需要對一些關(guān)鍵接口做高QPS的壓測,JMeter是由Java 語言開發(fā),沒創(chuàng)建一個線程(虛擬用戶),JVM默認(rèn)會為每個線程分配1M的堆棧內(nèi)存空間。受限于單臺試壓機(jī)的配置很難實(shí)現(xiàn)太高的并發(fā)。所以,通過JMeter實(shí)現(xiàn)分布式,可以整合多臺主機(jī)的硬件資源,實(shí)現(xiàn)同時對被測

    2024年02月07日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包