生成全局唯一id的几种方式:
1、uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高;缺点长度较长,没有递增趋势性,不易维护,常用于生成token令牌。
2、mysql自带自增生成id,oracle可以用序列生成id,但在数据库集群环境下,扩展性不好。
3、基于redis单线程的特点生成全局唯一id,redis性能高。
生成id为当前日期(yyMMddHHmmss)+6位(从000000开始不足位数补0)
20200206164329000001
4、基于雪花算法snowflake 生成全局id,本地生成,没有网络开销,效率高
原理
Twitter的雪花算法SnowFlake。
SnowFlake算法产生的ID是一个64位的整型,结构如下(每一部分用“-”符号分隔):
0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
1位标识部分,在java中由于long的最高位是符号位,正数是0,负数是1,一般生成的ID为正数,所以为0;
41位时间戳部分,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间),
这样可以使产生的ID从更小值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年;