分库分表之后分布式如何保证ID全局唯一性

韩师学子--小倪 2018-07-21 23:35:38 8139 收藏 3
分类专栏: Mysql
版权
                         分库分表之后分布式如何保证ID全局唯一性
分库分表:
跨库的问题
分布式事务问题
查询数据结果集合并
全局性唯一性ID保证
要求:
1.全局唯一性:不能出现重复的Id号(基本的要求)
2.信息安全:防止恶意用户规矩id的规则来获取数据
3.数据递增:保证我下一个ID一定大于上一个ID.
当前201709122030 下一个;201709122031
互斥关系:信息安全、数据递增规律
CREATE TABLE 'tl_id' {
     'id' varchar(255) NOT NULL,
     PRIMARY KEY('id')
}ENGINE=InnoDB DEFAULT CHARSET=utf8;

业界方案:
UUID:通过唯一识别码16个字节128位的长数字。
组成部分:当前日期和时间序列+全局的唯一性网卡mac地址
优点:代码实现简单、不占用宽带、数据迁移不受影响
缺点:无序、无法保证趋势递增(要求3)字符存储、传输、查询慢、不可读

Snowflake雪花算法
 国外的twitter分布式下ID生成算法
1bit+41bit+10bit+10+bit=62bit
高位随机+毫秒数+机器码(数据中心+机器id)+10的流水好
国内:
保证数据的唯一性就行了IDC机房
优点:代码实现简单、不占用宽带、数据迁移不受影响、低位趋势递增
缺点:强以来时钟(多台服务器时间一定要一样)、无序无法保证趋势递增(要求3)

mysql方案

奇数跟我们偶数 递增步长2
适合小型互联网公司、比如可以知道我们一定生成的ID数量   五万的订单量(预定义)
一年1千8百万
Mysql 一张表500万
如果公司每天订单量5万的数据 我们用mysql设置步长位100的话可以用27年,只能为100库,公司来到风投了,每天的订单量50万100万的时候
优点:代码实现方便、性能不错、数字排序、可读性很强
缺点:受限数据库、扩展麻烦、插入数据库才能拿到ID、单点故障的问题
主从同步的时候:电商下单->支付insert master db select数据 ,因为数据同步延迟导致差不到这个数据。加cache(不是最好的解决方式)数据要求比较严谨的话查master主库。
CREATE TABLE 'tl_num' (
     'id' bigint(11) NOT NULL AUTO_INCREMENT,
     KEY('id') USING BTREE
)ENGINE=InnoDB auto_increment= 1 DEFAULT CHARSET = utf8;

Redis:
缩减版本、有关业务代码没有包含到里头、redis方案
优点:不依赖数据、灵活方便、性能优于数据库的、没有单点故障(高可用)
缺点:需要占用网络资源、性能要比本地生成慢、需要增加插件

@Autowired
JedisPool jedisPool;
public String getOrderIDPrefix(Date date){
Calendar c =Calendar.getInstance();
c.setTime(date);
int year = c.get(Calendar.YEAR);
int day = c.get(Calendar.DAY_OF_YEAR); //从今天属于今年的第多少天?365 2位 3位 267 001
int hout = c.get(Calendar.HOUR_OF_DAY);
String dayFmt = String.format("%1$03d", day);
String hourFmt = String.format("%1$02d", hour);
return (year - 2000) + dayFmt + hourFmt;
}
public Long orderId(String prefix){
Jedis jedis = jedisPool.getResource();
String key = "tl_order_id" + prefix;
String orderId = null;
try {
Long index = jedis.incr(key); //00001
orderId = prefix + String>format("%1$05d", index);
}catch(Exception e){
System.out.println("生成订单号异常");

}finally {
if(null != jedis){
jedis.close();
}
}
return Long.valueOf(orderId);
}
 
————————————————
版权声明:本文为CSDN博主「韩师学子--小倪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xiao__jia__jia/article/details/81150112

最新文章

  1. apache rewrite_mod 经典疑问解答
  2. Webix JavaScript UI 库可以帮你构建跨平台的HTML5 和 CSS3 程序
  3. Tableau(数据抽取)
  4. 【小姿势】如何搭建ipa下载web服务器(直接在手机打开浏览器安装)
  5. linux与linux,linux与windows之间用SSH传输文件
  6. bzoj2757
  7. Event Managers
  8. Python之路:Python 基础(三)-文件操作
  9. C++函数后面的throw()
  10. Spring Boot 系列教程6-全局异常处理
  11. RunLoop想入门,看这篇就够了
  12. 使用DWR实现自动补全 类似百度搜索框的自动显示效果
  13. UML用例关系一览
  14. object标签和embed标签
  15. window.onbeforeunload() 事件调用ajax
  16. 索引快速扫描(index fast full scan)
  17. ubuntu12.04上的mongodb卸载
  18. Swift3 获取版本号,比较版本大小
  19. Django快速搭建博客系统
  20. 201621123006 《Java程序设计》第7周学习总结

热门文章

  1. php使用CURL实现GET和POST方式请求
  2. Linux性能优化概述
  3. CPU、进程、线程原理
  4. 【axios三部曲】一、使用axios
  5. RHEL6搭建网络yum源仓库
  6. 【C# .Net GC】清除非托管类型(Finalize终结器、dispose模式以及safeHandler)
  7. WPF中使用MVVM进行multibinding
  8. Oracle分析函数/排名函数/位移函数/同比环比
  9. syntax error: unexpected end of file完美解决方案
  10. Python:pandas(二)——pandas函数