ADO.NET+Redis 实现分布式锁实例

 使用 ADO.NET Redis 来实现分布式锁是一个常见的做法,但需要注意的是,ADO.NET 本身并不直接支持分布式锁的实现。ADO.NET 主要用于数据库操作,而 Redis 则是一个内存中的数据结构存储系统,它提供了像分布式锁这样的高级功能。

下面是一个使用 C# StackExchange.Redis 客户端库来实现分布式锁的示例:

首先,确保你已经安装了 StackExchange.Redis NuGet包,它提供了与 Redis 交互的 .NET 客户端。

csharp代码

using StackExchange.Redis;

using System;

using System.Threading;

public class RedisDistributedLock

{

private readonly ConnectionMultiplexer _redis;

private readonly IDatabase _db;

private readonly string _lockKey;

private static readonly TimeSpan _lockTimeout = TimeSpan.FromSeconds(30); // 锁的超时时间

public RedisDistributedLock(string connectionString, string lockKey)

{

_redis = ConnectionMultiplexer.Connect(connectionString);

_db = _redis.GetDatabase();

_lockKey = lockKey;

}

public bool TryAcquireLock(out RedisValue token)

{

// 使用 Redis 的 SET 命令尝试获取锁,NX 选项表示仅当 key 不存在时才设置,PX 选项设置锁的过期时间

var lockAcquired = _db.StringSet(_lockKey, Guid.NewGuid().ToString(), expiry: _lockTimeout, when: When.NotExists, flags: CommandFlags.PreferMaster);

token = lockAcquired ? (RedisValue?)_db.StringGet(_lockKey) : default;

return lockAcquired;

}

public bool ReleaseLock(RedisValue token)

{

// 使用 Redis 的脚本功能确保锁的释放是原子的,只有持有锁的客户端才能释放它

var script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then " +

"return redis.call(\"del\",KEYS[1]) " +

"else " +

"return 0 " +

"end";

var preparedScript = LuaScript.Prepare(script);

var result = _db.ScriptEvaluate(preparedScript, new RedisKey[] { _lockKey }, new RedisValue[] { token });

return (int)result == 1;

}

}

// 使用示例

class Program

{

static void Main(string[] args)

{

var lockKey = "my-distributed-lock";

var redisLock = new RedisDistributedLock("localhost", lockKey);

if (redisLock.TryAcquireLock(out var token))

{

try

{

// 在这里执行需要同步的代码

Console.WriteLine("Acquired lock. Performing task...");

Thread.Sleep(5000); // 模拟任务执行时间

}

finally

{

// 无论任务是否成功,都要确保锁被释放

if (redisLock.ReleaseLock(token))

{

Console.WriteLine("Lock released.");

}

else

{

Console.WriteLine("Failed to release lock.");

}

}

}

else

{

Console.WriteLine("Failed to acquire lock.");

}

}

}

这个示例代码展示了如何使用 StackExchange.Redis 客户端库来实现一个简单的分布式锁。TryAcquireLock 方法尝试获取锁,并在成功时返回一个 token,这个 token 稍后用于释放锁。ReleaseLock 方法使用 Redis Lua 脚本功能来确保只有锁的持有者才能释放它。

请注意,这个示例是一个简化的版本,用于演示基本概念。在生产环境中,你可能需要考虑更多的细节,比如锁续期(避免任务执行时间超过锁的过期时间)、锁的竞争条件、锁的公平性、Redis 实例的可用性等。此外,如果你正在使用 .NET Core .NET 5/6/7 等较新版本,你可能会使用 Microsoft.Extensions.Caching.StackExchangeRedis 包来与 Redis 交互,但这并不影响分布式锁的实现逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 全组件 局部组件

一、组件定义和使用 1、全局组件 定义 <template> <div> <h1>This is a global component</h1> </div> </template> <script lang"ts"> </script> <style></style> 导入 全局组件在main.ts&#xff…

【C语言必刷题】5.判断闰年

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

智慧公厕是什么?智慧公厕对智慧城市的意义

城市的信息化发展需要催化了智慧城市&#xff0c;公共厕所作为城市的重要民生设施&#xff0c;如何实现更高阶的信息化建设&#xff0c;成为一个重要课题。那么&#xff0c;智慧公厕是什么&#xff1f;为什么它对智慧城市的建设如此重要&#xff1f;本文以智慧公厕源头厂家广州…

QT编写工具基本流程(自用)

以后有人让你写工具的时候&#xff0c;可以方便用这个模版及时提高工作效率&#xff0c;可以争取早点下班。包含库目录&#xff0c;头文件目录&#xff0c;输出目录以及翻译和部署&#xff0c;基本上都全了&#xff0c;也可以做收藏用用。 文章目录 1、创建项目Dialog Widget都…

航空领域中气象常识笔记

前言 由于现在我涉及的项目都是跟气象有关&#xff0c;所以我现在要学习和积累一些气象中的名词和常识&#xff0c;以下为在开发航空领域系统过程中我认为重要的一些知识点记录。 名词解释 强对流天气&#xff1a; 在气象学上&#xff0c;强对流天气指的是一种发生与消失突然…

C++函数重载与编译链接

前言 C支持函数重载&#xff0c;C语言不支持函数重载&#xff0c;它们的区别在于编译器对函数编译的实现不一样。 编译链接 要想明白这个问题&#xff0c;我们首先来简单认识一下编译链接。我们平时写的C&#xff0c;C代码都是需要通过编译链接生成可执行文件的。 为什么需要编…

PNPM 批量检查和更新项目依赖

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

LPC/LSP/LSF辨析

我们在阅读语音或者数字信号处理的论文书籍时经常会遇到LPC,LSF和LSP这些和线性预测相关的名词,刚接触时容易一头雾水,今天我们就介绍下它们之间的关系。 LPC/LSP/LSF 线性预测编码(Linear Predictive coding ,LPC),是一种用于语音信号压缩和分析的方法。在LPC模型中,…

18个惊艳的可视化大屏(第三辑),各行业都有。

2023-04-28 22:35贝格前端工场 本次分享第二辑&#xff0c;请大家慢慢欣赏。

Swift基础知识:18.Swift类

在 Swift 中&#xff0c;类&#xff08;Class&#xff09;是一种用来创建具有共同属性和方法的对象的蓝图。与结构体&#xff08;Structures&#xff09;不同&#xff0c;类是引用类型&#xff0c;它在传递和赋值时是共享同一份数据。类具有面向对象编程的特性&#xff0c;包括…

C语言:数组指针 函数指针

C语言&#xff1a;数组指针 & 函数指针 数组指针数组名 数组访问二维数组 函数指针函数指针使用回调函数 typedef关键字 数组指针 数组本质上也是一个变量&#xff0c;那么数组也有自己的地址&#xff0c;指向整个数组的指针&#xff0c;就叫做数组指针。 我先为大家展示…

041-WEB攻防-ASP应用HTTP.SYS短文件文件解析Access注入数据库泄漏

041-WEB攻防-ASP应用&HTTP.SYS&短文件&文件解析&Access注入&数据库泄漏 #知识点&#xff1a; 1、ASP-SQL注入-Access数据库 2、ASP-默认安装-数据库泄漏下载 3、ASP-IIS-CVE&短文件&解析&写入 演示案例&#xff1a; ➢ASP-默认安装-MDB数据库泄…

如何压缩pdf文件大小?3个有效的解决方法分享

如何压缩pdf文件大小&#xff1f;在办公中&#xff0c;PDF文件大小的压缩不仅有助于节省存储空间&#xff0c;使得大量的PDF文件可以更为高效地存储在有限的硬盘或云端空间中&#xff0c;还能显著加快文件在网络中的传输速度&#xff0c;特别是在处理大型或批量PDF文件时&#…

EXCEL使用VBA一键批量转换成PDF

EXCEL使用VBA一键批量转换成PDF 上图是给定转换路径 Sub 按钮1_Click() Dim a(1 To 1000) As String Dim a2 As String Dim myfile As String Dim wb As Workbook a2 Trim(Range("a2"))myfile Dir(a2 & "\" & "*.xls")k 0Do While m…

springcloud-网关(gateway)

springcloud-网关(gateway) 概述 \Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API&#xff0c;并为其提供跨领域的关注&#xff0c;如&#xff1a;安全、监控/指标和容错 常用术语 Route&#xff08;路由&#xff09;: 网关的基本构件。它由一个ID、一个目的地…

Lightfm学习记录

推荐参考资料 官方文档仓库地址论文地址LightFM推荐系统框架学习笔记LightFM推荐模型库(利于入门)how-i-would-explain-building-lightfm-hybrid-recommenders-to-a-5-year-old(用处不大)协同推荐 lightfm 根据用户已读诗词推荐(可能有用)Recommendation System in Python: L…

C#开发AGV地图编辑软件

C#自己开发AGV地图编辑软件&#xff1a; 1、自由添加和删除站点、停车位、小车、运行路径。 2、编辑得地图以XML文件保存。 3、导入编辑好地图的XML文件。 4、程序都是源码&#xff0c;可以直接在此基础上进行二次开发。 下载链接&#xff1a;https://download.csdn.net/d…

隐匿的炸弹 — C语言的隐式声明

前言 &#xff08;1&#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生&#xff0c;任何区域的暑假Linux驱动实习岗位&#xff0c;可C站直接私聊&#xff0c;或者邮件&#xff1a;zhangyixu02gmail.com&#xff0c;此消息至2025年1月1日前均有效 &#xff08;2&#xff0…

【Python】OpenCV-图像轮廓检测初学

图像轮廓检测初学 在图像处理领域中&#xff0c;轮廓检测是一项重要的任务&#xff0c;用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测&#xff0c;并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 1. 引言 图像轮廓检测是图…

JAVA学习-操作符.逻辑操作符

逻辑操作符用于在条件语句中进行逻辑判断&#xff0c;常用于控制程序的流程。 一、Java中的逻辑操作符有以下几种&#xff1a; 1. 逻辑与&#xff08;&&&#xff09;&#xff1a; 当且仅当两个操作数都为true时&#xff0c;返回true&#xff1b;否则返回false。 bo…