1.数据库自增id
新建一个公共库,库里面新建一个序列表,主键id自增,每次请求增加数据都往这个表中插入数据,然后获取到id,然后使用即可。
优点:方便简单
缺点:单库生成自增id,高并发下,会有瓶颈
适用场景:
并发很低,几百/s,不会出现性能瓶颈
2.UUID
优点:本地生成,不基于任何第三方
缺点:
太长,作为数据库主键性能太差,不适合作为主键
不具有有序性,会导致B+树索引在写的时候有过多的随机写操作(连续的id可以产生部分顺序写)
写的时候不能产生有顺序的 append 操作,而需要进行 insert 操作,将会读取整个 B+ 树节点到内存,在插入这条记录后会将整个节点写回磁盘,这种操作在记录占用空间比较大的情况下,性能下降明显
适用场景:
随机生成文件名、编号,生成token等。
3.系统时间+拼接业务字段值
例如:当前时间戳 + 用户id + 业务含义编码,并发高的时候,会有重复,此时就不行了,不建议使用。
4.Redis
Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。
优点:
不依赖于数据库,灵活方便,且性能优于数据库。
数字ID天然排序,对分页或者需要排序的结果很有帮助。
缺点:
由于redis是内存的KV数据库,即使有AOF和RDB,但是依然会存在数据丢失,有可能会造成ID重复。
依赖于redis,redis要是不稳定,会影响ID生成。
5.snowflake算法
缺点:
依赖于系统时钟的一致性。如果某台机器的系统时钟回拨,有可能造成ID冲突,或者ID乱序、ID重复
优点:
生成ID时不依赖于数据库,完全在内存生成,高性能高可用
容量大,每秒可生成几百万ID
ID呈趋势递增,后续插入数据库的索引树的时候,性能较高
领取专属 10元无门槛券
私享最新 技术干货