雪花算法导致精度丢失

问题来源:

雪花算法生成的是19位id,并且是Long类型,64bit,这在服务端上使用long类型是可以的.但是当把id从后端传给js(js使用number接收,number的精度是16位),这时候会出现精度的丢失.

结局方法:

雪花算法生成的id,服务端响应页面时,json处理,将id转化为String.

代码(/架构):扩展mvc架构的消息转换器 

public class JacksonObjectMapper extends ObjectMapper {

    public static final String Default_Date_FORMAT = "yyyy-MM-dd";

    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    public JacksonObjectMapper() {
        super();
        //收到未知属性时不报异常
        this.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        //反序列化时,属性不存在的兼容处理
        this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        SimpleModule simpleModule = new SimpleModule()
                .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(Default_Date_FORMAT)))
                .addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))

                .addSerializer(BigInteger.class, ToStringSerializer.instance)
                
                //重点在这里Long序列化,使用的是ToStringSerizlizer;
                .addSerializer(Long.class, ToStringSerializer.instance)
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
                .addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(Default_Date_FORMAT)))
                .addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

   
        this.registerModule(simpleModule);
    }
}

为什么雪花算法能生成分布式系统唯一id:

对于不同设备,机器id会不同..对于同一设备,有41位来记录时间戳到毫秒级别,同一毫秒级别,12位来记录(自增).

mybatis-plus默认的主键生成策略就是雪花算法,并且还提供了一个工具类(IdWorker)来供开发者使用.

System.out.println(IdWorker.getId());

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值