首页 > 数据库 >.NET集成Yitter.IdGenerator实现分布式Id,并使用redis自动注册WorkerId

.NET集成Yitter.IdGenerator实现分布式Id,并使用redis自动注册WorkerId

时间:2022-11-30 20:13:15浏览次数:85  
标签:IdGenerator WorkerId redis public CallingConvention NextId Id

参考文章
多语言新雪花算法(SnowFlake IdGenerator)

添加依赖

Install-Package Yitter.IdGenerator -Version 1.0.14

自动注册WorkerId的动态库下载

这是一个go语言版本的dll,内部使用了redis实现了自动注册WorkerId。使用这个库需要先安装好redis。

https://github.com/yitter/IdGenerator/releases/download/v1.3.1/regworkerid_lib_v1.3.1.zip

下载好后,我把它解压到了Host项目下的lib\regworkerid_lib_v1.3.1\yitidgengo.dll路径

创建YitIdInitHelper类

    public class YitIdInitHelper
    {
        //定义dll路径
        public const string RegWorkerId_DLL_NAME = "lib\\regworkerid_lib_v1.3.1\\yitidgengo.dll";
        //根据文档定义三个接口
        [DllImport(RegWorkerId_DLL_NAME, EntryPoint = "RegisterOne", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
        // 注册一个 WorkerId,会先注销所有本机已注册的记录
        // ip: redis 服务器地址
        // port: redis 端口
        // password: redis 访问密码,可为空字符串“”
        // maxWorkerId: 最大 WorkerId
        private static extern ushort RegisterOne(string ip, int port, string password, int maxWorkerId);

        [DllImport(RegWorkerId_DLL_NAME, EntryPoint = "UnRegister", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
        // 注销本机已注册的 WorkerId
        private static extern void UnRegister();

        [DllImport(RegWorkerId_DLL_NAME, EntryPoint = "RegisterOne", CallingConvention = CallingConvention.Cdecl, ExactSpelling = false)]
        // 检查本地WorkerId是否有效(0-有效,其它-无效)
        private static extern int Validate(int workerId);

        public static long NextId()
        {
            //这个if判断在高并发的情况下可能会有问题
            if (YitIdHelper.IdGenInstance == null)
            {
                UnRegister();
                
                // 如果不用自动注册WorkerId的话,直接传一个数值就可以了
                var workerId = RegisterOne("127.0.0.1", 6379, "", 63);
                // 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId:
                var options = new IdGeneratorOptions(workerId);
                // options.WorkerIdBitLength = 10; // 默认值6,限定 WorkerId 最大值为2^6-1,即默认最多支持64个节点。
                // options.SeqBitLength = 6; // 默认值6,限制每毫秒生成的ID个数。若生成速度超过5万个/秒,建议加大 SeqBitLength 到 10。
                // options.BaseTime = Your_Base_Time; // 如果要兼容老系统的雪花算法,此处应设置为老系统的BaseTime。
                // ...... 其它参数参考 IdGeneratorOptions 定义。

                // 保存参数(务必调用,否则参数设置不生效):
                YitIdHelper.SetIdGenerator(options);

                // 以上过程只需全局一次,且应在生成ID之前完成。
            }

            return YitIdHelper.NextId();
        }
    }

为实体类Id加上一个特性

//可以显示为Id赋值的特性
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public override long Id { get; set; }

改完实体类之后,修改一下表结构,可能需要删掉原来的Id列。

测试

我重写了dbcontext类的SaveChangesAsync方法,所以不需要显式调用YitIdInitHelper.NextId(),如果没有重写的话,显示调用YitIdInitHelper.NextId(),为Id赋值就行了。
        [HttpPost]
        public async Task Add()
        {
            var msg = "测试数据2";
            var currentTime = DateTime.Now;

            await _dbContext.Set<ToDoItem>().AddAsync(new ToDoItem()
            {
                //Id = YitIdInitHelper.NextId(),
                CreationTime = currentTime,
                Text = msg
            });

            await _dbContext.SaveChangesAsync();

        }

可以看到已经成功生成分布式Id了,我这里生成的是15位,Js Number最大16位,根据文档的说法可以用好几十年。

标签:IdGenerator,WorkerId,redis,public,CallingConvention,NextId,Id
From: https://www.cnblogs.com/cnblogsName/p/16939172.html

相关文章

  • springboot缓存之搭建redis环境
    Redis是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库\缓存和消息中间件.安装redis,使用dockerdockerpullregistry.docker-cn.com/library/redis运行re......
  • springboot缓存之整合redis
     一\引入redispom.xml中添加<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>......
  • Redis之Redis缓存管理机制
    Redis缓存管理机制目录Redis缓存管理机制缓存过期&&缓存淘汰缓存穿透&&布隆过滤器缓存击穿&&缓存雪崩总结彩蛋从博客上找到一个用自述版本讲解Redis的,发现讲的挺好......
  • redis 漏洞复现
    漏洞产生的前提条件1、redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;2、没有设置密码认证(一般为空),可......
  • Redis这些知识你了解吗?
    Redis非关系型数据库一、关于Redis1.什么是NoSql?NoSQL(NoSQL=NotOnlySQL),意即“不仅仅是SQL”,泛指非关系型的数据库.它们都有些共同的特征:不需要预定义模式:不需要事先......
  • 用redis统计大量用户的登陆情况[只判断是否活跃]
    有这样的一个场景需求:有上亿的用户,要统计这批用户的登陆情况,例如一周连续登陆,连续三天是是否登陆,一周活跃天数等用户存在的挑战数据如何尽可能用小的空间存储如何能快速获......
  • Redis的快照
    redis本地持久化到硬盘有两种方式,一是快照(snapshotting),二是只追加文件(append-onlyfileAOF)快照快照,顾名思义可以理解为拍照一样,把整个内存数据映射到硬盘中,保存一份......
  • redis惊群
    什么是惊群首先,我们使用缓存的主要目的就是为了高并发情况下的高可用,换句话说,在使用了缓存的高并发的系统下,如果缓存突然都消失了,会发生什么?首先数据库的压力必然骤增,接着负......
  • 云小课|云小课教您如何选择Redis实例类型
    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击......
  • Redis基础命令
    Redis基础命令目录Redis基础命令Redis数据结构介绍Redis通用命令String类型key的层级结构Hash类型List类型Set类型SortedSet类型Redis数据结构介绍redis是一个key-value......