1、发号器特征redis
1)全局惟一性:保证不会出现重复ID算法
2)有序性:保证必定的顺序性数据库
3)易扩展:方便扩容安全
4)易恢复:服务不可用时或数据能从原服务器恢复服务器
5)高性能网络
2、实现发号器的方式并发
2.一、数据库自增分布式
优势:性能
1)保证惟一性spa
2)保证顺序递增
3)简单
缺点:
1)分表分库后ID会重复
2)经过设置固定步长解决分表带来的问题,但扩容不方便
3)网络异常时没法判断插入是否成功,若是在执行语句时发生。网络中断,客户端没法知道事务是否成功,即便成功,也无法再得到产生的 ID
2.二、当前时间毫秒值
优势:
1)性能好
2)不依赖数据库,id能优先生成
缺点:
1)并发超过1000时,会产生重复ID
2)时钟回拨会产生重复ID
3)分布式应用不适用
2.三、UUID
优势:
1)简单、性能好
2)不受分表分库影响
缺点:
1)没法保证递增趋势
2)UUID用32位字符串,占用空间大
3)查询性能慢,做为数据库主键时,新增数据效率慢,会对索引重排序
2.四、数据库ID分组(设置不一样的自增步长)
和数据库自增相似,只是设置不一样的步长,可知足分布式应用ID重复的场景,但不易扩容
2.五、Snowflake算法
优势:全局惟一性,并发高,性能好,易恢复,易扩展
缺点:收时钟回拨影响
2.六、Redis键自增
3、实现思路
3.1 Snowflake算法
1)第1位:符号位,0表示正数,1表示负数,发号器第一位默认为0
2)第2-42位:时间戳,精确到毫秒
3)第43-52位:机器ID(机房ID+服务器ID)
4)第53-64位:序列号,自增加,支持同一个节点1ms可产生4096个ID
3.2 redis实现思路
1)每次预先从redis取一批有效的ID,用完后再去redis取,提升性能
2)发号器sdk保证线程安全
3)redis保证ID惟一性