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

相关推荐
one99617 小时前
WPF-绑定
microsoft·c#·.net·wpf
yuanbenshidiaos19 小时前
MYSQL------sql基础
sql·mysql·oracle
drebander1 天前
SQL 中复杂 CASE WHEN 嵌套逻辑优化
数据库·sql
我是唐青枫1 天前
C# delegate 委托使用教程
开发语言·c#·.net
码农君莫笑1 天前
SQL Server中最大并行度详解
服务器·数据库·sql·sqlserver
one9961 天前
WPF 数据绑定中的通知机制及其性能考虑
c#·.net·wpf
瓜牛_gn1 天前
sql优化(1)
sql
Eiceblue1 天前
.NET框架用C#实现PDF转HTML
开发语言·pdf·c#·html·.net
Rk..1 天前
数据库索引相关总结
java·数据库·sql
数据的世界011 天前
SQL使用视图
数据库·sql