.NET集成DeveloperSharp生成分布式唯一ID

🏆作者:科技、互联网行业优质创作者
🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你快速成长。升职+涨薪!!

支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。

分布式唯一Id,顾名思义,是指在全世界任何一台计算机上都不会重复的唯一Id。

在单机/单服务器/单数据库的小型应用中,不需要用到这类东西。但在高并发、海量数据、大型分布式应用中,分布式唯一Id却是构建整个系统的最核心一环。

设想一下如下场景:

在某个大型电商系统A中,“订单”这类大数据(比如,每天产生1500万条订单)必定不会存储在1台数据库服务器中,而是分布式的存储在多台数据库服务器组成的一个集群中(比如,1000台数据库服务器组成一个集群)。由于海量数据+高并发等特性时常会伴随“订单”发生,所以,如何确保“订单Id”在整个系统中唯一不重复,已经有些设计难度了。

若此时,另外一家公司的电商系统B,要与你家的电商系统A合并(甚至还有更多公司的C、D、E、等等),那么这些系统合并时“订单Id”出现重复的概率是很大的。要把这些重复修改成唯一,又会要费一番不小的改造功夫,十分麻烦…

但是,若我们一开始就使用分布式唯一Id来实现“订单Id”,则不会有这些麻烦,一切迎刃而解,且十分轻松…

DeveloperSharp包中,提供了全网最完善的分布式唯一Id生成工具,使用示例如下:

若是在.Net Core环境下,代码如下:

using DeveloperSharp.Framework.CoreUtility; //从NuGet引用DeveloperSharp包
--------------------------

   //首先在Startup.cs或Program.cs文件中进行工具预载
   Services.AddTransient<IUtility, Utility>();
--------------------------

   //IU是在相关文件中,通过依赖注入方式获取的IUtility类型对象
   var Id = IU.GenerateId("Order");//产生分布式唯一Id

若是在.Net Framework环境下,代码如下:

using DeveloperSharp.Framework.CoreUtility;//从NuGet引用DeveloperSharp包
------------------------

     IUtility IU = new Utility();
     var Id = IU.GenerateId("Order");//产生分布式唯一Id

说明:(1)“分布式唯一Id”的长度较长,具有全球唯一性,最早起源于facebook、twitter的应用。

           (2)“分布式唯一Id”比GUID更好。GUID在分布式、高并发环境下偶尔还是会有重复出现,而且它是无序的,会导致数据库查询性能下降,而“分布式唯一Id”是相对有序的。

           (3)网上自称分布式唯一Id、GUID、雪花Id、等的工具有很多,但它们生成的Id一般实现不了“全球唯一性”。文本是极少数真正意义上能实现“全球唯一性”的Id工具。

经验:其实,无论是单机小型应用,还是多机大型分布式应用,从今天开始,你都应采用“分布式唯一Id”作为数据库中、每个表的“主键”。因为与所谓可读性、长短、自增Id比起来,它的扩展性好太多、太多... 

GenerateId方法详细说明如下:

GenerateId(Async)

声明:string GenerateId(string Prefix)

用途:生成主键Id (此处生成的是一种分布式唯一Id)

参数:(1)string Prefix  --  前缀词

返回:String   --  主键Id

🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你升职+涨薪!!
🏆点击下方卡片关注公众号,里面有很多大佬的技术文章,能助你快速成长。还可免费领取如下15个视频教程!

回复'面试',获取C#/.NET/.NET Core面试宝典

回复'C#',领取零基础学习C#编程

回复'NET',领取.NET零基础入门到实战

回复'Linux',领取Linux从入门到精通

回复'wpf',领取高薪热门【WPF上位机+工业互联网】从零手写实战

回复'Modbus',领取初识C#+上位机Modbus通信

回复'PLC',领取C#语言与西门子PLC的通信实操

回复'blazor',领取blazor从入门到实战

回复'TypeScript',领取前端热门TypeScript系统教程

回复'vue',领取vue前端从入门到精通

回复'23P',领取C#实现23种常见设计模式

回复'MongoDB',领取MongoDB实战

回复'Trans',领取分布式事务

回复'Lock',领取分布式锁实践

回复'Docker',领取微服务+Docker综合实战

回复'K8s',领取K8s部署微服务

回复'加群',进.NET技术社区交流群 

  • 37
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Redis 实现分布式锁的代码示例可以如下所示```csharp using StackExchange.Redis; using System; public class RedisDistributedLock { private readonly ConnectionMultiplexer _redis; private readonly IDatabase _database; public RedisDistributedLock(string connectionString) { _redis = ConnectionMultiplexer.Connect(connectionString); _database = _redis.GetDatabase(); } public bool AcquireLock(string lockKey, TimeSpan expiryTime, out string lockValue) { lockValue = Guid.NewGuid().ToString(); return _database.StringSet(lockKey, lockValue, expiryTime, When.NotExists); } public bool ReleaseLock(string lockKey, string lockValue) { return _database.ScriptEvaluate( LuaScript.Prepare( "if redis.call('get', KEYS[1]) == ARGV[1] then " + " return redis.call('del', KEYS[1]) " + "else " + " return 0 " + "end"), new RedisKey[] { lockKey }, new RedisValue[] { lockValue } ).Equals(1L); } } ``` 在上面的代码中,我们使用 StackExchange.Redis 库来连接 Redis 数据库。`AcquireLock` 方法用于获取分布式锁,`ReleaseLock` 方法用于释放分布式锁。 使用示例: ```csharp using System; public class Program { public static void Main() { var connectionString = "your_redis_connection_string"; var lockKey = "my_lock_key"; var expiryTime = TimeSpan.FromSeconds(30); using (var redisDistributedLock = new RedisDistributedLock(connectionString)) { string lockValue; if (redisDistributedLock.AcquireLock(lockKey, expiryTime, out lockValue)) { try { // 执行需要加锁的逻辑 Console.WriteLine("Lock acquired. Performing critical section..."); // 在这里执行需要加锁的操作 // 模拟操作耗时 System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); Console.WriteLine("Critical section completed."); } finally { redisDistributedLock.ReleaseLock(lockKey, lockValue); } } else { Console.WriteLine("Failed to acquire lock."); } } } } ``` 上述代码中,我们使用一个唯一的 `lockValue` 来标识锁的持有者。在 `AcquireLock` 方法中,我们使用 Redis 的 `StringSet` 方法来尝试将锁的键值对写入 Redis,并设置过期时间和条件 `When.NotExists`(只有当键不存在时才设置成功)。在 `ReleaseLock` 方法中,我们使用 Lua 脚本来判断当前锁是否属于当前持有者,并通过 `ScriptEvaluate` 方法执行脚本。 请注意,这只是一个简单的示例代码,实际应用中可能需要处理更多的情况,比如锁的续期、异常处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值