Redis分布式锁

要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁、进程锁。

线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。

进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源。

分布式锁:当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。

设计思路

由于Redis是单线程模型,命令操作原子性,所以利用这个特性可以很容易的实现分布式锁。

A用户端在Resdis写入1个KEY,其他的用户无法写入这个KEY,实现锁的效果。

A用户使用完成后释放KEY,或者是KEY过了超时时间,释放KEY。

主要代码

 Boolean isLoading = dataPermissionRedis.TryLoading(a, b);
            if (isLoading)
            {
                try
                {
                  //todo
                }
                finally
                {
                    dataPermissionRedis.removeLoading(a, b);
                }
            }
   public bool TryLoading(string a, string b, int expireTime = 20)
        {
            var key = GetLoadingKey(a, b);
            using (IRedisClient client = this.GetClient())
            {
                var r = client.Add(key, "1", new TimeSpan(0, 0, 0, expireTime));
                //存在
                if (!r)
                {
                    //获取过期时间
                    var totalSeconds = client.GetTimeToLive(key)?.TotalSeconds;
                    //存在且过期时间大于 expireTime(当做永久key) 解决历史遗留key
                    if (totalSeconds.HasValue && totalSeconds.Value > expireTime)
                    {
                        //强制设置过期时间
                        client.ExpireEntryIn(key, new TimeSpan(0, 0, 0, expireTime));
                    }
                }
                return r;
            }
        }
 public void removeLoading(string a, string b)
        {
            using (IRedisClient client = this.GetClient())
            {
                client.Remove(GetLoadingKey(a, b));
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值