日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Redisson分布式锁

發(fā)布時(shí)間:2023/12/4 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 Redisson分布式锁 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  實(shí)現(xiàn)Redis的分布式鎖,除了自己基于redis client原生api來實(shí)現(xiàn)之外,還可以使用開源框架:Redission,Redisson是一個(gè)企業(yè)級的開源Redis Client,也提供了分布式鎖的支持。

一、Redisson原理分析

 (1)加鎖機(jī)制  

  線程去獲取鎖,獲取成功: 執(zhí)行l(wèi)ua腳本,保存數(shù)據(jù)到redis數(shù)據(jù)庫。

  線程去獲取鎖,獲取失敗: 一直通過while循環(huán)嘗試獲取鎖,獲取成功后,執(zhí)行l(wèi)ua腳本,保存數(shù)據(jù)到redis數(shù)據(jù)庫。

  如果該客戶端面對的是一個(gè)redis cluster集群,他首先會(huì)根據(jù)hash節(jié)點(diǎn)選擇一臺機(jī)器,發(fā)送一段lua腳本到redis上.

  lua腳本

  

  Redisson源碼中,執(zhí)行redis命令的是lua腳本,其中主要用到如下幾個(gè)概念。

redis.call() 是執(zhí)行redis命令.
KEYS[1] 是指腳本中第1個(gè)參數(shù)
ARGV[1] 是指腳本中第一個(gè)參數(shù)的值
返回值中nil與false同一個(gè)意思。

需要注意的是,在redis執(zhí)行l(wèi)ua腳本時(shí),相當(dāng)于一個(gè)redis級別的鎖,不能執(zhí)行其他操作,類似于原子操作,也是redisson實(shí)現(xiàn)的一個(gè)關(guān)鍵點(diǎn)。

另外,如果lua腳本執(zhí)行過程中出現(xiàn)了異常或者redis服務(wù)器直接宕掉了,執(zhí)行redis的根據(jù)日志回復(fù)的命令,會(huì)將腳本中已經(jīng)執(zhí)行的命令在日志中刪除。

(2)鎖互斥機(jī)制

  如果客戶端2來嘗試加鎖,執(zhí)行了同樣的一段lua腳本,會(huì)咋樣呢?很簡單,第一個(gè)if判斷會(huì)執(zhí)行“exists myLock”,發(fā)現(xiàn)myLock這個(gè)鎖key已經(jīng)存在了。接著第二個(gè)if判斷,判斷一下,myLock鎖key的hash數(shù)據(jù)結(jié)構(gòu)中,是否包含客戶端2的ID,但是明顯不是的,因?yàn)槟抢锇氖强蛻舳?的ID。

  所以,客戶端2會(huì)獲取到pttl myLock返回的一個(gè)數(shù)字,這個(gè)數(shù)字代表了myLock這個(gè)鎖key的**剩余生存時(shí)間。**比如還剩15000毫秒的生存時(shí)間。此時(shí)客戶端2會(huì)進(jìn)入一個(gè)while循環(huán),不停的嘗試加鎖。

(3)watch dog自動(dòng)延期機(jī)制

  在一個(gè)分布式環(huán)境下,假如一個(gè)線程獲得鎖后,突然服務(wù)器宕機(jī)了,那么這個(gè)時(shí)候在一定時(shí)間后這個(gè)鎖會(huì)自動(dòng)釋放,你也可以設(shè)置鎖的有效時(shí)間(不設(shè)置默認(rèn)30秒),這樣的目的主要是防止死鎖的發(fā)生。

  只要客戶端1一旦加鎖成功,就會(huì)啟動(dòng)一個(gè)watch dog看門狗,他是一個(gè)后臺線程,會(huì)每隔10秒檢查一下,如果客戶端1還持有鎖key,那么就會(huì)不斷的延長鎖key的生存時(shí)間。

(4)可重入加鎖機(jī)制

Redisson可以實(shí)現(xiàn)可重入加鎖機(jī)制的原因,我覺得跟兩點(diǎn)有關(guān):

1、Redis存儲鎖的數(shù)據(jù)類型是 Hash類型
2、Hash數(shù)據(jù)類型的key值包含了當(dāng)前線程信息。

下面是redis存儲的數(shù)據(jù)

這里表面數(shù)據(jù)類型是Hash類型,Hash類型相當(dāng)于我們java的<key,<key1,value>>類型,這里key是指 'redisson'

它的有效期還有9秒,我們再來看里們的key1值為078e44a3-5f95-4e24-b6aa-80684655a15a:45它的組成是:

guid + 當(dāng)前線程的ID。后面的value是就和可重入加鎖有關(guān)。

(5)鎖釋放機(jī)制  

如果執(zhí)行l(wèi)ock.unlock(),就可以釋放分布式鎖,就是每次都對myLock數(shù)據(jù)結(jié)構(gòu)中的那個(gè)加鎖次數(shù)減1。如果發(fā)現(xiàn)加鎖次數(shù)是0了,說明這個(gè)客戶端已經(jīng)不再持有鎖了,此時(shí)就會(huì)用:“del myLock”命令,從redis里刪除這個(gè)key。然后呢,另外的客戶端2就可以嘗試完成加鎖了。這就是所謂的分布式鎖的開源Redisson框架的實(shí)現(xiàn)機(jī)制。

一般我們在生產(chǎn)系統(tǒng)中,可以用Redisson框架提供的這個(gè)類庫來基于redis進(jìn)行分布式鎖的加鎖與釋放鎖。

  Redis分布式鎖的缺點(diǎn)

  redis cluster,或者是redis master-slave架構(gòu)的主從異步復(fù)制導(dǎo)致的redis分布式鎖的最大缺陷:在redis master實(shí)例宕機(jī)的時(shí)候,可能導(dǎo)致多個(gè)客戶端同時(shí)完成加鎖。導(dǎo)致各種臟數(shù)據(jù)的產(chǎn)生。

二、基于redission的分布式鎖實(shí)現(xiàn)

  在分布式環(huán)境中,很多場景,如:秒殺、ID生成… 都需要分布式鎖。分布式鎖的實(shí)現(xiàn),可以基于redis的setnx,zk的臨時(shí)節(jié)點(diǎn),redission框架  

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.2.3</version>
</dependency>

   工具類RedissionUtils

public class RedissionUtils {
	private static Logger logger = LoggerFactory.getLogger(RedissionUtils.class);
 
	private static RedissionUtils redisUtils;
 
	private RedissionUtils() {
	}
 
	/**
	 * 提供單例模式
	 * 
	 * @return
	 */
	public static RedissionUtils getInstance() {
		if (redisUtils == null)
			synchronized (RedisUtils.class) {
				if (redisUtils == null)
					redisUtils = new RedissionUtils();
			}
		return redisUtils;
	}
 
	/**
	 * 使用config創(chuàng)建Redisson Redisson是用于連接Redis Server的基礎(chǔ)類
	 * 
	 * @param config
	 * @return
	 */
	public RedissonClient getRedisson(Config config) {
		RedissonClient redisson = Redisson.create(config);
		logger.info("成功連接Redis Server");
		return redisson;
	}
 
	/**
	 * 使用ip地址和端口創(chuàng)建Redisson
	 * 
	 * @param ip
	 * @param port
	 * @return
	 */
	public RedissonClient getRedisson(String ip, String port) {
		Config config = new Config();
		config.useSingleServer().setAddress(ip + ":" + port);
		RedissonClient redisson = Redisson.create(config);
		logger.info("成功連接Redis Server" + "	" + "連接" + ip + ":" + port + "服務(wù)器");
		return redisson;
	}
 
	/**
	 * 關(guān)閉Redisson客戶端連接
	 * 
	 * @param redisson
	 */
	public void closeRedisson(RedissonClient redisson) {
		redisson.shutdown();
		logger.info("成功關(guān)閉Redis Client連接");
	}
 
	/**
	 * 獲取字符串對象
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <T> RBucket<T> getRBucket(RedissonClient redisson, String objectName) {
		RBucket<T> bucket = redisson.getBucket(objectName);
		return bucket;
	}
 
	/**
	 * 獲取Map對象
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <K, V> RMap<K, V> getRMap(RedissonClient redisson, String objectName) {
		RMap<K, V> map = redisson.getMap(objectName);
		return map;
	}
 
	/**
	 * 獲取有序集合
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <V> RSortedSet<V> getRSortedSet(RedissonClient redisson,
			String objectName) {
		RSortedSet<V> sortedSet = redisson.getSortedSet(objectName);
		return sortedSet;
	}
 
	/**
	 * 獲取集合
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <V> RSet<V> getRSet(RedissonClient redisson, String objectName) {
		RSet<V> rSet = redisson.getSet(objectName);
		return rSet;
	}
 
	/**
	 * 獲取列表
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <V> RList<V> getRList(RedissonClient redisson, String objectName) {
		RList<V> rList = redisson.getList(objectName);
		return rList;
	}
 
	/**
	 * 獲取隊(duì)列
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <V> RQueue<V> getRQueue(RedissonClient redisson, String objectName) {
		RQueue<V> rQueue = redisson.getQueue(objectName);
		return rQueue;
	}
 
	/**
	 * 獲取雙端隊(duì)列
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <V> RDeque<V> getRDeque(RedissonClient redisson, String objectName) {
		RDeque<V> rDeque = redisson.getDeque(objectName);
		return rDeque;
	}
 
	/**
	 * 此方法不可用在Redisson 1.2 中 在1.2.2版本中 可用
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	/**
	 * public <V> RBlockingQueue<V> getRBlockingQueue(RedissonClient
	 * redisson,String objectName){ RBlockingQueue
	 * rb=redisson.getBlockingQueue(objectName); return rb; }
	 */
 
	/**
	 * 獲取鎖
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public RLock getRLock(RedissonClient redisson, String objectName) {
		RLock rLock = redisson.getLock(objectName);
		return rLock;
	}
 
	/**
	 * 獲取原子數(shù)
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public RAtomicLong getRAtomicLong(RedissonClient redisson, String objectName) {
		RAtomicLong rAtomicLong = redisson.getAtomicLong(objectName);
		return rAtomicLong;
	}
 
	/**
	 * 獲取記數(shù)鎖
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public RCountDownLatch getRCountDownLatch(RedissonClient redisson,
			String objectName) {
		RCountDownLatch rCountDownLatch = redisson
				.getCountDownLatch(objectName);
		return rCountDownLatch;
	}
 
	/**
	 * 獲取消息的Topic
	 * 
	 * @param redisson
	 * @param objectName
	 * @return
	 */
	public <M> RTopic<M> getRTopic(RedissonClient redisson, String objectName) {
		RTopic<M> rTopic = redisson.getTopic(objectName);
		return rTopic;
	}
 
}

redission連接模式

//單機(jī)
RedissonClient redisson = Redisson.create();
Config config = new Config();
config.useSingleServer().setAddress("myredisserver:6379");
RedissonClient redisson = Redisson.create(config);
 
 
//主從
Config config = new Config();
config.useMasterSlaveServers()
    .setMasterAddress("127.0.0.1:6379")
    .addSlaveAddress("127.0.0.1:6389", "127.0.0.1:6332", "127.0.0.1:6419")
    .addSlaveAddress("127.0.0.1:6399");
RedissonClient redisson = Redisson.create(config);
 
 
//哨兵
Config config = new Config();
config.useSentinelServers()
    .setMasterName("mymaster")
    .addSentinelAddress("127.0.0.1:26389", "127.0.0.1:26379")
    .addSentinelAddress("127.0.0.1:26319");
RedissonClient redisson = Redisson.create(config);
 
 
//集群
Config config = new Config();
config.useClusterServers()
    .setScanInterval(2000) // cluster state scan interval in milliseconds
    .addNodeAddress("127.0.0.1:7000", "127.0.0.1:7001")
    .addNodeAddress("127.0.0.1:7002");
RedissonClient redisson = Redisson.create(config);

三、redission的各種分布式鎖

1)可重入鎖:

Redisson的分布式可重入鎖RLock,實(shí)現(xiàn)了java.util.concurrent.locks.Lock接口,以及支持自動(dòng)過期解鎖。同時(shí)還提供了異步(Async)、反射式(Reactive)和RxJava2標(biāo)準(zhǔn)的接口。

// 最常見的使用方法
RLock lock = redisson.getLock("anyLock");
lock.lock();
//...
lock.unlock();
 
//另外Redisson還通過加鎖的方法提供了leaseTime的參數(shù)來指定加鎖的時(shí)間。超過這個(gè)時(shí)間后鎖便自動(dòng)解開了。
 
// 加鎖以后10秒鐘自動(dòng)解鎖
// 無需調(diào)用unlock方法手動(dòng)解鎖
lock.lock(10, TimeUnit.SECONDS);
 
// 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
   try {
     ...
   } finally {
       lock.unlock();
   }
}

大家都知道,如果負(fù)責(zé)儲存這個(gè)分布式鎖的Redisson節(jié)點(diǎn)宕機(jī)以后,而且這個(gè)鎖正好處于鎖住的狀態(tài)時(shí),這個(gè)鎖會(huì)出現(xiàn)鎖死的狀態(tài)。為了避免這種情況的發(fā)生,Redisson內(nèi)部提供了一個(gè)監(jiān)控鎖的看門狗,它的作用是在Redisson實(shí)例被關(guān)閉前,不斷的延長鎖的有效期。默認(rèn)情況下,看門狗的檢查鎖的超時(shí)時(shí)間是30秒鐘,也可以通過修改Config.lockWatchdogTimeout來另行指定。

Redisson同時(shí)還為分布式鎖提供了異步執(zhí)行的相關(guān)方法:

RLock lock = redisson.getLock("anyLock");
lock.lockAsync();
lock.lockAsync(10, TimeUnit.SECONDS);
Future<Boolean> res = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);

RLock對象完全符合Java的Lock規(guī)范。也就是說只有擁有鎖的進(jìn)程才能解鎖,其他進(jìn)程解鎖則會(huì)拋出IllegalMonitorStateException錯(cuò)誤。

2)公平鎖(Fair Lock):

它保證了當(dāng)多個(gè)Redisson客戶端線程同時(shí)請求加鎖時(shí),優(yōu)先分配給先發(fā)出請求的線程。所有請求線程會(huì)在一個(gè)隊(duì)列中排隊(duì),當(dāng)某個(gè)線程出現(xiàn)宕機(jī)時(shí),Redisson會(huì)等待5秒后繼續(xù)下一個(gè)線程,也就是說如果前面有5個(gè)線程都處于等待狀態(tài),那么后面的線程會(huì)等待至少25秒。使用方式同上,獲取的時(shí)候使用如下方法:

RLock fairLock = redisson.getFairLock("anyLock");

3)聯(lián)鎖(MultiLock):

基于Redis的Redisson分布式聯(lián)鎖RedissonMultiLock對象可以將多個(gè)RLock對象關(guān)聯(lián)為一個(gè)聯(lián)鎖,每個(gè)RLock對象實(shí)例可以來自于不同的Redisson實(shí)例。

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
 
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// 同時(shí)加鎖:lock1 lock2 lock3
// 所有的鎖都上鎖成功才算成功。
lock.lock();
...
lock.unlock();
 
//另外Redisson還通過加鎖的方法提供了leaseTime的參數(shù)來指定加鎖的時(shí)間。超過這個(gè)時(shí)間后鎖便自動(dòng)解開了。
 
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// 給lock1,lock2,lock3加鎖,如果沒有手動(dòng)解開的話,10秒鐘后將會(huì)自動(dòng)解開
lock.lock(10, TimeUnit.SECONDS);
 
// 為加鎖等待100秒時(shí)間,并在加鎖成功10秒鐘后自動(dòng)解開
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();

4)紅鎖(RedLock):

基于Redis的Redisson紅鎖RedissonRedLock對象實(shí)現(xiàn)了Redlock介紹的加鎖算法。該對象也可以用來將多個(gè)RLock對象關(guān)聯(lián)為一個(gè)紅鎖,每個(gè)RLock對象實(shí)例可以來自于不同的Redisson實(shí)例。

RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
 
RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
// 同時(shí)加鎖:lock1 lock2 lock3
// 紅鎖在大部分節(jié)點(diǎn)上加鎖成功就算成功。
lock.lock();
...
lock.unlock();
 
//另外Redisson還通過加鎖的方法提供了leaseTime的參數(shù)來指定加鎖的時(shí)間。超過這個(gè)時(shí)間后鎖便自動(dòng)解開了。
 
RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
// 給lock1,lock2,lock3加鎖,如果沒有手動(dòng)解開的話,10秒鐘后將會(huì)自動(dòng)解開
lock.lock(10, TimeUnit.SECONDS);
 
// 為加鎖等待100秒時(shí)間,并在加鎖成功10秒鐘后自動(dòng)解開
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();

5)讀寫鎖(ReadWriteLock):

基于Redis的Redisson分布式可重入讀寫鎖RReadWriteLock Java對象實(shí)現(xiàn)了java.util.concurrent.locks.ReadWriteLock接口。其中讀鎖和寫鎖都繼承了RLock接口。分布式可重入讀寫鎖允許同時(shí)有多個(gè)讀鎖和一個(gè)寫鎖處于加鎖狀態(tài)。

RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// 最常見的使用方法
rwlock.readLock().lock();
// 或
rwlock.writeLock().lock();
 
//另外Redisson還通過加鎖的方法提供了leaseTime的參數(shù)來指定加鎖的時(shí)間。超過這個(gè)時(shí)間后鎖便自動(dòng)解開了。
 
// 10秒鐘以后自動(dòng)解鎖
// 無需調(diào)用unlock方法手動(dòng)解鎖
rwlock.readLock().lock(10, TimeUnit.SECONDS);
// 或
rwlock.writeLock().lock(10, TimeUnit.SECONDS);
 
// 嘗試加鎖,最多等待100秒,上鎖以后10秒自動(dòng)解鎖
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
// 或
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();

6)信號量(Semaphore):

基于Redis的Redisson的分布式信號量(Semaphore)Java對象RSemaphore采用了與java.util.concurrent.Semaphore相似的接口和用法。同時(shí)還提供了異步(Async)、反射式(Reactive)和RxJava2標(biāo)準(zhǔn)的接口。

RSemaphore semaphore = redisson.getSemaphore("semaphore");
semaphore.acquire();
//或
semaphore.acquireAsync();
semaphore.acquire(23);
semaphore.tryAcquire();
//或
semaphore.tryAcquireAsync();
semaphore.tryAcquire(23, TimeUnit.SECONDS);
//或
semaphore.tryAcquireAsync(23, TimeUnit.SECONDS);
semaphore.release(10);
semaphore.release();
//或
semaphore.releaseAsync();

7)可過期性信號量(PermitExpirableSemaphore):

基于Redis的Redisson可過期性信號量(PermitExpirableSemaphore)是在RSemaphore對象的基礎(chǔ)上,為每個(gè)信號增加了一個(gè)過期時(shí)間。每個(gè)信號可以通過獨(dú)立的ID來辨識,釋放時(shí)只能通過提交這個(gè)ID才能釋放。它提供了異步(Async)、反射式(Reactive)和RxJava2標(biāo)準(zhǔn)的接口。

RPermitExpirableSemaphore semaphore = redisson.getPermitExpirableSemaphore("mySemaphore");
String permitId = semaphore.acquire();
// 獲取一個(gè)信號,有效期只有2秒鐘。
String permitId = semaphore.acquire(2, TimeUnit.SECONDS);
// ...
semaphore.release(permitId);

8)門閂:

基于Redisson的Redisson分布式閉鎖(CountDownLatch)Java對象RCountDownLatch采用了與java.util.concurrent.CountDownLatch相似的接口和用法。

RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.trySetCount(1);
latch.await();
 
// 在其他線程或其他JVM里
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.countDown();

9)分布式AtomicLong:

RAtomicLong atomicLong = redisson.getAtomicLong("myAtomicLong");
atomicLong.set(3);
atomicLong.incrementAndGet();
atomicLong.get()

10)分布式BitSet:

RBitSet set = redisson.getBitSet("simpleBitset");
set.set(0, true);
set.set(1812, false);
set.clear(0);
set.addAsync("e");
set.xor("anotherBitset");

11)分布式Object:

RBucket<AnyObject> bucket = redisson.getBucket("anyObject");
bucket.set(new AnyObject(1));
AnyObject obj = bucket.get();
bucket.trySet(new AnyObject(3));
bucket.compareAndSet(new AnyObject(4), new AnyObject(5));
bucket.getAndSet(new AnyObject(6));

12)分布式Set:

RSet<SomeObject> set = redisson.getSet("anySet");
set.add(new SomeObject());
set.remove(new SomeObject());

13)分布式List:

RList<SomeObject> list = redisson.getList("anyList");
list.add(new SomeObject());
list.get(0);
list.remove(new SomeObject());

14)分布式Blocking Queue:

RBlockingQueue<SomeObject> queue = redisson.getBlockingQueue("anyQueue");
queue.offer(new SomeObject());
SomeObject obj = queue.peek();
SomeObject someObj = queue.poll();
SomeObject ob = queue.poll(10, TimeUnit.MINUTES);

15)分布式Map:

RMap<String, SomeObject> map = redisson.getMap("anyMap");
SomeObject prevObject = map.put("123", new SomeObject());
SomeObject currentObject = map.putIfAbsent("323", new SomeObject());
SomeObject obj = map.remove("123");
map.fastPut("321", new SomeObject());
map.fastRemove("321");
Future<SomeObject> putAsyncFuture = map.putAsync("321");
Future<Void> fastPutAsyncFuture = map.fastPutAsync("321");
map.fastPutAsync("321", new SomeObject());
map.fastRemoveAsync("321");

除此之外,還支持Multimap。

16)Map eviction:

現(xiàn)在Redis沒有過期清空Map中的某個(gè)entry的功能,只能是清空Map所有的entry。Redission提供了這種功能。

RMapCache<String, SomeObject> map = redisson.getMapCache("anyMap");
// ttl = 10 minutes, 
map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES);
// ttl = 10 minutes, maxIdleTime = 10 seconds
map.put("key1", new SomeObject(), 10, TimeUnit.MINUTES, 10, TimeUnit.SECONDS);
// ttl = 3 seconds
map.putIfAbsent("key2", new SomeObject(), 3, TimeUnit.SECONDS);
// ttl = 40 seconds, maxIdleTime = 10 seconds
map.putIfAbsent("key2", new SomeObject(), 40, TimeUnit.SECONDS, 10, TimeUnit.SECONDS);

總結(jié)

以上是生活随笔為你收集整理的Redisson分布式锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。