位置: 编程技术 - 正文

Mysql全局ID生成方法(mysql自动生成id)

编辑:rootadmin

推荐整理分享Mysql全局ID生成方法(mysql自动生成id),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql自动生成id,mysql id生成器,mysql id生成器,mysql 全局唯一id,mysql设置全局参数,mysql 全局唯一id,mysql设置全局参数,mysql设置全局参数,内容如对您有帮助,希望把文章链接给更多的朋友!

生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标;在单表/数据库数据量过大,更新量不断飙涨时,MySQL DBA往往会对业务系统提出sharding的方案。既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下文将从DBA的角度介绍几种常见的方案。

1、使用CAS思想

什么是CAS协议

Memcached于1.2.4版本新增CAS(Check and Set)协议类同于Java并发的CAS(Compare and Swap)原子操作,处理同一item被多个线程更改过程的并发问题

CAS的基本原理

基本原理非常简单,一言以蔽之,就是“版本号”,每个存储的数据对象,都有一个版本号。

我们可以从下面的例子来理解:

不采用CAS,则有如下的情景:

&#;第一步,A取出数据对象X; &#;第二步,B取出数据对象X; &#;第三步,B修改数据对象X,并将其放入缓存; &#;第四步,A修改数据对象X,并将其放入缓存。

结论:第四步中会产生数据写入冲突。

采用CAS协议,则是如下的情景。

&#;第一步,A取出数据对象X,并获取到CAS-ID1;

&#;第二步,B取出数据对象X,并获取到CAS-ID2;

&#;第三步,B修改数据对象X,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“一致”,就将修改后的带有CAS-ID2的X写入到缓存。

&#;第四步,A修改数据对象Y,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“不一致”,则拒绝写入,返回存储失败。

这样CAS协议就用了“版本号”的思想,解决了冲突问题。(乐观锁概念)

其实这里并不是严格的CAS,而是使用了比较交换原子操作的思想。

生成思路如下:每次生成全局id时,先从sequence表中获取当前的全局最大id。然后在获取的全局id上做加1操作,加1后的值更新到数据库,如加1后的值为,表名是users,数据表结构如下:

sql语句

Mysql全局ID生成方法(mysql自动生成id)

sql语句的 and gid < 是为了保证并发环境下gid的值只增不减。

如果update语句的影响记录条数为0说明,已经有其他进程提前生成了这个值,并写入了数据库。需要重复以上步骤从新生成。

代码实现如下:

2、使用全局锁

在进行并发编程时,一般都会使用锁机制。其实,全局id的生成也是解决并发问题。

生成思路如下:

在使用redis的setnx方法和memcace的add方法时,如果指定的key已经存在,则返回false。利用这个特性,实现全局锁

每次生成全局id前,先检测指定的key是否存在,如果不存在则使用redis的incr方法或者memcache的increment进行加1操作。这两个方法的返回值是加1后的值,如果存在,则程序进入循环等待状态。循环过程中不断检测key是否还存在,如果key不存在就执行上面的操作。

代码如下:

3、redis和db结合

使用redis直接操作内存,可能性能会好些。但是如果redis死掉后,如何处理呢?把以上两种方案结合,提供更好的稳定性。代码如下:

4、Flicker的解决方案

因为mysql本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。一个生成位ID方案具体就是这样的:先创建单独的数据库(eg:ticket),然后创建一个表:

当我们插入记录后,执行SELECT * from Tickets,查询结果就是这样的:

+-------------------+------+| id | stub |+-------------------+------+| | a |+-------------------+------+

在我们的应用端需要做下面这两个操作,在一个事务会话里提交:

这样我们就能拿到不断增长且不重复的ID了。到上面为止,我们只是在单台数据库上生成ID,从高可用角度考虑,接下来就要解决单点故障问题:Flicker启用了两台数据库服务器来生成ID,通过区分auto_increment的起始值和步长来生成奇偶数的ID。

最后,在客户端只需要通过轮询方式取ID就可以了。

&#;优点:充分借助数据库的自增ID机制,提供高可靠性,生成的ID有序。

&#;缺点:占用两个独立的MySQL实例,有些浪费资源,成本较高。

以上内容是小编给大家分享的Mysql全局ID生成方法,希望大家喜欢。

基于MySql的扩展功能生成全局ID 本文利用MySQL的扩展功能REPLACEINTO来生成全局id,REPLACEINTO和INSERT的功能一样,但是当使用REPLACEINTO插入新数据行时,如果新插入的行的主键或唯一键(UNIQUE

MySQL用作备份还原的导入和导出命令用法整理 mysqldump命令行导出数据库:1,进入MySQL目录下的bin文件夹:cdMySQL中到bin文件夹的目录如我输入的命令行:cdC:ProgramFilesMySQLMySQLServer4.1bin2,导出数据库

分享Mysql命令大全 1、连接Mysql格式:mysql-h主机地址-u用户名-p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysqlbin,再键入命令mysql-uroot-p,回车后提

标签: mysql自动生成id

本文链接地址:https://www.jiuchutong.com/biancheng/312425.html 转载请保留说明!

上一篇:简单谈谈MySQL的loose index scan(mysql的基本介绍)

下一篇:基于MySql的扩展功能生成全局ID(mysql 扩展)

  • 地方教育附加税税率多少?
  • 劳务公司劳务工资做什么科目
  • 预付账款在贷方是谁欠谁
  • 简易计征开什么发票
  • 收回公司经营权需要做什么
  • 非正常损失计入哪里
  • 吸收合并的税务处理增值税风险
  • 计提资产减值准备金的纳税调整
  • 公司零星费用报销话术
  • 企业资产净资产
  • 自来水差额征税政策
  • 内部部门汇缴上级财务
  • 周转材料属于什么会计要素
  • 国债利润收入属于收入吗
  • 哪些人可以享受长护险
  • 旧房转让如何缴纳土地增值税
  • 什么发票 既可以抵扣又可以退税
  • 发票代码不是10位,怎么提示输入12位的
  • 直接快递到国外的货物如何收汇?
  • 工资晚发一个月个税怎么申报的
  • 扣收贷款本息
  • 租金税率9%和5
  • 其他应收款押金计提坏账吗
  • 微软产品提示订单失效
  • macqq截图快捷键 保存
  • 在win7中,为什么打开盘符在新窗口中出现?
  • 发票专用章正规位置盖在哪里
  • 车辆哪些费用计税
  • 一次性支付一年租金怎么做账
  • 应付股利属于什么科目
  • php b/s
  • 微信小程序插件有哪些
  • 怎么用html做一个收藏夹
  • 来料加工 增值税
  • 溢价收购股权会计处理案例
  • nginx配置文件格式
  • 经验模态分解和变分模态分解
  • 员工探亲证明怎么写
  • 契税属于哪种说法
  • 实收资本的会计处理
  • 员工出差的费用计入什么科目
  • 织梦cms怎么样
  • druid数据库连接池
  • 免增值税项目可以抵扣吗
  • mongodb视频教程
  • 福利费属于管理费吗
  • 贷款的利息可以不还吗
  • 企业分配的股票股利宣告发放
  • windowsserver2008r2开启远程桌面
  • PostgreSQL 查看数据库,索引,表,表空间大小的示例代码
  • 员工意外伤害保险最多赔多少
  • 处置固定资产亏损,增值税所得税申报不一至情况说明
  • 应付账款的主要舞弊形式
  • 银行承兑个人可以用吗
  • 员工奖励账务处理流程
  • 股票质押式回购交易是什么意思
  • 企业处置子公司
  • 外包加工如何做账
  • 公司支付给实习生的报酬如何税前扣除?
  • 企业收到稳岗补贴需要交企业所得税吗
  • 如何结转生产成本至库存商品
  • 账务调整会计分录
  • 税收分类编码怎么选
  • 如何整理装订记账凭证
  • Linux下安装mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz
  • sql里面时间函数格式
  • win10预览版21277
  • Windows Server 2008使用软件授权管理工具
  • win8.1网络不可用怎么办
  • 安装win8.1一直卡着不动
  • 迅雷看看电脑版 下载
  • win7用户在哪
  • win7 64位旗舰版系统网页字体大小如何修改变动
  • android基于什么操作系统
  • shell eval用法
  • 用python编写
  • NGUI之UIRoot
  • unity导出exe没反应
  • javascript基础教学
  • 江西电子税务局官网app
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设