对于高并发订单号生成,一般有几个基本的要求(即使非高并发的订单号,也需要如此)
1.全局唯一
2.趋势递增(有助于业务分析,易于索引)
3.效率高(生成,使用,索引)
4.控制并发
那么,下面说明我们平时会用到的四种生成方式及优缺点
一.UUID/GUID
即唯一标识码构成,生成原理是基于 当前日期和时间,时钟序列和全局唯一的IEEE机器识别号(网卡或其他硬件编号)进行拼接再通过算法计算生成,
能保证单台机器上生成的GUID是唯一的,保证唯一性
优点:
1.使用简单
2.不依赖其他组件
3.不影响数据库扩展
缺点:
1.数据库索引效率低
2.无意义,用户不友好
3.长度36字符串,空间占用大
4.应用集群环境,机器多的时候,重复的可能性会变大
二.数据库自增长
MySQL使用 AUTO_INCREMENT,集群环境下,不同的库,设置 不同的初始值,比如每次自增100
优点:
1.无需编码
2.性能过得去
3.索引友好
缺点:
1.大表不能做水平分表,否则插入删除易出现问题
2.依赖前期规划,扩展麻烦
3.依赖MySQL内部维护 自增锁 ,并发下插入数据影响性能
4.在业务操作父,子表插入时,要 现父后子
三.推特的雪花算法(之后会写一篇笔记专门实现雪花算法)
优点:
1.性能较优,速度快
2.无需第三方依赖,实现简单
3.可以根据实际情况调整和扩展算法,方便灵活
缺点:
1.依赖机器实际,如果发生时间回拨,就有可能生出相同的数据(所以一般都会二次扩展来解决分布式会出现相同数据的问题)
四.基于Redis自增(之后会写一篇笔记专门实现该方式)
利用增长计数API,业务系统在自增长的基础上,配合其他信息组装成唯一的ID
优点:
1.扩展性强,可以方便结合业务进行处理
2.利用Redis操作原子性的特性,保证在并发的时候不会重复
缺点:
1.引入Redis就意味着引入其他第三方的依赖
2.增加一次网络开销,需要良好网络环境
3.需要对Redis服务实现高可用