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

原文地址:https://www.cnblogs.com/lgxlsm/p/7495837.html