分布式id生成
分布式id问题来源于分库分表,一张表可能多库中存在多表,所以传统自增的主键会出现重复;需要利用分布式来解决,分配主键不重复。
分布式id在分布式的前提下,有以下几点需求:
唯一、高性能、高可用、简单、利于数据库存储查找等
介绍以下几种方式
UUID
UUID生成简单,一行代码,而且本地生成不需要资源;生成直接可用
缺点:过长,纯字符,无规则,不适合数据库主键,影响性能以及数据变动需要改变位置
数据库自增id
维护一张表,向表中插入数据返回自增id;
缺点:数据库会成为分布式高并发的瓶颈,且单机不能保证高可用
数据库集群生成id
几个库一起生成id,通过起点、步长不一致保证唯一
缺点:不利于扩容,需要改动所有机器规则;还不能满足高并发
数据库号段模式
维护一张表,max_id,step,version基本元素,每次取一段数值(id取值)到内存中使用,使用后更新表中max_id值,更新version保证并发正确性
redis
利用redis数字型原子自增(incr),需要注意redis持久化问题
雪花算法
1数字位 41时间戳 10机器位 12序列号
数据位取0为整数,时间戳建议当前-一个固定值可以取更多数据,机器位 机房+机器