redis分布式锁

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

1.高性能(分布式锁不能成为系统的性能瓶颈)
2.避免死锁(拿到锁的结点挂掉不会导致其它结点永远无法继续)
3.支持锁重入

 

事务

复制代码
using (IRedisClient RClient = prcm.GetClient())
    {
        RClient.Add("key",1);
        using (IRedisTransaction IRT = RClient.CreateTransaction())
        {
            IRT.QueueCommand(r => r.Set("key", 20));
            IRT.QueueCommand(r => r.Increment("key",1)); 

            IRT.Commit(); // 提交事务
        }
        Response.Write(RClient.Get<string>("key"));
    }
复制代码

 

并发锁(模拟2个线程同时并发)

复制代码
   public static bool SetLock(string key, int val, TimeSpan timeOut)
        {
            using (IRedisClient rds = prcm.GetClient())
            {
                using (rds.AcquireLock("Lock" + key, timeOut))
                {
                    int v = rds.Get<int>(key);
                    return rds.Set<int>(key, v + val);
                }
            }
        }


using ServiceStack.Redis;
using ServiceStack.Redis.Generic;
using ServiceStack.Text;

using Sim.Common;
using System.Threading;
namespace ConsoleTest
{
    class Program
    {
     static void Main(string[] args)
        {
//启动2进程模拟 redis并发锁情况 Redis.Set<int>("u", 1); RedisConcurrence r1 = new RedisConcurrence("T1"); Thread thread1 = new Thread(new ThreadStart(r1.Go)); thread1.Start(); RedisConcurrence r2 = new RedisConcurrence("T2"); Thread thread2 = new Thread(new ThreadStart(r2.Go)); thread2.Start(); } } public class RedisConcurrence { private string key = "u"; /// <summary> /// 操作次数 /// </summary> private int count = 10; /// <summary> /// 锁定时间(秒) /// </summary> private int lockTime = 5; private string name; public string Name { get { return name; } set { name = value; } } public RedisConcurrence(string name) { this.name = name; } public void Go() { TimeSpan time = new TimeSpan(0, 0, 0, this.lockTime); for (var i = 0; i < this.count; i++) { Redis.SetLock(key, 1, time); Console.WriteLine(this.name + ":" + DateTime.Now.ToString() + " " + Redis.Get<int>(key).ToString()); } } } }
复制代码

运行结果(刚开始有2个一样的数据,属于正常情况,自己想吧)


本文转自快乐就好博客园博客,原文链接:http://www.cnblogs.com/happyday56/p/3956486.html,如需转载请自行联系原作者
相关文章
|
编解码
一文详解 URLEncode
使用浏览器进行Http网络请求时,若请求query中包含中文,中文会被编码为 `%+16进制+16进制`形式,但你真的深入了解过,为什么要进行这种转义编码吗?编码的原理又是什么?
1092 0
一文详解 URLEncode
|
Java API PHP
(转载)为什么不推荐使用swoole和hyperf官方框架
(转载)为什么不推荐使用swoole和hyperf官方框架
4992 0
路径损耗计算模型 | 带你读《大规模天线波束赋形技术原理与设计 》之二十五
本小节介绍 3D 信道的路损模型,是以 ITU 信道为基础拓展得到的。
13351 0
路径损耗计算模型  | 带你读《大规模天线波束赋形技术原理与设计 》之二十五
|
IDE 开发工具
IntelliJ插件开发教程之新建Action
认识Action 在IDE编辑器中可以通过右键打开选项,如下图所示,这里的动作便是Action,同时在顶部的ToolBar也会有相应的Action,如下图所示。可能大家对我这个IDE的UI有点陌生,其实这是2022.3版本的IDEA开启了New UI,NEW UI还是内测中,需要手动开启,设置位置在:Settings->appearance&behavior -> New UI
IntelliJ插件开发教程之新建Action
|
7月前
|
机器学习/深度学习 编解码 计算机视觉
RT-DETR改进策略【卷积层】| ICCV-2023 SAFM 空间自适应特征调制模块 对ResNetLayer进行二次创新
RT-DETR改进策略【卷积层】| ICCV-2023 SAFM 空间自适应特征调制模块 对ResNetLayer进行二次创新
227 9
RT-DETR改进策略【卷积层】| ICCV-2023 SAFM 空间自适应特征调制模块 对ResNetLayer进行二次创新
idea报错URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
idea报错URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
idea报错URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)
|
开发者 UED 智能硬件
请简要介绍一下鸿蒙操作系统的特点和优势。
请简要介绍一下鸿蒙操作系统的特点和优势。
2034 0
|
安全 iOS开发 MacOS
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
363 0
|
资源调度 前端开发 JavaScript
Excalidraw, 一款超赞的开源白板工具
Excalidraw, 一款超赞的开源白板工具
464 0
|
存储 SQL 关系型数据库
MySQL分库分表,何时分?怎么分?
MySQL分库分表,何时分?怎么分?
1371 0
MySQL分库分表,何时分?怎么分?

热门文章

最新文章