分库分表之后分布式如何保证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

分库分表之后分布式如何保证ID全局唯一性的更多相关文章

  1. 微服务、分库分表、分布式事务管理、APM链路跟踪性能分析演示项目

    好多年没发博,最近有时间整理些东西,分享给大家. 所有内容都在github项目liuzhibin-cn/my-demo中,基于SpringBoot,演示Dubbo微服务 + Mycat, Shardi ...

  2. SpringBoot 使用Sharding-JDBC进行分库分表及其分布式ID的生成

    为解决关系型数据库面对海量数据由于数据量过大而导致的性能问题时,将数据进行分片是行之有效的解决方案,而将集中于单一节点的数据拆分并分别存储到多个数据库或表,称为分库分表. 分库可以有效分散高并发量,分 ...

  3. 数据库分库分表和带来的唯一ID、分页查询问题的解决

    需求缘起(用一个公司的发展作为背景) 1.还是个小公司的时候,注册用户就20w,每天活跃用户1w,每天最大单表数据量就1000,然后高峰期每秒并发请求最多就10,此时一个16核32G的服务器,每秒请求 ...

  4. mysql分库分表那些事

    为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...

  5. 分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

    最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好 ...

  6. MySQL订单分库分表多维度查询

    转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询  MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...

  7. sharding-jdbc之——分库分表实例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/79368021 一.概述 之前,我们介绍了利用Mycat进行分库分表操作,Mycat ...

  8. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    一.前言 在前面的文章Mysql系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个: 1. 分布式全局唯一id 2. 分片规则和策略 3. 跨分片技术问题 4. 跨分片事物 ...

  9. 分布式中的分库分表之后,ID 主键如何处理?

    面试题 分库分表之后,id 主键如何处理?(唯一性,排序等) 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定 ...

随机推荐

  1. systemverilog中奇怪的语法

    1.->运算符 expression_a->expression_b其实等效于(!expression_a || expression_b),systemverilog中利用 || 运算的 ...

  2. JAVA8学习——Stream底层的实现四(学习过程)

    Stream的深入(四) 从更高角度去看一下:类与类之间的设计关系 (借助IDEA的图形处理工具 Ctrl+Alt+U). ReferencePipeline的三个实现的子类: Head Statel ...

  3. docker下安装nginx,启动ngixn,修改nginx配置等--超详细

    1.获取nginx版本 docker中nginx版本信息:https://hub.docker.com/_/nginx?tab=tags&page=1&ordering=last_up ...

  4. 命令行下Git调用IDEA的diff功能

    命令行下git diff, 有人欢喜有人厌, 本文以IDEA diff为例, 介绍如何更换Git的diff工具. IDEA diff IDEA作为一个图形化工具, 其实也提供了极少一部分命令行接口, ...

  5. Docker容器里部署Apache+PHP+MariaDB+phpMyAdmin

    前面讲到了创建MariaDB,这次在前面的基础上搭建phpMyAdmin服务,以便友好的管理数据库MariaDB.MariaDB的docker独立出来,这样方便管理,易于扩展.这次我们基于Docker ...

  6. 无法打开备份设备,出现操作系统错误 5(拒绝访问)(sql server备份)

    问题:无法打开备份设备 .出现操作系统错误 5(拒绝访问) 原因:你用sqlserver进行备份的时候,必须要是完整的路径,操作sqlserver的和磁盘有关的路径都必须要到文件名这一层. 解决方案: ...

  7. 《Symfony 5全面开发》教程03、使用Controller创建第一个页面

    我们使用Phpstorm打开我们的项目目录,展开项目目录文件夹. Symfony项目其实也是composer项目,如果你新拿到一个Symfony项目, 你可以在控制台中使用composer insta ...

  8. MapReduce中一次reduce方法的调用中key的值不断变化

    简单一句话总结就是:ReduceContextImpl类的RawKeyValueIterator input迭代器对象里面存储中着key-value对的元素, 以及一个只存储value的迭代器,然后每 ...

  9. package.xml使用说明

    1. package.xml使用说明 a. pacakge.xml 包含了package的名称. 版本号. 内容描述. 维护人员. 软件许可. 编译构建工具. 编译依赖. 运行依赖等信息. 2. pa ...

  10. c语言刷 DFS题记录

    144. 二叉树的前序遍历 /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeN ...