.Netcore 使用CSRedis Lock分布式加锁原理

news/2023/12/5 23:37:27

·引用地址:.Netcore 使用CSRedis Lock分布式加锁原理_csredisclientlock_FameLee-的博客-CSDN博客

订阅专栏
1.//使用方法
 
  using (var Lock = RedisHelper.Lock("锁名", "过期时间"))//返回CSRedisClientLock方法
            {
                if (Lock == null)
                {
                    return new Response<bool>().Fail("获取分布式锁失败");
                }
              //业务代码
            }//using结束默认调用CSRedisClientLock的Dispose方法,释放锁
2.//源代码分析
 
    public CSRedisClientLock Lock(string name, int timeoutSeconds, bool autoDelay = true)
        {
            name = $"CSRedisClientLock:{name}";
            var startTime = DateTime.Now;
            while (DateTime.Now.Subtract(startTime).TotalSeconds < timeoutSeconds)//通多过期时间循环去等待加锁
            {
                var value = Guid.NewGuid().ToString();
                if (this.Set(name, value, timeoutSeconds, RedisExistence.Nx) == true)//通过Redis Setnx设置锁也就是redis的 key value
                {
                    double refreshSeconds = (double)timeoutSeconds / 2.0;
                    return new CSRedisClientLock(this, name, value, timeoutSeconds, refreshSeconds, autoDelay);//返回CSRedisClientLock类
                }
                Thread.CurrentThread.Join(3);//加锁失败阻塞当前线程
            }
            return null;
        }
        
    public bool Set(string key, object value, TimeSpan expire, RedisExistence? exists = null)//通过Redis Setnx设置锁成功返回true失败返回false
        {
            object redisValule = this.SerializeRedisValueInternal(value);
            if (expire <= TimeSpan.Zero && exists == null) return ExecuteScalar(key, (c, k) => c.Value.Set(k, redisValule)) == "OK";
            if (expire <= TimeSpan.Zero && exists != null) return ExecuteScalar(key, (c, k) => c.Value.Set(k, redisValule, null, exists)) == "OK";
            if (expire > TimeSpan.Zero && exists == null) return ExecuteScalar(key, (c, k) => c.Value.Set(k, redisValule, expire, null)) == "OK";
            if (expire > TimeSpan.Zero && exists != null) return ExecuteScalar(key, (c, k) => c.Value.Set(k, redisValule, expire, exists)) == "OK";
            return false;
        }
        
    private static RedisStatus.Nullable Set(string key, object value, int? expirationSeconds = null, long? expirationMilliseconds = null, RedisExistence? exists = null)
        {
            var args = new List<object> { key, value };
            if (expirationSeconds != null)
                args.AddRange(new[] { "EX", expirationSeconds.ToString() });
            if (expirationMilliseconds != null)
                args.AddRange(new[] { "PX", expirationMilliseconds.ToString() });
            if (exists != null)
                args.AddRange(new[] { exists.ToString().ToUpperInvariant() });// 通过Setnx设置锁
            return new RedisStatus.Nullable("SET", args.ToArray());
        }
        
public class CSRedisClientLock : IDisposable
    {
 
        CSRedisClient _client;
        string _name;
        string _value;
        int _timeoutSeconds;
        Timer _autoDelayTimer;
 
        public CSRedisClientLock(CSRedisClient rds, string name, string value, int timeoutSeconds, double refreshSeconds, bool autoDelay)
        {
            _client = rds;
            _name = name;
            _value = value;
            _timeoutSeconds = timeoutSeconds;
            if (autoDelay)
            {
                var refreshMilli = (int)(refreshSeconds * 1000);
                var timeoutMilli = timeoutSeconds * 1000;
                _autoDelayTimer = new Timer(state2 => Refresh(timeoutMilli), null, refreshMilli, refreshMilli);
            }
        }
 
 
        /// <summary>
        /// 释放分布式锁
        /// </summary>
        /// <returns>成功/失败</returns>
        public bool Unlock()
        {
            _autoDelayTimer?.Dispose();
            return _client.Eval(@"local gva = redis.call('GET', KEYS[1])
if gva == ARGV[1] then
  redis.call('DEL', KEYS[1])
  return 1
end
return 0", _name, _value)?.ToString() == "1";
        }
 
        public void Dispose() => this.Unlock();
    }
CSRedis GitHub地址

3.分布式加锁流程
1.通过Redis Setnx加锁并设置过期时间。
2.如果锁不存在就加锁。
3.如果锁存在就通过join阻塞线程,循环等待加锁直至过期时间结束。
4.加锁成功后执行业务并释放锁。
5.加锁失败返回错误。
————————————————
版权声明:本文为CSDN博主「FameLee-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40138785/article/details/122124460


http://www.ppmy.cn/news/690716.html

相关文章

随想录(招聘怎样的员工)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对很多IT公司来说&#xff0c;招聘都是一件大事。无论是校园招聘、社会招聘&#xff0c;公司都会投入到很大的人力和财力来开展招聘工作。一个公司…

网上教学管理系统的设计与实现

网上教学管理系统的设计与实现 第1章 绪 论 1.1 背景 为了促进计算机专业学生工程实践能力的提升&#xff0c;使老师能够更好的管理学生&#xff0c;帮助学生提高学习成绩掌握更多的专业知识&#xff0c;增强师生之间的交流&#xff1b;解决老师教学资料、发布作业、随堂测…

图说区块链:神一样的金融科技与未来社会

内容简介 区块链&#xff0c;如瑞士仪表般精密&#xff0c;如互联网般惊世骇俗&#xff0c;它在以神一般的节奏颠覆社会。 当新兴技术来临时&#xff0c;你可以选择规避——如果明天也可以规避的话。区块链也一样。 作为一个现象级概念&#xff0c;金融科技创新在过去几年迎…

XXX项目总结

一,项目背景 专门给小孩做一个玩手机的模式或者环境&#xff0c;可以看视频&#xff0c;听音乐&#xff0c;电话防乱接&#xff0c;使用时间管控等 二,功能模块 2.1 家长中心 家长中心主要负责&#xff1a;电话监控/时间监控/护眼模式/密码/网络等相关功能 2.1.1 来电监听…

宇宙尽头是铁岭,互联网尽头是贷款

爱因斯坦说&#xff1a;「一个人对社会的价值首先取决于他的感情、思想和行动&#xff0c;对增进人类利益起多大作用。」 而在这个互联网时代&#xff0c;各大 app 对人的价值很可能也有自己的理解 —— 一个人的价值取决于他的消费能力、购买频次、付费意愿&#xff0c;以及他…

网上外卖订餐运营

网上订餐&#xff0c;现在已经有很多家正在经营。较大的有北京的豆丁、上海的129T、深圳的便利中国(已扩展到北京上海)、武汉的美妙食刻等。 较小的地方性的网上订餐&#xff0c;几乎到处都有。详细可看这个帖子提到 http://www.5gme.com/space-111-do-thread-id-1572.html 我…

华为手环8相册表盘使用指南

随着科技的发展&#xff0c;智能手环已经成为越来越多人的选择。华为手环8作为一款备受好评的智能手环&#xff0c;不仅具备精准的监测功能&#xff0c;还拥有丰富的表盘样式。本文将向您介绍华为手环8如何使用相册表盘&#xff0c;通过这一功能&#xff0c;您可以轻松地将您的…

什么是ROM

只读存储器&#xff08;Read-Only Memory&#xff0c;ROM&#xff09;以非破坏性读出方式工作&#xff0c;只能读出无法写入信息。信息一旦写入后就固定下来&#xff0c;即使切断电源&#xff0c;信息也不会丢失&#xff0c;所以又称为固定存储器。ROM所存数据通常是装入整机前…

【ROM制作工具】如何精简ROM?快速精简ROM详细教程!

准备工作&#xff1a; ROM制作工具 下载地址&#xff1a;http://tfile.7to.cn/romtool/romtools_setup_official.exe 1、选择ROM 选择任意要精简的ROM&#xff0c;有本地ROM和线上ROM可供选择。如果 选择线上ROM&#xff0c; 奇兔ROM市场有非常多的ROM可供选择。 本地ROM精简步…

计算机操作系统发展史

操作系统发展史 在当下这个互联网时代&#xff0c;计算机已经成为了人类的生活必需品&#xff0c;而计算机操作系统的发展历史&#xff0c;也就代表着计算机的发展历史,今天&#xff0c;我就向大家分享一下操作系统的发展史。 无操作系统时代 一定很多人非常的惊讶&#xff…

ROM简介

ORM介绍&#xff1a; 表示对象关系映射。在面向对象的软件开发中&#xff0c;通过ORM&#xff0c;就可以把对象映射到关系型数据库中。只要有一套程序能够做到建立对象与数据库的关联&#xff0c;操作对象就可以直接操作数据库数据&#xff0c;就可以说这套程序实现了ORM对象关…

计算机RAM和ROM

RAM是随机存取存储器&#xff08;random access memory&#xff09;&#xff0c;是计算机内部存储器中的一种&#xff0c;也是其中最重要的&#xff0c;计算机和手机中一般把其叫做&#xff08;运行&#xff09;内存&#xff0c;它的速度要比硬盘快得多&#xff0c;所以用运行程…

RAM、ROM和硬盘

这是我看了一点计算机发展史的个人理解&#xff0c;如果哪里不对的话还望指正。 RAM是随机存取存储器&#xff08;random access memory&#xff09;&#xff0c;是计算机内部存储器中的一种&#xff0c;也是其中最重要的&#xff0c;计算机和手机中一般把其叫做&#xff08;运…

RAM、ROM、Flash

一、ROM ROM&#xff08;Read Only Memory)&#xff0c;只读存储器。用来存储和保护数据。 ROM特性&#xff1a;Flash 1. ROM数据不能随意更新&#xff0c;但在任何时候都可以读 2. 掉电可保留数据 ROM分类&#xff1a; 1. PROM&#xff1a;可编程一次性&#xff08;无法修…

关于RAM ROM

转自&#xff1a;https://www.jianshu.com/p/d85a5e56c505 关于RAM ROM RAM与ROM就是具体的存储空间&#xff0c;统称为存储器 RAM(random access memory)&#xff1a;运行内存&#xff0c;CPU可以直接访问&#xff0c;读写速度非常快&#xff0c;但是不能掉电存储。它又分为…

ROM,RAM,内存,外存,硬盘,BIOS(手机和计算机中RAM,ROM中区别)

转载&#xff1a;https://blog.csdn.net/szupjz/article/details/51842242 随机存取存储器&#xff08;random access memory&#xff0c;RAM&#xff09;又称作“随机存储器”&#xff0c;是与CPU直接交换数据的内部存储器&#xff0c;也叫主存(内存)。它可以随时读写&#xf…

操作系统发展历程 (Unix、Linux、windows)

文章目录 一 操作系统概念的诞生二 Unix系统的诞生三 Linux的诞生四 Linux的几大分支五 微软、苹果的发展和恩恩怨怨 一 操作系统概念的诞生 说到操作系统的诞生&#xff0c;就要先说一说计算机的发展历程了。   世界上最受大家认可的时间是&#xff1a;1946年2月&#xff0c…

操作系统发展简史

操作系统&#xff08;operating system&#xff0c;简称OS&#xff09;是管理计算机硬件与软件资源的计算机程序&#xff0c;对下提供硬件能力的抽象扩展&#xff0c;对上提供用户操作能力&#xff0c;自20世纪60年代诞生以来&#xff0c;操作系统一直都是IT行业的魔戒&#xf…

RAM,ROM,FLASH

一&#xff1a;keil编译成功时显示的data、xdata、code 程序编译成功时会在信息框内显示data、xdata、code各被占了多少字节&#xff0c;keil工具可以设置变量默认放在哪个存储区&#xff0c;默认是data data就是片内RAM低128字节的区域&#xff0c;idata就是包括低128字节的总…

BIOS之Option ROM详解

1. 何为Option ROM PCI Option ROM又叫PCI Expansion ROM。 它是用于设备初始化和系统boot的code。有的PCI Option ROM被存放在板卡上&#xff0c;而有的则保存在BIOS的binary里面。 2. PCI Option ROM的分类 Option ROM按版本分有2.1的Option ROM和3.0的Option ROM. > …
最新文章