欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用redis的setnx實現(xiàn)分布式鎖

 更新時間:2024年06月03日 10:27:33   作者:ppo_wu  
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時,為 key 設(shè)置指定的值,這篇文章主要介紹了使用redis的setnx實現(xiàn)分布式鎖,需要的朋友可以參考下

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在時,為 key 設(shè)置指定的值。

語法

redis Setnx 命令基本語法如下:

redis 127.0.0.1:6379> SETNX KEY_NAME VALUE

可用版本

>= 1.0.0

返回值

設(shè)置成功,返回 1 。 設(shè)置失敗,返回 0 。

實例

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è)置)的縮寫。這是一個原子操作,用于設(shè)置一個鍵的值,前提是這個鍵不存在。如果鍵已經(jīng)存在,.則不會執(zhí)行任何操作。

封裝方法trylock,用于獲取分布式鎖

/**
     * 嘗試獲  取一個鎖。
     *
     * @param name   鎖的名稱,通常是一個資源的標(biāo)識。
     * @param expire 鎖的過期時間,單位為毫秒。
     * @return 如果獲取鎖成功,返回一個唯一的token;如果失敗,則返回null。
     */
    public String tryLock(String name, long expire) {
        // 為鎖名稱添加后綴,以避免命名沖突
        name = name + "_lock";
        // 生成一個唯一的token,用于標(biāo)識持有鎖的客戶端
        String token = UUID.randomUUID().toString();
        // 獲取Redis連接工廠
        RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
        // 獲取Redis連接
        RedisConnection conn = factory.getConnection();
        try {
            // 使用SET命令嘗試以NX選項(只在鍵不存在時設(shè)置)設(shè)置鍵值對,如果成功,返回true
            // 這里使用了Expiration指定鍵的過期時間,以確保鎖在一段時間后自動釋放
            // 參考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); // 鎖過期時間為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實現(xiàn)分布式鎖的文章就介紹到這了,更多相關(guān)redis setnx分布式鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 巧用Redis實現(xiàn)分布式鎖詳細(xì)介紹

    巧用Redis實現(xiàn)分布式鎖詳細(xì)介紹

    大家好,本篇文章主要講的是巧用Redis實現(xiàn)分布式鎖詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法

    redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法

    redis在2.6推出了腳本功能,允許開發(fā)者使用Lua語言編寫腳本傳到redis中執(zhí)行。本文就介紹了redis執(zhí)行l(wèi)ua腳本的實現(xiàn)方法,感興趣的可以了解一下
    2021-11-11
  • CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實例(詳解)

    CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實例(詳解)

    這篇文章主要介紹了CentOS7.5使用mysql_multi方式安裝MySQL5.7.28多實例,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Redis 內(nèi)存淘汰策略深度解析(最新推薦)

    Redis 內(nèi)存淘汰策略深度解析(最新推薦)

    本文詳細(xì)探討了Redis的內(nèi)存淘汰策略、實現(xiàn)原理、適用場景及最佳實踐,介紹了八種內(nèi)存淘汰策略,包括noeviction、LRU、LFU、TTL、Random等,并分析了它們的應(yīng)用場景,同時,文章還介紹了Redis內(nèi)存淘汰的底層實現(xiàn),包括LRU/LFU的近似算法和淘汰流程,感興趣的朋友一起看看吧
    2025-03-03
  • Redis高并發(fā)場景下秒殺超賣解決方案(秒殺場景)

    Redis高并發(fā)場景下秒殺超賣解決方案(秒殺場景)

    早起的12306購票,剛被開發(fā)出來使用的時候,12306會經(jīng)常出現(xiàn)超賣 這種現(xiàn)象,也就是說車票只剩10張了,卻被20個人買到了,這種現(xiàn)象就是超賣,今天通過本文給大家介紹Redis高并發(fā)場景下秒殺超賣解決方案,感興趣的朋友一起看看吧
    2022-04-04
  • Redis實現(xiàn)延遲任務(wù)的常見方案詳解

    Redis實現(xiàn)延遲任務(wù)的常見方案詳解

    延遲任務(wù)(Delayed?Task)是指在未來的某個時間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了Redis實現(xiàn)延遲任務(wù)的幾個常見方案,希望對大家有所幫助
    2024-04-04
  • 淺談為什么單線程的redis那么快

    淺談為什么單線程的redis那么快

    本文主要介紹了為什么單線程的redis那么快,主要介紹了幾點(diǎn)原因,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • redis實現(xiàn)動態(tài)字符串SDS

    redis實現(xiàn)動態(tài)字符串SDS

    簡單動態(tài)字符串是Redis的基本數(shù)據(jù)結(jié)構(gòu)之一,用于存儲字符串和整型數(shù)據(jù),本文主要介紹了redis實現(xiàn)動態(tài)字符串SDS,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Redisson實現(xiàn)分布式鎖、鎖續(xù)約的案例

    Redisson實現(xiàn)分布式鎖、鎖續(xù)約的案例

    這篇文章主要介紹了Redisson如何實現(xiàn)分布式鎖、鎖續(xù)約,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • redis?protocol通信協(xié)議及使用詳解

    redis?protocol通信協(xié)議及使用詳解

    這篇文章主要為大家介紹了redis?protocol通信協(xié)議及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評論