分布式id的生成方案有哪些呢?
最常见的就是UUID,数据库自增主键,redis自增id,雪花算法。
-
UUID
UUID是通用唯一标识码的缩写,其目的是让分布式系统中的所有元素都有位移的辨识信息,而不需要通过*控制器来指定唯一标识。
优点:
1.降低全局节点的压力,使得主键生成速度更快。
2.生成主键全局唯一。
3.跨服务器合并数据方便。因为UUID都是不一样的,所以进行数据合并的时候直接合起来就OK了。
缺点:
1.UUID占用16个字符,空间占用比较多。
2.不是递增有序的数字,数据写入IO随机性很大,且索引效率下降。为什么索引效率会下降呢?因为mysql的数字索引速率明显高于字符串索引效率。
-
数据库主键自主
mysql数据库设置主键且主键自动增长(auto increase)
优点:
1.int和bigint类型占用空间比较小。
2.主键自动增长,IO写入连续性能好。
3.数字类型查询速度明显优于字符串类型。
缺点:
1.并发性能不高,受限于数据库性能。因为数据库是在磁盘进行持久化的,磁盘的读写性能直接决定了数据库的性能,所以并发性不是很高。
2.分库分表的改造复杂。比如我们有一个数据库,主键为1-1000,我们采用分库分表的方式进行分表,id以1结尾的分到1号库,2结尾的分到2号库,以此类推......,当我们分表完成后,主键仍使用自增的方式,势必会造成多个数据库中的不同表的主键重复,改造较为复杂。
3.自增会导致数据量的泄密。前端可以通过id值判断你数据库中有多少数据。
-
Redis自增
redis计数器,原子性自增。
优点:
使用内存,并发性能好。内存的读写性能远远优于磁盘。
缺点:
1.数据丢失。由于是在内存中使用,数据容易造成丢失,
2.自增:数据量容易泄露。同mysql主键自增。
-
雪花算法
优点:
1.不依赖外部组件。
2.性能好。
缺点:
时钟回拨可能会导致重复数据。
那么雪花算法是什么呢?
雪花算法生成的最终结果其实就是一个long类型的Java长整型数字,算法所有的内容都是针对这个数字进行运算的,Java基础类型相信都很熟悉,有32位的整型int类型,和64位的长整型long类型。
雪花算法由四部分组成:
1.符号位,占用1位;
2.时间戳,占用41位,可支持69年的时间跨度;
3.机器ID,占用10位;
4.序列号,占用12位。一毫秒可以生成4095个ID;
更多免费视频、学习资料请关注: