发生背景
小渣渣最近看了mysql索引相关的问题,了解到主键最好用自增的方式来实现。因为主键如果不是自增的话,就需要索引的底层B+树去进行左旋或右旋操作,从而保持有序。如果是自增的话,就仅仅只需要在B+树的叶子节点上面添加一个叶子数据就可以实现了。
因此,选择放弃了之前UUID做主键的方式,为了有序,可以使用mysql的自增,感觉自增有点low,然后选择了雪花算法。
springboot雪花算法的实现
<dependency>
<groupId>xyz.downgoon</groupId>
<artifactId>snowflake</artifactId>
<version>1.0.0</version>
</dependency>
new Snowflake(1, 2).nextId()
在这种模式下面会出现一个Long类型的id主键,且天然有序,适合分布式。
然后前后端对接,就出现了一些有意思的问题,传递给前端的id和前端显示的id不一样,首先回顾了代码,debug,排除了代码的问题。经过百度发现。
原因
当后端传Long类型给前端, Long类型数据大于17位时。前端拿到的数据: 第16位会四舍五入, 17位后的数据自动用0代替),在Json中就会出现精度丢失的情况。
第一次遇到这种问题,感觉还是很有意思。
解决方法
1.将Long数据类型用String类型替换,需要修改数据库的表和大量代码,放弃。
2.springboot中,在实体类当中,序列化时候,对字段添加注解。
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
总结
身为一个java小渣渣,在工作的时候总是会遇到一些奇奇怪怪的问题。记录下来并不时回顾,希望能够快一点的升级。
昨天和一位30岁的大佬在路上聊天,人家说,每天工作回去之后,还要看看新知识,新框架。想想自己,在工作之后回到家里,就是一个混吃等死打游戏的咸鱼,哎!