国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:3日期: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
相關文章:
主站蜘蛛池模板: 亚洲黄色在线播放 | 国产在线欧美日韩精品一区二区 | 成人国产视频在线观看 | 成人毛片免费视频播放 | 日韩一区二区精品久久高清 | 国产精品99r8免费视频2022 | 黄网站色视频免费观看w | 激情欧美一区二区三区 | 亚洲国产综合久久精品 | 中文字幕精品一区二区绿巨人 | 黄色免费在线观看视频 | 一区二区不卡久久精品 | 精品国产一区二区三区免费 | 亚洲精品久久久久网站 | 精品一区二区三区免费站 | 国产成人综合91精品 | 99精品免费视频 | 国产精品自拍合集 | 99re6热视频精品免费观看 | 久久福利青草精品资源站 | 思思91精品国产综合在线 | 日日碰日日操 | 亚洲加勒比久久88色综合一区 | 91亚洲精品在看在线观看高清 | 亚洲国产高清视频 | 高颜值美女啪啪 | 99久久精品免费看国产 | 亚洲欧美在线一区二区 | 国产aⅴ一区二区三区 | 色偷偷888欧美精品久久久 | 久久99久久精品国产99热 | 国产成人影院一区二区 | 久久综合给合久久狠狠狠97色69 | 呦女精品视频 | 一级特黄一欧美俄罗斯毛片 | 精品一久久 | 欧美精品成人一区二区视频一 | 欧美精品在线免费观看 | 有码在线| 日本特爽特黄特刺激大片 | 最刺激黄a大片免费观看下截 |