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 -a //Key:lockName Value:lockValue
//NX :只在键不存在时,才对键进行设置操作。(nil) # 键已经存在,设置失败
//PX :设置键的过期时间为 30000 毫秒
SET lockName lockValue NX PX //Lua脚本,逻辑很简单,获取key中的值和参数中的值相比较,相等删除,不相等返回0。
//防止误删
if redis.call("get",KEYS[]) == ARGV[] then
return redis.call("del",KEYS[])
else
return {KEYS[],ARGV[]}
end //调用lua脚本命令
redis-cli -h 127.0.0.1 -p -a --eval del.lua lockName lockValue
3.测试效果
namespace ResdisLock
{
class Program
{
static int i = ;
static void Main(string[] args)
{
for (int i = ; i < ; i++)
{
ThreadStart threadStart = new ThreadStart(GetLock);
Thread thread = new Thread(threadStart);
thread.Start();
}
Thread.Sleep();
Console.ReadLine();
} public static void GetLock()
{
try
{
using (var Lock = RedisLockExtension.CreateLock("luckLock", TimeSpan.FromMilliseconds(), ))
{
Console.WriteLine(++i);
}
}
catch (RedisLockCreateException ex)
{
Console.WriteLine(ex.Message);
}
}
}
}

源码地址:https://github.com/lgxlsm/ResdisLock
Redis分布式锁(ServiceStack.Redis实现)的更多相关文章
- SpringBoot集成Redis分布式锁以及Redis缓存
https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...
- Redis专题(3):锁的基本概念到Redis分布式锁实现
拓展阅读:Redis闲谈(1):构建知识图谱 Redis专题(2):Redis数据结构底层探秘 近来,分布式的问题被广泛提及,比如分布式事务.分布式框架.ZooKeeper.SpringCloud等等 ...
- redis分布式锁在springboot中的实现
理论知识 redis分布式锁的实现方案请参考文章 如何优雅地用redis实现分布式锁 本案例简介 以秒杀活动为例子,在多线程高并发的情况下需要保证秒杀业务的线程安全性,确保秒杀记录与所扣库存数 ...
- 【分布式锁】Redis实现可重入的分布式锁
一.前言 之前写的一篇文章<细说分布式锁>介绍了分布式锁的三种实现方式,但是Redis实现分布式锁关于Lua脚本实现.自定义分布式锁注解以及需要注意的问题都没描述.本文就是详细说明如何利用 ...
- springBoot实现redis分布式锁
参考:https://blog.csdn.net/weixin_44634197/article/details/108308395 .. 使用redis的set命令带NX(not exist)参数实 ...
- Redis分布式锁服务(八)
阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...
- Redis分布式锁服务(转)
原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj ...
- C# Redis分布式锁的应用 - 叶子栈 - SegmentFault 思否
原文:C# Redis分布式锁的应用 - 叶子栈 - SegmentFault 思否 叶子 1 微信扫一扫 新浪微博 Twitter Facebook C# Redis分布式锁的应用 c#redis分 ...
- Redis分布式锁服务
阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...
随机推荐
- Shell-find . -type f -name "*.php" -print0 | xargs -0 wc -l
统计一个源代码目录中所有 php 文件的行数
- 使用vmstat和iostat命令进行Linux性能监控【转】
转自:https://linux.cn/article-4024-1.html 这是我们正在进行的Linux命令和性能监控系列的一部分.vmstat和iostat两个命令都适用于所有主要的类unix系 ...
- 转-CSRF&OWASP CSRFGuard
一. 什么是CSRF?CSRF(Cross-Site Request Forgery)直译的话就是跨站点请求伪造也就是说在用户会话下对某个需要验证的网络应用发送GET/POST请求——而这些请求是未经 ...
- bootstrapValidator使用总结
1.根据条件动态增删检查条件 参考文章:https://blog.csdn.net/sxlzs_/article/details/78211928 #去除某字段的验证 $("#formRes ...
- jetty去掉项目名称访问
对于web项目,访问路径是否包含项目名称等修改访问路径的配置方式: 我所使用的是maven进行管理,只需要在pom.xml中进行如下配置 <!-- jetty插件 jetty:run--> ...
- Apache 和 Tomcat联系和区别
作者:郭无心链接:https://www.zhihu.com/question/37155807/answer/72706896来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 一篇文章让你了解Android各个版本的历程
2008年--至今 Android 1.5(Cupcake纸杯蛋糕): 智能虚拟键盘:使用widgets实现桌面个性化:在线文件夹(Live Folder)快速浏览在线数据:视频录制和分享:图片上传: ...
- 手把手教你React Native 实战之开山篇《一》
先说一下我为什么学习RN 18年3月29号,随着自己内心的欲望和冲动,任务交接了一下,正式离开一家医疗公司.第二天就入职了这之前已经找好的公司,由于自己对代码浓厚的热情,自己终于也不再带团队.正好有充 ...
- mvn tomcat7:help的14个命令
D:\2018\code\XXX>mvn tomcat7:help [INFO] Scanning for projects... [INFO] [INFO] ----------------- ...
- setenforce: SELinux is disabled解决办法
如果在使用setenforce命令设置selinux状态的时候出现这个提示:setenforce: SELinux is disabled 那么说明selinux已经被彻底的关闭了 如果需要重新开启s ...