【朝夕教育】2023年10月 .NET CORE工具案例-DeveloperSharp(分布式唯一Id)

本文介绍了如何在分布式系统中使用DeveloperSharp库生成分布式唯一ID,包括Snowflake算法的原理和C#实现,以及在Web项目和控制台项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,优快云博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年优快云博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏


🚀前言

分布式唯一ID(Distributed Unique ID,简称DUID)是指在分布式系统中,为了避免ID冲突而使用的一种ID生成方式。

在分布式系统中,多个节点同时生成ID,如果采用单机自增序列的方式,容易造成ID重复的问题。为了解决这个问题,产生了DUID的概念。

常见的DUID生成方式有:

  1. UUID:通用唯一识别码,是一种由网络软件使用的标准,用于标识信息的唯一性。UUID是根据时间戳、硬件设备等多个因素生成的,因此非常难以重复。

  2. Snowflake算法:是Twitter公司开源的一种分布式ID生成算法。Snowflake算法生成的ID是一个64位整数,其中42位表示时间戳,10位表示工作机器ID,12位表示序列号。这种方式可以在分布式系统中保证ID的唯一性。

  3. GUID:全局唯一标识符,是由Microsoft定义的一种生成唯一ID的算法。与UUID类似,GUID也是根据多种参数生成的,具有很高的唯一性。

本文主要介绍DeveloperSharp的使用,DeveloperSharp是一个研发中大型项目必备的系统平台,也是一个低代码平台。

它主要包括了如下一些功能:

  • 基于Sql语句、存储过程、事务、分页的数据库操作。并几乎支持市面上所有种类的数据库。
  • 图片操作。裁剪、缩放、加水印。
  • http请求调用(Post与Get)
  • 高效分页
  • Web服务/WebApi的负载均衡
  • 数据库的负载均衡,以及读写分离
  • CORS跨域访问
  • UUID全球通用唯一识别码
  • MQ消息队列(请另行使用DeveloperSharp.RabbitMQ包)
  • Redis缓存(请另行使用DeveloperSharp.Redis包)
  • “异种数据库”的负载均衡
  • 其他相关功能

🚀一、分布式唯一Id

🔎1.安装包

DeveloperSharp

在这里插入图片描述

🔎2.使用

1、WEB项目

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

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

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

2.控制台项目

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

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

在这里插入图片描述

🔎3.自定义雪花算法

以下是一个基于C#的雪花算法ID生成器示例代码:

public class SnowflakeIdGenerator
{
    private static readonly long twepoch = 1288834974657L;
    private static readonly long workerIdBits = 5L;
    private static readonly long datacenterIdBits = 5L;
    private static readonly long maxWorkerId = -1L ^ (-1L << (int)workerIdBits);
    private static readonly long maxDatacenterId = -1L ^ (-1L << (int)datacenterIdBits);
    private static readonly long sequenceBits = 12L;

    private static readonly long workerIdShift = sequenceBits;
    private static readonly long datacenterIdShift = sequenceBits + workerIdBits;
    private static readonly long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
    private static readonly long sequenceMask = -1L ^ (-1L << (int)sequenceBits);

    private static readonly Random random = new Random();

    private readonly long workerId;
    private readonly long datacenterId;
    private long lastTimestamp = -1L;
    private long sequence;

    public SnowflakeIdGenerator(long workerId, long datacenterId)
    {
        if (workerId > maxWorkerId || workerId < 0)
        {
            throw new ArgumentException($"worker Id can't be greater than {maxWorkerId} or less than 0");
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0)
        {
            throw new ArgumentException($"datacenter Id can't be greater than {maxDatacenterId} or less than 0");
        }

        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    public long NextId()
    {
        lock (this)
        {
            long timestamp = GetTimestamp();
            if (timestamp < lastTimestamp)
            {
                throw new Exception($"clock moved backwards.  Refusing to generate id for {lastTimestamp - timestamp} milliseconds");
            }
            if (lastTimestamp == timestamp)
            {
                sequence = (sequence + 1) & sequenceMask;
                if (sequence == 0)
                {
                    timestamp = TilNextMillis(lastTimestamp);
                }
            }
            else
            {
                sequence = random.Next(1, 10);
            }

            lastTimestamp = timestamp;

            return ((timestamp - twepoch) << (int)timestampLeftShift) |
                    (datacenterId << (int)datacenterIdShift) |
                    (workerId << (int)workerIdShift) |
                    sequence;
        }
    }

    private long TilNextMillis(long lastTimestamp)
    {
        long timestamp = GetTimestamp();
        while (timestamp <= lastTimestamp)
        {
            timestamp = GetTimestamp();
        }
        return timestamp;
    }

    private static long GetTimestamp()
    {
        return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
    }
}

使用方法:

static void Main(string[] args)
{
    SnowflakeIdGenerator generator = new SnowflakeIdGenerator(1, 1);
    long id = generator.NextId();
    Console.WriteLine(id);
}

这样就可以生成一个雪花算法生成的唯一ID了。
在这里插入图片描述


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值