zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Html页中使用OCX控件
    Delphi 7 升级到 Delphi 2010 总结
    Delphi2010下的FillChar
    机器学习之基于朴素贝叶斯文本分类算法
    JDBC对MySQL数据库存储过程的调用
    HDU1788 Chinese remainder theorem again【中国剩余定理】
    Hadoop分布式文件系统--HDFS结构分析
    【php学习笔记】ticks篇
    怎样退出App之前唤醒还有一个App?
    Java 实现策略(Strategy)模式
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/7495837.html
Copyright © 2011-2022 走看看