首页 > 编程语言 >雪花算法分布式Id以及其产生的前端精度损失解决方法

雪花算法分布式Id以及其产生的前端精度损失解决方法

时间:2022-09-19 10:12:54浏览次数:116  
标签:雪花 Id 算法 bit 生成 id 分布式

一. 分布式 id#

特点:#

1. 全局唯一性:全局没有重复的id标识。
2. 递增性:保证生成的 id 在业务中是递增的。
3. 高可用:确保在任何时候都能生成正确可用的id。
4. 高并发:在高并发环境下表现良好。

分布式id常见解决方案#

1. UUID
java 中自带的算法,其能生成一串占 36 bit 的字符串,可以保证唯一性但无法实现有序递增,且业务可读性差。
2. 雪花算法
具体介绍写在下面。
3. Leaf
由美团开源的分布式id生成算法,能保证唯一性,递增性,但需要依赖关系数据库、Zookeeper 等中间件。可以参考:Leaf算法

二. 雪花算法#

雪花算法是 Twitter 开发的一种分布式 id 生成算法,即 SnowFlake 算法,取意于自然界不存在两片完全一样的雪花,雪花算法生成的 id 也如雪花一样是独一无二的。

组成#

雪花算法生成的 id 是一个 64 bit(位)的 long 型的数字(二进制的),下面给出结构图:
image

该生成的 id 主要由 4 部分构成:
1. 首位无效占位符:占用 1 bit ,其值始终为 0,没有意义。
2. 时间戳:占用 41 bit ,用来记录时间戳,为毫米级,即 2 的 41 次方大概为 69 年。
3. 机器编码:占用 10 bit ,其中高位 5 bit 是数据中心 ID,低位 5 bit 是工作节点 ID,最多可以容纳 1024 个节点。
4. 序列号:占用 12 bit ,用来记录同毫秒内产生的不同 id 。每个节点每毫秒从 0 开始不断累加,最多可以累加到 4095 ,一共可以产生 4096 个 id 。
SnowFlake算法在同一毫秒内最多可以生成 1024 X 4096 = 4194304 个全局唯一id。

三. 雪花算法导致前端精度丢失解决方法#

原因:#

前端 js 的 number 类型有最大值,即 2 的 53 次方,为9007199254740992,这是一个 16 位的十进制整数即前端精度为 16 位,后端采用雪花算法得到的 id 是 long 型(64 bit)的即精度为 19 位。这时候,前后端传值就会出现精度丢失。

解决方法:#

1.把数据库 id 改为 String 类型,相当的麻烦,且性能会下降,此种方法不能使用。
2.采用注解方法,将@JsonSerialize(using = ToStringSerializer.class)加到需要的 id 字段上。例子如下:

public class ArticleVo {
    //防止后端Long类型转为前端JSON数据精度丢失
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    private String title;

    private String summary;
}

3.可以采用这个博主的全局配置类方法:点击这里查看

标签:雪花,Id,算法,bit,生成,id,分布式
From: https://www.cnblogs.com/study-node/p/16706770.html

相关文章

  • SQL SERVER/ORACLE 将ID串列转换为多行的写法
    SQLSERVER将ID串列转换为多行的写法:selectdistincta.employeeidasMANAGEREMPLOYEEID,CAST(SUBSTRING(a.AttributeValue,number,CHARINDEX(',',a.AttributeVal......
  • Android compose使文本垂直居中
    仅使用Text()无法垂直居中。需要将Box()与contentAlignment=Alignment一起使用。居中还有用于对齐的CenterStart和CenterEnd选项。Box(contentAlignment=Alignmen......
  • 35. 图片加载框架Glide
    35.图片加载框架Glide35.1Glide的引入官方地址:https://github.com/bumptech/glide简体中文文档地址:https://muyangmin.github.io/glide-docs-cn/引入implementat......
  • 34. 在Android中集成高德地图
    34.在Android中集成高德地图34.1高德地图开放平台创建新应用点击“添加”按钮新建一个工程34.2获取安全码这个工具是jdk自带的使用命令keytool-list-......
  • MAUI+Android调试报错:XABLD7000: Xamarin.Tools.Zip.ZipException: Renaming temporar
    调试报错:严重性 代码 说明 项目 文件 行 禁止显示状态错误 XABLD7000:Xamarin.Tools.Zip.ZipException:Renamingtemporaryfilefailed:Permissiondenied在Xam......
  • [算法]循环排序
    这类题的特点是给定的数值和下表rank是类似的,其中可能会有一些差异.在设计算法的时候,可以将value值映射到rank上去.其中,选择大于的值最好比rank的最大值+1,这样会避......
  • android小项目-菜谱APP-首页面设计上(RecyclerView+OKHttp+GSON+Glide)
    在上一节中,已经搭建好了导航栏,现在开始完成首页内容的设计。任务描述:实现从网络HTTP接口获取菜谱数据,并完成菜谱App主页面的布局设计。设计思路:1.数据层面,使用showapi的......
  • Android——使用GSON库解析json数据(解析菜谱大全返回的JSON数据)
    1.首先,在dependencies依赖库添加GSON库的依赖:implementation'com.google.code.gson:gson:2.8.6'2.有关GSONGSON提供了fromJson()和toJson()两个直接用于解析和生成JSON......
  • Problem P24. [算法课回溯]组合问题
    采用递归遍历所有可能性,再使用剪枝减小运行时间,利用回溯,代码有注释#include<iostream>#include<bits/stdc++.h>#include<cstdio>#include<string>usingnamespace......
  • Android基础
    1、Android版本:Android网址版本号api级别主要特性V4.014统一平板和手机的操作系统,基于linux3.0.3内核开发V5.021采用全新MaterialDesign界面,使用ART虚拟......