当前位置: 首页 > news >正文

C# --- 使用Redis分布式锁实现初始化任务

C# --- 使用Redis分布式锁实现初始化任务

  • 背景
  • 解决方案 --- 分布式锁

背景

  • service A 在启动时需要读取一些配置文件,并根据配置文件的内容对数据库进行更新
  • service A有多个实例,所以在启动时会重复进行初始化,浪费资源

解决方案 — 分布式锁

可以使用分布式锁 + version number的方式实现只让一个实例进行初始化任务

  • version number: .Net应用在编译时(不管代码有没有改变)都会生成一个assembly module version id
  • version number存在数据库里,用于对比

具体步骤:

  • 多个实例同时启动,不断尝试获取分布式锁
  • 实例A拿到锁,使用自身的version number和数据库里的进行对比,如果不一致则说明初始化任务还未进行,则执行初始化任务,完成后释放锁
  • 实例B获取锁,使用自身的version number和数据库里的进行对比,发现version number一致,则说明已执行完初始化任务,跳过初始化任务
//.Net的 Redis library
using RedLockNet private async Task<IRedLock> AcquireLock()
{//时间分别为:expireTime,waitTime,retryTimevar dLock= await _lockFactory.CreateLockAsync(LockKey, TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(70), TimeSpan.FromSeconds(2),if (dLock.IsAcquired){return dLock}await dLock.Dispose();throw Exception("Cannot get lock within wait time")
}
public async DoInitTask()
{await using var distributedLock = await AcquireLock()var newVersion = GetNewVersion();var curVersion = GetVersionFromDB();if (newVersion = curVersion) {log("already init")return }//do init task
}
http://www.dtcms.com/a/291220.html

相关文章:

  • Navicat数据建模三模型高效用法详解
  • 淘宝获取商品分类接口操作指南
  • Java学习 ------BIO模型
  • 识别并计算滑块距离
  • 高性能I/O的终极武器:epoll深度解析与实战
  • 关于java8里边Collectors.toMap()的空限制
  • 使用 PyTorch 的 torchvision 库加载 CIFAR-10 数据集
  • python 中if/elif/else 是如何构建程序逻辑的?
  • 【初识数据结构】CS61B中的最小生成树问题
  • LLaMA-Factory 微调可配置的模型基本参数
  • jcmd用法总结
  • 完整的 SquareStudio 注册登录功能实现方案:已经烧录到开发板正常使用
  • 83、形式化方法
  • Unity VR多人手术系统恢复3:Agora语音通讯系统问题解决全记录
  • 【CAN】01.CAN简介硬件电路
  • 视网膜分支静脉阻塞(BRVO)及抗VEGF治疗的多模态影像学研究
  • 同步与异步?从一个卡顿的Java服务说起
  • 文字检测到文字识别
  • 如何用 Z.ai 生成PPT,一句话生成整套演示文档
  • 自反馈机制(Self-Feedback)在大模型中的原理、演进与应用
  • 【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”
  • 【ROS1】07-话题通信中使用自定义msg
  • (9)机器学习小白入门 YOLOv:YOLOv8-cls 技术解析与代码实现
  • 选择排序 冒泡排序
  • LinkedList与链表(单向)(Java实现)
  • android studio 远程库编译报错无法访问远程库如何解决
  • 算法提升之字符串回文问题-(马拉车算法)
  • Java基础教程(011):面向对象中的构造方法
  • 模拟高负载测试脚本
  • Flink框架:keyBy实现按键逻辑分区