以往在項目中涉及到分布式鎖時,都是結(jié)合redisTemplate采用類原生的方式編寫,代碼量不少,還容易出現(xiàn)鎖死的情況,近來無意間在看到某篇文章中發(fā)現(xiàn)了redisson,如獲珍寶,工具譜中又多了一個利器(公眾號回復關(guān)鍵字“工具”)。
分布式鎖的關(guān)鍵點在于加鎖與解鎖其間能不能保持連續(xù)性,redisson為我們提供了一種比較優(yōu)雅簡單的方式:
RLock lock = redisson.getLock("anyLock");
// 最常見的使用方法
lock.lock();
// 加鎖以后10秒鐘自動解鎖,無需調(diào)用unlock方法手動解鎖
lock.lock(10, TimeUnit.SECONDS);
// 嘗試加鎖,最多等待100秒,上鎖以后10秒自動解鎖
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
? try {
? ? ...
? } finally {
? ? ? lock.unlock();
? }
}
//同時還為分布式鎖提供了異步執(zhí)行的相關(guān)方法
lock.lockAsync();
lock.lockAsync(10, TimeUnit.SECONDS);
Future<Boolean> res = lock.tryLockAsync(100, 10, TimeUnit.SECONDS)
在分布式鎖的基礎(chǔ)上還提供了聯(lián)鎖(MultiLock),讀寫鎖(ReadWriteLock),公平鎖(FairLock),紅鎖(RedLock),信號量(Semaphore),可過期性信號量(PermitExpirableSemaphore)和閉鎖(CountDownLatch)這些實際當中對多線程高并發(fā)應用至關(guān)重要的基本部件。正是通過實現(xiàn)基于Redis的高階應用方案,使Redisson成為構(gòu)建分布式系統(tǒng)的重要工具。
Redisson基于NIO的Netty框架,同其他Redis Java客戶端有著很大的區(qū)別,相比之下其他客戶端提供的功能還僅僅停留在作為數(shù)據(jù)庫驅(qū)動層面上,比如僅針對Redis提供連接方式,發(fā)送命令和處理返回結(jié)果等。
基于Java實用工具包中常用接口,為使用者提供了一系列具有分布式特性的常用工具類。使得原本作為協(xié)調(diào)單機多線程并發(fā)程序的工具包獲得了協(xié)調(diào)分布式多機多線程并發(fā)系統(tǒng)的能力,大大降低了設(shè)計和研發(fā)大規(guī)模分布式系統(tǒng)的難度。同時結(jié)合各富特色的分布式服務,更進一步簡化了分布式環(huán)境中程序相互之間的協(xié)作。而其它redis java客戶端如果要使用一些高層次的應用則只能依靠使用者自行實現(xiàn),不太友好。
Redisson實現(xiàn)分布式鎖僅僅是一個方面的應用,其它還有很多便捷的用法。本篇僅是提供一個引子,更多詳細文檔介紹參考項目介紹的wiki內(nèi)容。
擴展閱讀:
Redis的三個框架:Jedis,Redisson,Lettuce
Jedis 地址:https://github.com/xetorthio/jedis,是Redis的Java實現(xiàn)客戶端,提供了比較全面的Redis命令的支持。SpringBoot1.x系列中默認采用的是jedis。
Redisson 官網(wǎng)地址:https://redisson.org/,實現(xiàn)了分布式和可擴展的Java數(shù)據(jù)結(jié)構(gòu)。
Lettuce 官網(wǎng)地址:https://lettuce.io/,高級Redis客戶端,用于線程安全同步,異步和響應使用,支持集群,Sentinel,管道和編碼器。SpringBoot2.x系列中拋棄了原有的jedis,默認采用lettuce。
相關(guān)文章推薦:
一線人員忙著學習技術(shù),二線人員忙著技術(shù)變現(xiàn)
Nginx+Lua+Redis實現(xiàn)高性能緩存數(shù)據(jù)讀取