首先必须明确的结论,UUID不适合作为分布式ID。
1、Java代码实现方式
public class Test {
public static void main(String[] args){
System.out.println(UUID.randomUUID());
}
}
结果:2f0d4999-5b0c-41c6-9ad8-d30a8bda79b6 (总共36位,减去4个-,剩余32位置)
2、UUID基本组成(具体组成自己看,自己品,问我我也不清楚)
UUID 是 通用唯一识别码,其中组成可以分为三部分:
2.1当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。
2.2时钟序列
2.3全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。
3、作为分布式ID优缺点
优点:简单,代码方便;性能好,全球唯一
缺点:没有排序,无法保证递增;使用字符存储,查询效率低;占用空间大,传输效率低;
4、是否适合作为分布式id?
可以肯定的和你说,不适合。互联网公司基本都是使用mysql数据库,原因如下:
4.1. 首先分布式id一般都会是主键,但是安装mysql官方推荐越短越好,UUID每一个都很长,所以不推荐。
4.2. 既然分布式id是主键,然后主键是包含索引的,然后mysql的索引是B+树实现,每次插入UUID都得进行索引的优化,对B+树非常不友好。(具体去看看mysql索引使用的算法B+树)
4.3. 信息不安全。MCA地址可能会造成内存泄露。因为算法中包含了MAC地址。
5、适合的场景
综合上述:全球唯一、无序性(主要的问题)、占用空间大。
比如:充值会员的激活码、银行账户号、游戏的点卡等等。