【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 系列

相关推荐
吃掉你也没关系吧9 小时前
【postgresql】一文详解postgresql中的统计模块
sql·postgresql
hqwest10 小时前
C#WPF实战出真汁06--【系统设置】--餐桌类型设置
c#·.net·wpf·布局·分页·命令·viewmodel
AI 嗯啦10 小时前
SQL详细语法教程(三)mysql的函数知识
android·开发语言·数据库·python·sql·mysql
做一位快乐的码农13 小时前
基于.net、C#、asp.net、vs的保护大自然网站的设计与实现
c#·asp.net·.net
Navicat中国17 小时前
Navicat 询问 AI | 如何转换 SQL 为另一种数据库类型
数据库·人工智能·sql·数据库开发·navicat
nbsaas-boot18 小时前
用 FreeMarker 动态构造 SQL 实现数据透视分析
数据库·windows·sql·freemarker·数据报表
YF云飞18 小时前
.NET 在鸿蒙系统(HarmonyOS Next)上的适配探索与实践
华为·.net·harmonyos
小码编匠18 小时前
C# Bitmap 类在工控实时图像处理中的高效应用与避坑
后端·c#·.net
晴子呀19 小时前
分库分表和sql的进阶用法总结
数据库·sql
Kay_Liang19 小时前
从聚合到透视:SQL 窗口函数的系统解读
大数据·数据库·sql·mysql·数据分析·窗口函数