Redis分布式鎖(ServiceStack.Redis實現)


1.設計思路

由於Redis是單線程模型,命令操作原子性,所以利用這個特性可以很容易的實現分布式鎖。
A用戶端在Resdis寫入1個KEY,其他的用戶無法寫入這個KEY,實現鎖的效果。
A用戶使用完成后釋放KEY,或者是KEY過了超時時間,釋放KEY。

 

2.redis腳本

//redis-cli登陸命令  -h host -p 端口 -a 密碼
redis-cli -h 127.0.0.1 -p 6379 -a 111111

//Key:lockName Value:lockValue
//NX :只在鍵不存在時,才對鍵進行設置操作。(nil)   # 鍵已經存在,設置失敗
//PX :設置鍵的過期時間為 30000 毫秒 
SET lockName lockValue NX PX 30000

//Lua腳本,邏輯很簡單,獲取key中的值和參數中的值相比較,相等刪除,不相等返回0。
//防止誤刪
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return {KEYS[1],ARGV[1]}
end

//調用lua腳本命令
redis-cli -h 127.0.0.1 -p 6379 -a 111111 --eval del.lua lockName lockValue

 3.測試效果

namespace ResdisLock
{
    class Program
    {
        static int i = 1;
        static void Main(string[] args)
        {
            for (int i = 0; i < 1000; i++)
            {
                ThreadStart threadStart = new ThreadStart(GetLock);
                Thread thread = new Thread(threadStart);
                thread.Start();
            }
            Thread.Sleep(2000);
            Console.ReadLine();
        }

        public static void GetLock()
        {
            try
            {
                using (var Lock = RedisLockExtension.CreateLock("luckLock", TimeSpan.FromMilliseconds(1000), 6))
                {
                    Console.WriteLine(++i);
                }
            }
            catch (RedisLockCreateException ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

源碼地址:https://github.com/lgxlsm/ResdisLock

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM