如何使用redis的setnx實(shí)現(xiàn)分布式鎖
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時(shí),為 key 設(shè)置指定的值。
語法
redis Setnx 命令基本語法如下:
redis 127.0.0.1:6379> SETNX KEY_NAME VALUE
可用版本
>= 1.0.0
返回值
設(shè)置成功,返回 1 。 設(shè)置失敗,返回 0 。
實(shí)例
redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 設(shè)置成功 (integer) 1 redis> SETNX job "code-farmer" # 嘗試覆蓋 job ,失敗 (integer) 0 redis> GET job # 沒有被覆蓋 "programmer"
在Redis中,SETNX
是 “Set If Not Exists”(如果不存在,則設(shè)置)的縮寫。這是一個(gè)原子操作,用于設(shè)置一個(gè)鍵的值,前提是這個(gè)鍵不存在。如果鍵已經(jīng)存在,.則不會(huì)執(zhí)行任何操作。
封裝方法trylock
,用于獲取分布式鎖
/** * 嘗試獲 取一個(gè)鎖。 * * @param name 鎖的名稱,通常是一個(gè)資源的標(biāo)識(shí)。 * @param expire 鎖的過期時(shí)間,單位為毫秒。 * @return 如果獲取鎖成功,返回一個(gè)唯一的token;如果失敗,則返回null。 */ public String tryLock(String name, long expire) { // 為鎖名稱添加后綴,以避免命名沖突 name = name + "_lock"; // 生成一個(gè)唯一的token,用于標(biāo)識(shí)持有鎖的客戶端 String token = UUID.randomUUID().toString(); // 獲取Redis連接工廠 RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory(); // 獲取Redis連接 RedisConnection conn = factory.getConnection(); try { // 使用SET命令嘗試以NX選項(xiàng)(只在鍵不存在時(shí)設(shè)置)設(shè)置鍵值對(duì),如果成功,返回true // 這里使用了Expiration指定鍵的過期時(shí)間,以確保鎖在一段時(shí)間后自動(dòng)釋放 // 參考redis命令:SET key value [EX seconds] [PX milliseconds] [NX|XX] Boolean result = conn.set( name.getBytes(), //key token.getBytes(), //value Expiration.from(expire, TimeUnit.MILLISECONDS), RedisStringCommands.SetOption.SET_IF_ABSENT // NX ); // 如果設(shè)置成功,返回生成的token if (result != null && result) return token; } finally { // 釋放Redis連接 RedisConnectionUtils.releaseConnection(conn, factory, false); } // 如果未能成功獲取鎖,返回null return null; }
接下來,你可以在需要防止并發(fā)執(zhí)行的方法中使用tryLock
方法:
public void exampleMethod(String taskName) { String lockKey = "myLockKey"; // 嘗試獲取鎖 String token = tryLock(lockKey, 10000); // 鎖過期時(shí)間為10秒 if (token != null) { try { // 獲取鎖成功,執(zhí)行業(yè)務(wù)邏輯 System.out.println("所獲取成功"); // 模擬任務(wù)執(zhí)行 // ... } finally { // 釋放鎖 stringRedisTemplate.delete(lockKey+ "_lock"); } } else { // 獲取鎖失敗,處理失敗邏輯 System.out.println("獲取鎖失敗"); } }
到此這篇關(guān)于使用redis的setnx實(shí)現(xiàn)分布式鎖的文章就介紹到這了,更多相關(guān)redis setnx分布式鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
巧用Redis實(shí)現(xiàn)分布式鎖詳細(xì)介紹
大家好,本篇文章主要講的是巧用Redis實(shí)現(xiàn)分布式鎖詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法
redis在2.6推出了腳本功能,允許開發(fā)者使用Lua語言編寫腳本傳到redis中執(zhí)行。本文就介紹了redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法,感興趣的可以了解一下2021-11-11CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例(詳解)
這篇文章主要介紹了CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實(shí)例,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Redis高并發(fā)場(chǎng)景下秒殺超賣解決方案(秒殺場(chǎng)景)
早起的12306購票,剛被開發(fā)出來使用的時(shí)候,12306會(huì)經(jīng)常出現(xiàn)超賣 這種現(xiàn)象,也就是說車票只剩10張了,卻被20個(gè)人買到了,這種現(xiàn)象就是超賣,今天通過本文給大家介紹Redis高并發(fā)場(chǎng)景下秒殺超賣解決方案,感興趣的朋友一起看看吧2022-04-04Redis實(shí)現(xiàn)延遲任務(wù)的常見方案詳解
延遲任務(wù)(Delayed?Task)是指在未來的某個(gè)時(shí)間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了Redis實(shí)現(xiàn)延遲任務(wù)的幾個(gè)常見方案,希望對(duì)大家有所幫助2024-04-04redis實(shí)現(xiàn)動(dòng)態(tài)字符串SDS
簡(jiǎn)單動(dòng)態(tài)字符串是Redis的基本數(shù)據(jù)結(jié)構(gòu)之一,用于存儲(chǔ)字符串和整型數(shù)據(jù),本文主要介紹了redis實(shí)現(xiàn)動(dòng)態(tài)字符串SDS,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04Redisson實(shí)現(xiàn)分布式鎖、鎖續(xù)約的案例
這篇文章主要介紹了Redisson如何實(shí)現(xiàn)分布式鎖、鎖續(xù)約,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03