FAQ系列 | 用MySQL实现发号器

问题:用MySQL实现发号器功能,确保每次取到的ID号都是唯一的
实现:下面是一个大致的思路,抛个砖,欢迎回帖。
根据号段大小,决定是否分成多个表,每个表事先填充各个不同的号段。
每个应用端取号时,设置事务隔离级别为:REPEATABLE READ,并且采用下面的方式读取数据

SELECT `ID` FROM `ID_RANGE_XX` ORDER BY ID LIMIT 1 FOR UPDATE

在上述情境中,只要选择某个ID号,那么其他终端也在读取该号时,会产生锁等待,而不会发生ID号被重用的情况。
考虑到并发的问题,建议增加分表数量,每次循环或随机从分表中读取数据,降低对单个表的并发请求。

--------------------------------------分割线--------------------------------------

知数堂 (http://zhishuedu.com)培训是由资深MySQL专家叶金荣、吴炳锡联合推出的专业优质培训品牌,主要有MySQL DBA实战优化和Python运维开发课程,是业内最有良心、最有品质的培训课程。

时间: 2024-08-04 06:32:37

FAQ系列 | 用MySQL实现发号器的相关文章

野谈系列之高性能可定制化分布式发号器

刘兵,花名玄靖,开源技术爱好者,高性能Redis中间件NRedis-Proxy作者,目前研究方向为java中间件,微服务等技术. 一.什么是分布式发号器 说起分布式发号器的前生今世,咱们应该感恩这个时代:随着互联网在中国越来越普及化,单机系统或者一个小系统已经无法满足需要,随着用户逐渐增多,数据量越来越大,单个应用或者单个数据库已经无法满足需求,在应用以至于微服务来临,在数据库存储方面分库分表来临,可以解决问题:但是新的问题产生,怎么样做到多个应用可以有唯一主键或者序号,防止数据重复呢?分布式发

redis实现发号器

通过mysql的auto increment自增id值可能会泄漏一些敏感的数据. 例如用户表的user_id是自增的,在url中显示的id值可能就泄露了网站真实的用户数. 下面代码通过php及redis的incrby实现简单的发号器,代码如下: function get_id($type, $server_ip, $server_port, $key) { $init_num = 0; $redis= new Redis(); $redis->connect($server_ip, $serve

发号器的设计

数据库中的每条记录都需要一个ID,即使在分库分表后这个ID需要全局唯一性.因此,分库分表后不能使用Mysql自带的自增ID了.因为不通的库之间的ID可能是一样的. 我们以记录海量的用户信息为例,可能会想到身份证号.电话号码或者email.但是这些信息是会变的.如果用户要修改这些信息,那么ID就失效了.无异于新增一条记录,删掉原来的记录. 基于 Snowflake 算法搭建发号器 雪花算法可以提供全局唯一的ID.雪花算法生成的ID一般是分几段的,下图就是典型的ID组成:41位时间戳(一般是毫秒级?

关于snowflake发号器算法简单学习

概述 在分布式系统中,有一些需要使用全局唯一的ID编号,最常使用的方法是在每个系统间传递和保存一个统一唯一流水号,通过系统间两辆核对或者第三方核对唯一流水号来保证各个系统之间步伐一致,没有掉队的行为,也就是系统间状态一致,在互联网的世界里,产生唯一流水号的服务系统俗称发号器. 当前业务系统的ID使用数据库的自增字段,自增字段完全依赖于数据库,这在数据库移植,扩容,洗数据,分库分表等操作时带来了很多麻烦. 在数据库分库分表时,有一种办法是通过调整自增字段或者数据库sequence的步长来达到跨数据

分布式——分布式发号器

今天停电,所以springboot源码看不了,手头刚好有本书,学习了下分布式发号器 一.方案 1.UUID 2.数据库自增序列 3.Snowflake——雪花算法 二.自定义设计需求与实现 原文地址:https://www.cnblogs.com/wqff-biubiu/p/12578508.html

lua学习笔记之-----5行代码完成ID发号器

版权归作者所有,任何形式转载请联系作者. --生成ID的位数比较合理长度为52个bit,然后可以时间上有序的,包含项目和实例信息 -- 在redis客户端执行: redis-cli -h 127.0.0.1 -p 6379 EVAL "$(cat ticketID.lua)" 2 01 02-- EVAL 后面的参数解释 "$(cat ticketID.lua)"是我们执行的lua脚本文件,-- "2"是代表传入lua脚本的参数有两个KEY,--

[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键 http://imysql.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml 我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子节点(leaf pages of the tree):

9Python全站之路系列之MySQL SL注入

Python全栈之路系列之MySQL SQL注入 SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,比如将恶意的SQL代码注入到特定字段用于实施拖库攻击等. SQL注入的成功必须借助应用程序的安全漏洞,例如用户输入没有经过正确地过滤(针对某些特定字符串)或者没有特别强调类型的时候,都容易造成异常地执行SQL语句. SQL注入是网站渗透中最常用的攻击技术,但是其实SQL注入可以用来攻击所有的SQL数据库. SQL注入的实现 创建SQLdb数据库 CREATE DATABASE SQL

(android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇

从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据碰到的知识点和问题,并且罗列出这些东西的知识点和使用方法.如果你单纯的把做好的一个DEMO拿去改改用用,那样,你永远不知道里面用到的内容是涉及到什么知识点,用什么方法实现,那样就没有多少提升价值而言了. 近期都是在通过开发文档把以前的一些东西重新过一遍,看好多网友都催促想要新版本的,那我就在这里先把