在实际市场应用种,表主键Id设置为int已经不能满足数据量大的实际开发需要了,long、Guid、分库分表之类的并不能有效解决这些问题
BAT等巨头公司都是使用雪花算法来解决订单Id的问题
雪花算法:
雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等。
自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景。
GUID:采用无意义字符串,数据量增大时造成访问过慢,且不宜排序。
算法描述:
• 最高位是符号位,始终为0,不可用。
• 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。
• 10位的机器标识,10位的长度最多支持部署1024个节点。
• 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
坑:雪花算法产生的长整数的精度可能超过javascript能表达的精度,这会导致js获取的id与雪花算法算出来的id不一致,如雪花算法得到的是36594866121080832&#x