1、中心化的
- select ··· for update 悲观锁。可以锁定一个变量,每次查询它后让它+1,这样,所有的服务都查这个表。
- 搞一个全局的表让id自增,利用insert的id回显来拿到一个全局唯一的id。
- 在redis上使用一个变量,利用分布式锁,让这个变量每一次使用都自增1,来获得全局唯一id。
上述办法并发性太差。
2、去中心化的
- 生成一个uuid,但是uuid跨硬件有可能重复。使用机房id+机器id+uuid,就可以保证全局唯一了。不过uuid占用的空间大,也不能确保递增,创建索引时会影响性能。
- 雪花算法:用一个long类型来表示这个id,64位
- 第一部分:一个0,仅表达雪花算法为正数
- 第二部分:一个41位的时间戳。(精度是毫秒)
- 第三部分:5位的机房id
- 第四部分:5位的机器id
- 第五部分:一个12位的序列号