解决雪花算法前后端不一致的问题

news/2025/2/7 3:55:17/

一、问题描述

  前后端在进行数据交互的时候,通过雪花算法生成的 id 主键出现前后端不一致的情况;

二、问题分析

  使用雪花算法生成的 id 主键超出了 前端 js 的 number 类型的最大数值;

  • JAVA 中的 Long 类型的最大值为(2^63-1)也就是 9223372036854775807;
  • JS 的 number 类型所支持的最大值为 (2^53)也就是 9007199254740992;
  • 一旦前端所接收的数字超过了 JS 的 number 类型的最大值,就会出现精度丢失,从而导致前后端的值不一致。

三、解决方案

  解决思路:后端的 ID(Long) 通过转换成 String 类型提供给前端使用,前端使用 js 中的 string 就不会出现精度丢失了。 而前端把 String 类型的数字传回服务端的时候,可以直接使用 Long 类型进行接收( Spring 反序列化参数接收默认支持的行为)。


3.1 方案一:添加 yaml 配置
  通过在 application.yml 中加上以下配置进行将所有数字都变成字符串,包括 long 和 int 类型;

spring:jackson:generator:writeNumbersAsStrings: true

3.2 方案二:引入注解
@JsonFormat 或者 @JsonSerialize

// @JsonFormat 注解示例
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;@Data
public class User {/*** 用户id*/@JsonFormat(shape = JsonFormat.Shape.STRING)private Long id;
}
// @JsonSerialize 注解示例
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;@Data
public class User {/*** 用户id*/@JsonSerialize(using = ToStringSerializer.class)private Long id;
}

四、为什么不直接用String 作为主键

  就该问题上来说,使用 String 确实能解决精度丢失的问题,但是使用字符串不建议直接作为主键,理由如下:

  1. 存储空间:相比于数值类型,字符串通常占用更多的存储空间。如果数据集很大或者主键被频繁使用,字符串类型的主键可能会占用大量的存储空间,增加存储成本。

  2. 查询性能:字符串类型的主键在进行索引和查询时通常比数值类型的主键更慢。字符串比较需要逐个字符进行比较,而数值类型可以进行简单的比较操作。当数据集较大时,字符串比较的开销可能会显著影响查询性能。

  3. 排序和范围查询:字符串类型的主键在进行排序和范围查询时可能会遇到一些困难。字符串排序通常是基于字符的字典顺序进行的,而不是基于数值大小。这可能导致排序结果不符合预期。另外,对于范围查询,字符串类型的主键可能需要进行额外的计算和处理才能正确执行范围查询。


http://www.ppmy.cn/news/670230.html

相关文章

Nodejs使selenium调用edge浏览器(Window)

1. 获取驱动 msedgedriver.exe 查看edge浏览器版本,链接edge://settings/help下载对应的版本驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/把 msedgedriver.exe 放到系统环境的PATH中,一般放在Nodejs的安装路…

Office Online Server搭建(全网最详细)

前言 最近换新公司了,一直挺忙的,好久没正儿八经的吹牛逼了!新公司技术部门有定期学习计划,和技术储备计划,这不来了个在线预览文档的活么,作为公司技术储备,需求产生的背景:公司Wo…

Python基本操作

前言 啦啦啦,现在开始,打算做一期Python基础教程,欢迎大家来看哦! 导读 这期文章真的是Python基础中的基础,相信有一定编程基础的小伙伴们都一定能看懂的… 本文共分为以下几个部分: 数与运算符基本输入输出注释模…

YOLOv5/v7 添加注意力机制,30多种模块分析⑦,CCN模块,GAMAttention模块

目录 一、注意力机制介绍1、什么是注意力机制?2、注意力机制的分类3、注意力机制的核心 二、CCN模块1、CCN模块的原理2、实验结果3、应用示例 三、GAMAttention模块1、GAMAttention模块的原理2、实验结果3、应用示例 大家好,我是哪吒。 🏆本…

Java面试Day17

1.什么是 Java 内部类? 内部类的分类有哪些 ?内部类有哪些优点和应用场景? 顾名思义,内部类是指定义在某一个类中的类,主要分为成员内部类,静态内部类,局部内部类和匿名内部类四种。 创建与获取…

AtCoder Beginner Contest 307 F - Virus 2 优先队列+搜索

F - Virus 2 题意: n n n个房间(每个房间都有人), m m m条路,在一开始(第0天)有 k k k个人已经被感染,分别是 A 1 . . . A K A_1...A_K A1​...AK​,给出 d d d天&#…

seatunnel-2.3.2 doris数据同步到hive(cdh-6.3.2)首次运行踩坑记录

seatunnel-2.3.2 doris数据同步到hive(cdh-6.3.2)首次运行报错解决,解决的报错如下: 1、java.lang.NoClassDefFoundError: org/apache/hadoop/hive/metastore/api/MetaException 2、java.lang.NoClassDefFoundError: org/apache/thrift/TBase 3、java.la…

Dinky:问题总结

一、启动时指定flink版本,因为dinky本身也集成了部分flink ./auto.sh start 1.12 二、数据源管理新增mysql时的url jdbc:mysql://ip:3306/dinky?useUnicodetrue&characterEncodingutf8&useSSLfalse&autoReconnecttrue&failOverReadOnlyfalse 不要…