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实现)的更多相关文章

  1. SpringBoot集成Redis分布式锁以及Redis缓存

    https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...

  2. Redis专题(3):锁的基本概念到Redis分布式锁实现

    拓展阅读:Redis闲谈(1):构建知识图谱 Redis专题(2):Redis数据结构底层探秘 近来,分布式的问题被广泛提及,比如分布式事务.分布式框架.ZooKeeper.SpringCloud等等 ...

  3. redis分布式锁在springboot中的实现

    理论知识   redis分布式锁的实现方案请参考文章 如何优雅地用redis实现分布式锁 本案例简介   以秒杀活动为例子,在多线程高并发的情况下需要保证秒杀业务的线程安全性,确保秒杀记录与所扣库存数 ...

  4. 【分布式锁】Redis实现可重入的分布式锁

    一.前言 之前写的一篇文章<细说分布式锁>介绍了分布式锁的三种实现方式,但是Redis实现分布式锁关于Lua脚本实现.自定义分布式锁注解以及需要注意的问题都没描述.本文就是详细说明如何利用 ...

  5. springBoot实现redis分布式锁

    参考:https://blog.csdn.net/weixin_44634197/article/details/108308395 .. 使用redis的set命令带NX(not exist)参数实 ...

  6. Redis分布式锁服务(八)

    阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...

  7. Redis分布式锁服务(转)

    原文:http://www.cnblogs.com/mushroom/p/4752499.html 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj ...

  8. C# Redis分布式锁的应用 - 叶子栈 - SegmentFault 思否

    原文:C# Redis分布式锁的应用 - 叶子栈 - SegmentFault 思否 叶子 1 微信扫一扫 新浪微博 Twitter Facebook C# Redis分布式锁的应用 c#redis分 ...

  9. Redis分布式锁服务

    阅读目录: 概述 分布式锁 多实例分布式锁 总结 概述 在多线程环境下,通常会使用锁来保证有且只有一个线程来操作共享资源.比如: object obj = new object(); lock (ob ...

随机推荐

  1. DNS解析出现错误故障解决

    当DNS解析出现错误,例如把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,就无法通过域名访问相应的站点了,这就是DNS解析故障.出现DNS解析故障最大的症状就是访问站 ...

  2. shell 学习之if语句

    bash中如何实现条件判断?条件测试类型:    整数测试    字符测试    文件测试 一.条件测试的表达式:    [ expression ]  括号两端必须要有空格    [[ expres ...

  3. mysql 5.6升级到5.7.22

    下载对应的包 wget  https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2.12-x86_64.tar 备份数据 ...

  4. mysql报ERROR:Deadlock found when trying to get lock; try restarting transaction(nodejs)

    1 前言 出现错误 Deadlock found when trying to get lock; try restarting transaction.然后通过网上查找资料,重要看到有用信息了. 错 ...

  5. jemter 新增sha256函数

    1  https://blog.csdn.net/y100100/article/details/80701049 2  https://blog.csdn.net/y100100/article/d ...

  6. 处理:“ORA-00257: archiver error. Connect internal only, until freed”的错误问题

    注:本文参考了< ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法  > 一:问题背景: 今天在 ...

  7. django模板 内建标签

    autoescape 控制当前自动转义的行为,有on和off两个选项 {% autoescape on %} {{ body }} {% endautoescape %} block 定义一个子模板可 ...

  8. LeetCode(114): 二叉树展开为链表

    Medium! 题目描述: 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路: 这 ...

  9. Repair the Wall

    问题 : Repair the Wall 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Long time ago , Kitty lived in a small village. ...

  10. Centos + docker,Ubuntu + docker介绍安装及详细使用

    docker笔记 常用命令 设置docker开机自启:sudo chkconfig docker on 查所有镜像: docker images 删除某个镜像:docker rmi CONTAINER ...