日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java基于mongodb實現分布式鎖的示例代碼

瀏覽:44日期:2023-02-10 15:59:00
目錄原理 實現 使用 原理

通過線程安全findAndModify 實現鎖

實現

定義鎖存儲對象:

/** * mongodb 分布式鎖 */@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一段時間后再拿鎖

完整代碼,可到github查看 https://github.com/jadepeng/docker-pipeline/blob/main/pipeline-master/src/main/java/com/github/jadepeng/pipeline/service/impl/MongoLockService.java

到此這篇關于java基于mongodb實現分布式鎖的示例代碼的文章就介紹到這了,更多相關java mongodb實現分布式鎖內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美不卡| 亚洲精华国产欧美| 日韩精品一区第一页| 久久黄色影院| 欧洲一级精品| 成人免费电影网址| 特黄特色欧美大片| 亚洲电影在线一区二区三区| 日韩中文在线播放| 成人午夜毛片| 丝袜av一区| 午夜久久美女| 免费观看久久久4p| 日韩黄色av| 国产精品99久久免费观看| 牛牛精品成人免费视频| 国产一区二区三区久久| 久久久久久久久久久9不雅视频| 日韩精品一区二区三区免费观看| 久久免费高清| 亚洲少妇诱惑| 日韩区欧美区| 麻豆成人av在线| av在线最新| 欧美日韩色图| 一区二区国产在线| 国产欧美一区二区色老头| 欧美激情日韩| 久久久久午夜电影| 国产亚洲永久域名| 欧美有码在线| 91亚洲国产成人久久精品| 在线成人动漫av| 一本一道久久a久久| 国产精品调教| 久久久天天操| 日韩一区二区三区精品视频第3页| 国产精品美女久久久久久不卡| 91视频久久| 国产在线成人| 日韩精品导航| 日本午夜大片a在线观看| 影音国产精品| 国产欧美日韩综合一区在线播放| 91亚洲国产| 鲁大师成人一区二区三区| 国产欧美在线| 91九色精品国产一区二区| 日韩不卡在线观看日韩不卡视频 | 久久亚洲风情| 日韩二区三区在线观看| 久久亚洲道色| 免费成人性网站| 久久精品九色| 国产精品美女久久久| 欧美国产三级| 亚洲黄页一区| 精品伊人久久| 只有精品亚洲| 久久夜夜操妹子| 日韩高清成人在线| 在线日韩视频| 久久久精品区| 亚洲综合色婷婷在线观看| 亚洲性色av| 亚洲美女久久| 久久久久91| 国产精品jk白丝蜜臀av小说| 中文亚洲免费| 激情黄产视频在线免费观看| 亚洲精品高潮| 国产一区二区三区自拍| 久久亚洲精品中文字幕| 在线国产日韩| 久久久久久久久99精品大| 国产精品入口久久| 亚洲深爱激情| 群体交乱之放荡娇妻一区二区| 日韩av中文字幕一区二区| 在线国产一区| 精品国产美女a久久9999| 中文字幕亚洲精品乱码| 久久精品亚洲人成影院| 欧美三级第一页| 国产美女精品| 免费观看不卡av| 国产精品毛片久久| 国产另类在线| 视频一区中文字幕精品| 黄色成人91| 久久狠狠婷婷| 国产日韩在线观看视频| 最新亚洲激情| 国产一精品一av一免费爽爽| 久久午夜视频| 中文在线а√在线8| 久久激情五月婷婷| 视频一区欧美日韩| 99成人在线视频| 中文字幕在线看片| 久久精品一区二区国产| 97久久精品| 亚洲一级大片| 美女久久一区| 日韩亚洲在线| 久久久影院免费| 日韩欧美一区二区三区免费看| 少妇精品久久久一区二区三区| 青草综合视频| 伊人成人网在线看| 综合激情视频| 性色一区二区| 欧美午夜不卡影院在线观看完整版免费| 日本а中文在线天堂| 麻豆中文一区二区| 国产探花在线精品一区二区| 亚洲另类黄色| 亚洲免费专区| 青草国产精品久久久久久| 日本不卡一二三区黄网| 亚洲精品免费观看| 日韩在线电影| 视频一区在线播放| 狠狠爱成人网| 国内精品伊人| 国产伦久视频在线观看| 国产成人精品一区二区三区在线| 精品国产三区在线| 美女性感视频久久| 精品入口麻豆88视频| 国产不卡精品| 午夜影院一区| 亚洲手机在线| 久久国产精品久久久久久电车| 欧美专区在线| 久久成人高清| 中文精品在线| 久久精品免费一区二区三区| 欧美www视频在线观看| 欧美日本一区| 国产精品夜夜夜| 亚洲精品福利| 国产精品日本一区二区不卡视频 | 午夜免费一区| 午夜久久99| 亚洲我射av| 欧美日韩调教| 国产精品a级| 精品国产午夜| 久久久久久久久久久妇女| 亚洲精品a级片| 日韩精品中文字幕一区二区| 久久中文字幕一区二区| 91精品精品| 一区二区91| 国产精品毛片视频| 国产欧洲在线| 在线日韩欧美| 日韩国产一区二| 久久精品国产精品亚洲毛片| 偷拍精品精品一区二区三区| 国产亚洲在线观看| 亚洲精品亚洲人成在线观看| 国产精品4hu.www| 成人精品亚洲| 婷婷久久免费视频| 韩国一区二区三区视频| 国产一区亚洲| 911亚洲精品| 久久久久美女| 日本午夜精品久久久| 日韩免费福利视频| 日韩有码av| 日韩深夜视频| 亚洲精品免费观看| 美女福利一区二区三区| 亚洲天堂免费| 麻豆国产精品视频| 一区视频在线| 欧美国产另类| 99在线精品视频在线观看| 国产精品调教视频| 亚洲午夜电影| 国产精品久久久久9999高清| 亚洲一级黄色| 国产欧美自拍| 亚洲欧洲另类| 精品久久中文| 日韩 欧美一区二区三区| 青青青免费在线视频| 亚洲视频国产| 毛片在线网站| 一区二区精品| 亚洲精品在线影院| 国产精品亚洲综合久久| aⅴ色国产欧美| 精品精品国产三级a∨在线| 蜜乳av另类精品一区二区| 97在线精品| 国产欧美一区二区色老头|