成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何使用 Redis 實現分布式鎖

開發
在多線程的環境下,為了保證一個代碼塊在同一時間只能由一個線程訪問?,F在公司都是流行分布式架構,在分布式環境下,如何保證不同節點的線程同步執行呢?

在多線程的環境下,為了保證一個代碼塊在同一時間只能由一個線程訪問?,F在公司都是流行分布式架構,在分布式環境下,如何保證不同節點的線程同步執行呢?

實際上,對于分布式場景,我們可以使用分布式鎖,它是控制分布式系統之間互斥訪問共享資源的一種方式。對于每個鎖,最好有一個唯一id,保證不會錯誤解鎖。(例如 :A鎖與B鎖的key相同,在A鎖過期的一瞬間,B鎖進行解鎖,若不校驗鎖id,會導致A鎖被解鎖);Redis提供了SETNX(set if not exists),僅在key不存在時插入value;Redis在2.6.12版本提供了SET函數的重載,支持僅在key不存在時插入帶有過期時間的value;雖然Redis沒有提供僅在value相同時刪除的命令,但是在2.6.0版本提供了EXAL用于執行腳本,通過該腳本可以;僅在value相同時刪除這一功能。

下面介紹實現分布式鎖。

引入依賴

using ServiceStack.Redis;

鎖實現過程

   private static readonly string ScriptSetIfAbsent = "return redis.call('SET',KEYS[1],ARGV[1],'EX',ARGV[2],'NX')";

        private static readonly string ScriptDeleteIfEqualValue = @"if redis.call('GET',KEYS[1]) == ARGV[1] then
        return redis.call('DEL',KEYS[1])
        else
        return 'FALSE'
        end";
  /// <summary>
        /// 加鎖
        /// </summary>
        /// <param name="key">鎖key</param>
        /// <param name="lockToken">鎖令牌,用于釋放鎖</param>
        /// <param name="lockExpirySeconds">鎖自動超時時間(秒)</param>
        /// <param name="waitLockSeconds">等待鎖時間(秒)</param>
        /// <returns>加鎖成功</returns>
        public bool Lock(string key, out string lockToken, int lockExpirySeconds = 10, double waitLockSeconds = 0)
        {
            int waitIntervalMs = 1000;
            string lockKey = GetLockKey(key);
            DateTime begin = DateTime.Now;
            string uuid = Guid.NewGuid().ToString();

            //循環獲取取鎖
            while (true)
            {
                string result;
                using (var client = GetNativeClient())
                {
                    //返回SET操作結果,為OK時成功
                    result = client.EvalStr(ScriptSetIfAbsent, 1,
                        System.Text.Encoding.UTF8.GetBytes(lockKey),
                        System.Text.Encoding.UTF8.GetBytes(uuid),
                        System.Text.Encoding.UTF8.GetBytes(lockExpirySeconds.ToString()));
                }

                if (result == "OK")
                {
                    lockToken = uuid;
                    return true;
                }

                //超過等待時間,則不再等待
                if ((DateTime.Now - begin).TotalSeconds >= waitLockSeconds) break;
                Thread.Sleep(waitIntervalMs);
            }
            lockToken = null;
            return false;
        }
   /// <summary>
        /// 釋放鎖,執行完代碼以后調用
        /// </summary>
        /// <param name="key">鎖Key</param>
        /// <param name="lockToken">鎖令牌</param>
        /// <returns>釋放鎖成功</returns>
        public bool DelLock(string key, string lockToken)
        {
            if (string.IsNullOrWhiteSpace(lockToken))
            {
                throw new Exception("參數lockToken不能為空");
            }

            string lockKey = GetLockKey(key);
            using (var client = GetNativeClient())
            {
                //返回刪除的行數,為1時成功
                string result = client.EvalStr(ScriptDeleteIfEqualValue, 1,
                    System.Text.Encoding.UTF8.GetBytes(lockKey),
                    System.Text.Encoding.UTF8.GetBytes(lockToken));
                return result == "1";
            }
        }

鎖使用過程

   if (RedisManager.Lock(key, out tokenLock))
            {
                try
                {
                    IRedisClient rdsclient = null;
                    try
                    {
                     
                    }
                    finally
                    {
                        rdsclient?.Dispose();
                    }
                }
                finally
                {
                    RedisManager.DelLock(key, tokenLock);
                }
            }
責任編輯:趙寧寧 來源: conan
相關推薦

2024-04-01 05:10:00

Redis數據庫分布式鎖

2023-08-21 19:10:34

Redis分布式

2024-01-02 13:15:00

分布式鎖RedissonRedis

2022-01-06 10:58:07

Redis數據分布式鎖

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2019-06-19 15:40:06

分布式鎖RedisJava

2022-08-11 18:27:50

面試Redis分布式鎖

2021-11-01 12:25:56

Redis分布式

2020-07-30 09:35:09

Redis分布式鎖數據庫

2020-07-15 16:50:57

Spring BootRedisJava

2023-03-01 08:07:51

2023-01-13 07:39:07

2025-03-31 09:59:11

2019-12-25 14:35:33

分布式架構系統

2023-10-11 09:37:54

Redis分布式系統

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2024-11-28 15:11:28

2024-02-20 09:50:02

Redis分布式

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2022-09-19 08:17:09

Redis分布式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线国产小视频 | www.47久久青青| a在线观看 | 国产精品成人一区 | 一区二区三区欧美在线 | 精品国产一区二区三区久久久四川 | 国产成人av一区二区三区 | 国产一级片在线观看视频 | 丁香五月网久久综合 | 不卡一区 | 日韩在线精品强乱中文字幕 | av国产精品 | 亚洲毛片在线观看 | 亚洲综合色网站 | 91视频在线观看 | 中文字幕av在线播放 | 亚洲www.| 激情欧美一区二区三区中文字幕 | 成人亚洲一区 | 成人在线不卡 | 欧洲妇女成人淫片aaa视频 | 欧美综合一区 | 欧美一级高清片 | 中文字幕亚洲一区二区三区 | www.婷婷 | 日韩成人免费视频 | av黄色在线播放 | 精品乱子伦一区二区三区 | 日日天天 | 99re在线播放| 中文字幕韩在线第一页 | 精品国产高清一区二区三区 | 欧美视频网 | 国产网站在线免费观看 | 一级在线 | www.五月天婷婷 | 国产成人精品综合 | 欧美精品久久 | 黄色一级免费观看 | 中文字幕日韩欧美一区二区三区 | 国产日韩欧美在线播放 |