【SqlSugar雪花ID常见问题】.NET开源ORM框架 SqlSugar 系列

系列文章目录

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀


文章目录

  • 系列文章目录
  • [一、前言 🍃](#一、前言 🍃)
  • [二、ORM中使用雪花ID ❄️](#二、ORM中使用雪花ID ❄️)
    • [2.1 普通插入](#2.1 普通插入)
    • [2.2 导航插入](#2.2 导航插入)
    • [2.3 手动调用雪花ID](#2.3 手动调用雪花ID)
  • [三、雪花ID重复 问题 🔁](#三、雪花ID重复 问题 🔁)
  • 四、Javascript精度问题
    • [4.1 方案1](#4.1 方案1)
    • [4.2 方案2](#4.2 方案2)
  • [五、自定义雪花ID算法 🎨](#五、自定义雪花ID算法 🎨)
  • [六、时间回退处理 🔙](#六、时间回退处理 🔙)
  • [🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀](#🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀)

一、前言 🍃

雪花算法 (Snowflake)是一种用于生成唯一标识符(ID)的分布式算法。它可以生成趋势递增且具有一定时间顺序的 64 位整数,适用于分布式系统中的唯一 ID 生成需求。下面将介绍雪花ID在 SqlSugar 中的用法。

二、ORM中使用雪花ID ❄️

2.1 普通插入

调用 ExecuteReturnSnowflakeId 方法主键会自动赋值雪花ID。

csharp 复制代码
public class 实体
{
   [SugarColumn(IsPrimaryKey =true)]//long类型的主键会自动赋值
   public long Id { get; set; }
   
   public string Name{get;set; }
}
long id= db.Insertable(实体).ExecuteReturnSnowflakeId();//单条插入返回雪花ID
List<Long> ids=db.Insertable(List<实体>).ExecuteReturnSnowflakeIdList();//多条插入批量返回,比自增好用

2.2 导航插入

在导航操作中如果主键是 Long 不赋值也会自动赋值雪花ID。

2.3 手动调用雪花ID

csharp 复制代码
var id=SnowFlakeSingle.Instance.NextId();//也可以在程序中直接获取ID

三、雪花ID重复 问题 🔁

用雪花ID一定要设置 WorkId , 只要静态变量 SnowFlakeSingle 不能共享的情况都要有单独的WorkId。

✅养成良好习惯服务器上的 WorkId 和本地不要一样,并且多服务器都要设置不一样的 WorkId。

csharp 复制代码
//程序启时动执行一次就行
SnowFlakeSingle.WorkId= 唯一数字; //从配置文件读取一定要不一样
//服务器时间修改一定也要修改WorkId
 
//参数说明:
//workerId机器ID  2进制5位  32位减掉1位 31个
//datacenterId机房ID 2进制5位  32位减掉1位 31个

标注:SqlSugar自带雪花ID是成熟算法,正确配置WorkId无一例重复反馈,标题5也可以用自定义雪花算法。

四、Javascript精度问题

4.1 方案1

精度 long 没有19 位长度,所以序列化 雪花ID 时要序列化成 string 。

csharp 复制代码
[Newtonsoft.Json.JsonConverter(typeof(ValueToStringConverter))] //JsonConverter的命名空间不要搞错了
[SugarColumn(IsPrimaryKey =true)] 
 public long Id { get; set; }
   
//配置API使用JSON.NET
//Nuget安装 Microsoft.AspNetCore.Mvc.NewtonsoftJson
   services.AddControllers().AddNewtonsoftJson(opt =>
   {
                //忽略循环引用
                opt.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
   
                //不改变字段大小
                opt.SerializerSettings.ContractResolver = new DefaultContractResolver(); 
    });

4.2 方案2

使用短雪花ID,这个算法需要你自已提供,因为短雪花ID不成熟所以我不提供,如何将自定义算法集成进SqlSugar看标题5。

五、自定义雪花ID算法 🎨

如果你有好用的雪花ID组件用习惯了也可以使用你自个的算法(用自已的算法WorkId等都需要你的算法自已支持)

csharp 复制代码
  //程序启动时执行一次就行
  StaticConfig.CustomSnowFlakeFunc = () =>
  {
      return 你的雪花ID方法();
  };

六、时间回退处理 🔙

系统因为临时故障引起的时间回退,一般就是几十毫秒,比如系统卡了等,可以用临时ID进行处理,不让程序报错,默认是扔出错误。

如果是人为调整就需要重启服务,不能长时间用自定义ID,或者修改 workId

csharp 复制代码
//程序启时动执行一次就行
var ran=new Random();
StaticConfig.CustomSnowFlakeTimeErrorFunc = () =>
 {
     return ran.Next(16, 18);//出现时间回退使用临时算法插入
 };

🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
【跨库查询、多库查询】.NET开源 ORM 框架
​【报表查询】.NET开源ORM框架 SqlSugar 系列
【Where语法全解密】.NET开源ORM框架 SqlSugar 系列
【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列

相关推荐
w-w0w-w6 小时前
SQL注入
网络·数据库·sql
宇宙无敌暴龙战士6669 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
rockey6279 小时前
AScript之字符串模板
c#·.net·script·expression·动态脚本
对空六课16 小时前
埋点上报太频繁拖性能,先做批量合并和时机控制
sql·工具选型·数据上报·埋点方案·sdk接入
java_nnnn18 小时前
Spring IoC & DI 从入门到理解:控制反转、依赖注入与 Bean 管理详解
数据库·sql·spring
玩泥巴的19 小时前
源生成与 AOT 就绪的微信生态 .NET SDK:结构、能力边界与 API 定位方法
ai·微信·.net·agent·aot·roslyn
code_slave(码畜)19 小时前
微服务架构落地:慢 SQL 治理与连接池调优 —— 守住数据库的最后一道防线
数据库·spring boot·sql·spring cloud·微服务·架构
1-1=020 小时前
C# 泛型
c#·.net·.netcore
码农阿豪20 小时前
MongoDB迁移到金仓数据库:商品属性继续灵活存,订单报表交给 SQL
数据库·sql·mongodb