• 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

  • 相关阅读:
    第二章、Redis入门介绍
    最高的牛
    增减序列
    激光炸弹
    分形之城
    约数之和
    奇怪的汉诺塔
    费解的开关
    递归实现排列型枚举
    递归实现组合型枚举
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/7495837.html
Copyright © 2020-2023  润新知