最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用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)文章

  • 關(guān)于redisson緩存序列化的幾枚大坑說明

    關(guān)于redisson緩存序列化的幾枚大坑說明

    這篇文章主要介紹了redisson緩存序列化幾枚大坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • mac下redis安裝、設(shè)置、啟動停止方法詳解

    mac下redis安裝、設(shè)置、啟動停止方法詳解

    這篇文章主要介紹了mac下redis安裝、設(shè)置、啟動停止方法詳解,需要的朋友可以參考下
    2020-02-02
  • redis分布式鎖優(yōu)化的實現(xiàn)

    redis分布式鎖優(yōu)化的實現(xiàn)

    本文主要介紹了redis分布式鎖優(yōu)化的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Redis?SortedSet數(shù)據(jù)類型及其常用命令總結(jié)

    Redis?SortedSet數(shù)據(jù)類型及其常用命令總結(jié)

    Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層數(shù)據(jù)結(jié)構(gòu)卻差別很大,這篇文章主要介紹了Redis?SortedSet數(shù)據(jù)類型及其常用命令詳解,需要的朋友可以參考下
    2024-06-06
  • Redis+PHP實現(xiàn)用戶消息推送每天最多通知2次的功能

    Redis+PHP實現(xiàn)用戶消息推送每天最多通知2次的功能

    在開發(fā)應(yīng)用程序中,經(jīng)常需要向用戶推送消息通知,但是為了避免過多的打擾用戶,我們希望限制每天最多通知2次,本篇博文將介紹如何使用PHP和Redis實現(xiàn)這一功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • Redis配合SSDB實現(xiàn)持久化存儲代碼示例

    Redis配合SSDB實現(xiàn)持久化存儲代碼示例

    這篇文章主要介紹了Redis配合SSDB實現(xiàn)持久化存儲代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 解決redis批量刪除key值的問題

    解決redis批量刪除key值的問題

    在開發(fā)過程中,會遇到要批量刪除某種規(guī)則的key值,但是通常情況下沒有批量刪除某一個類的命令,遇到這種情況該如何處理呢?下面小編給大家?guī)砹藃edis批量刪除key值的問題,感興趣的朋友一起看看吧
    2022-03-03
  • Redis大key問題及解讀

    Redis大key問題及解讀

    Redis大key指value過大、元素過多或結(jié)構(gòu)復(fù)雜,易引發(fā)阻塞、網(wǎng)絡(luò)延遲、內(nèi)存不均及持久化問題,需拆分?jǐn)?shù)據(jù)、優(yōu)化結(jié)構(gòu)、設(shè)置過期、漸進(jìn)刪除,并通過監(jiān)控與設(shè)計預(yù)防確保系統(tǒng)穩(wěn)定
    2025-07-07
  • Redis過期數(shù)據(jù)的刪除策略詳解

    Redis過期數(shù)據(jù)的刪除策略詳解

    Redis 是一個kv型數(shù)據(jù)庫,我們所有的數(shù)據(jù)都是存放在內(nèi)存中的,但是內(nèi)存是有大小限制的,不可能無限制的增量,這篇文章主要介紹了Redis過期數(shù)據(jù)的刪除策略,需要的朋友可以參考下
    2023-08-08
  • 基于redis實現(xiàn)token驗證用戶是否登陸

    基于redis實現(xiàn)token驗證用戶是否登陸

    這篇文章主要為大家詳細(xì)介紹了基于redis實現(xiàn)token驗證用戶是否登陸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08

最新評論

安仁县| 香港| 莱芜市| 云林县| 武强县| 永仁县| 汪清县| 宜丰县| 汝城县| 望江县| 文安县| 黄龙县| 香格里拉县| 漳浦县| 张家港市| 环江| 山阴县| 读书| 新巴尔虎左旗| 贵定县| 东兴市| 宁夏| 武汉市| 江永县| 泾川县| 遵义县| 游戏| 清水县| 徐闻县| 公主岭市| 南乐县| 大姚县| 贺州市| 姚安县| 东台市| 霍州市| 海阳市| 德安县| 垫江县| 临沂市| 清镇市|