架构师_程序员

查看: 307|回复: 3

[.NET Core] .NET Core 基于 Redis 实现分布式锁原理解析

[复制链接]
发表于 2020-9-22 09:17:22 | 显示全部楼层
在业务场景中,不允许并发同时操作内容,例如商品库存、同一个文件等等,并且程序应用部署在多台服务器上面,这时候,我们需要用到分布式锁取解决。
【实战】ASP.NET Core 基于 Redis 分布式锁秒杀
https://www.itsvse.com/thread-9397-1-1.html

以前写的基于 zk 实现的分布式锁,如下:

.net/c# Zookeeper分布式锁的实现[源码]
https://www.itsvse.com/thread-4651-1-1.html

阅读本文,还需要了解的知识:

Volatile vs. Interlocked vs. lock
https://www.itsvse.com/thread-5023-1-1.html

C#并行计算 Parallel.Foreach&Parallel.For
https://www.itsvse.com/thread-3671-1-1.html

.NET Core 基于 Redis 实现分布式锁的原理是调用 redis 的 SETNX 命令,若键 key 已经存在, 则 SETNX 命令不做任何动作。命令在设置成功时返回 1 , 设置失败时返回 0 。

http://redisdoc.com/string/setnx.html

新建一个 .NET Core 3.1 的控制台项目,添加 StackExchange.Redis 引用,nuget命令如下:

我们调用类库的 StringSet 方法,通过 StackExchange.Redis 源码,可以看到 StringSet 方法会调用 GetStringSetMessage 私有的方法,通过 when 的枚举值,来执行不同的 set 命令,代码如下:

我们通过程序并行测试调用执行 2000 次 SETNX 命令,分 2 次执行,其中 key 的缓存有效期为 5 秒,也就是 5 秒后会自动释放 key,也就是释放锁。

代码如下:


可以看到,一共成功插入插入 2 次,失败了 1998 次,完全符合我们的预期,效果图如下:
QQ截图20200922090659.jpg

这时候,还没有去释放锁。
(完)









上一篇:未能找到路径“\bin\roslyn\csc.exe”的一部分 的解决办法
下一篇:EF Core 系列(二)封装 OnModelCreating 利用反射创建索引等
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2020-9-26 15:37:52 | 显示全部楼层
test123
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 7 天前 | 显示全部楼层
请问一下,如果存在多线程环境和容器部署时多实例环境,这样处理是不是会有问题呢?
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 7 天前 | 显示全部楼层
qiuyueming 发表于 2020-11-20 11:18
请问一下,如果存在多线程环境和容器部署时多实例环境,这样处理是不是会有问题呢? ...

多实例意味着其实就是多线程,源码中就是多线程去调用 redis,只有一个线程获得锁
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2020-11-27 07:59

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表