资讯专栏INFORMATION COLUMN

php与唯一ID生成的相关事宜

pepperwang / 2740人阅读

摘要:原文地址唯一的生成并不是一件小事想说爱它也并不是像简单来一个这样一件容易的事为什么要唯一数据库的自增在分库的时候会是一场灾难假设分两个库因为每个库都会开始从开始自增届时系统中将会出现两个为的用户自增会暴露用户量或者其他业务量自增会让有心者

[原文地址:https://blog.ti-node.com/blog...]

唯一ID的生成并不是一件小事 , 想说爱它 , 也并不是像简单来一个uniqid()这样一件容易的事 .

为什么要唯一ID ?

1 . 数据库的自增ID在分库的时候 , 会是一场灾难 . 假设分两个库 , 因为每个库都会开始从1开始自增 , 届时 , 系统中将会出现两个id为1的用户 .

2 . 自增id会暴露用户量或者其他业务量 .

3 . 自增id会让有心者通过API得到任意用户的信息资料 .

解决方案呢 ?

1 . UUID , 全称Universally Unique Identifier , 中文通用唯一标识符 . 这个是开放软件基金会组织提出的一个标准 , 为的就是解决分布式环境下生成唯一标识符的问题 . UUID的长度是固定的32位 , 组织格式8-4-4-4-12 , 当然了在用的时候 , 中间的分隔符是要去掉的 . 这个货有几个问题不得不提 , 首先是字母数字混合 , 在一些传统数据库下 , 索引不太好做 , 不仅索引体积大 , 查询效率也差 . 其次是它本身也非常大 .

2 . MongoDB ObjectId , 格式模样都很类似于UUID , 是Mongodb内置的一种数据类型 , 如果你在插入数据的时候不指定_id , 那么Mongodb默认就会采用用这个货才填充_id , 在Mongodb这种类kv性质的数据库中 , 有着不错的查询效率 .

3 . 自建解决方案 , 为了能够解决业务问题 , 很多公司都自己提出一些解决方案 , 这些方案无疑都要做到如下几点 :

保证全局空间唯一性

保证尽量采取数字类型而非数字字母混合方式

保证一定的时序行和含义

保证一定的可反解性 , 通过反解的结果可以知道该ID的相关信息

市面上有的几种解决方案为Twitter的snowflake , Flikr的数据库自增方案 , Instagram的数据库存储过程方案 . 重点说下Twitter的snowflake解决方案原理 .

snowflask使用了64bit来表示一个id , Twitter的工程师们将它分成了4个段 , 每段表示不同的含义 . 如下图 :

前41bit段 , 是时间戳 , 单位会精确到毫秒级 . 所以该bit段可以容纳的时间容量为 2^41 = 2.199x10^12 毫秒 , 也就是 2.199x10^9 秒 . 换算成年 , 就是大概为69.7年 . 也就说 , 从1970年1月1日开始 , 可以使用69.7年 , id产生机器的上限就到了 .

中10bit段 , 是机器ID , 最大可以容纳2^10=1024台机器 . 你可以部署1一台以上的机器 , 给每个机器配置一个与众不同的独立的id号 , 比如从1号开始 , 最多可以部署到1024号机器 . 然后机器集群最前面挡一台nginx之类的服务器做代理 , 就可以完成一个不错的id发号集群了 .

后12bit段 , 是自增序列( 你可以等同为mysql的自增id ) , 它表示的1毫秒内的自增序列 . 也就是说从0毫秒开始一直到1毫秒结束这段时间内自增 . 也就说1毫秒内最多产生2^12=4096个序列 , 也就是说同一台机器上同一毫秒内最多产生4096个序列 , 如果超过了该数字 , 那就等待下一毫秒产生新的id .

TIPS : 顺带提一下 , php的uniqid()函数存在很大的风险 , 它生成的id并不能像它的名字那样做到uniqid , 重复概率略高 . 详情查看该函数的手册页评论 . 点击这里

TIPS : 推荐一个基于snowflake的php id产生器 : donkeyid生成器

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29340.html

相关文章

  • HTTP请求 相关事宜

    摘要:向指定资源提交数据比如提交表单,上传文件,请求服务器进行处理。通过指定资源的唯一标识在服务器上的具体存放位置,请求服务器创建或更新资源。请求中会把和一并发送,但是会先发送浏览器响应之后,再发送。 HTTP请求 HTTP请求由三部分组成: 请求行:包含请求方法、地址和HTTP的协议版本 消息报头:包含一系列的键值对 请求正文(可选):和消息报头之间有一个空行 信息报头中的主要信息有 ...

    andycall 评论0 收藏0
  • python怎么实现自动生成C++代码

      小编写这篇文章,主要目的还是给大家讲一下关于python代码的相关事宜,比如怎么才能够实现自动生产C++代码,这里面还是比较的复杂的,下面小编就给大家贴出具体的代码给大家来看下。  遇到的问题  工作中遇到这么一个事,需要写比较多的C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错;而借用python的代码自动生成,可以轻松搞定;  (类比JAVA中的H...

    89542767 评论0 收藏0
  • JavaScript设计模式

    摘要:依赖于接口的设计模式下面列出的设计模式,尤其依赖接口工厂模式。这些私用的静态成员可以从构造器内部访问,这意味着所有私用函数和特权函数都能访问它们。构造器静态特权方法封装之弊私用方法很难进行单元测试。 1.弱类型语言 在JavaScript中,定义变量时不必声明其类型。但这并不意味着变量没有类型。一个变量可以属于几种类型之一,这取决于其包含的数据。JavaScript中有三种原始类型:...

    mingzhong 评论0 收藏0
  • 智联招聘数据爬取准备(1)-智联招聘搜索列表源码解析

    摘要:网页源码解析智联招聘搜索列表一开始必须要解析智联招聘搜索列表页,从这里更方便实现各种深层级数据抓取。显示不同源码也不同,尽量选列表模式,源码更好解析。 网页源码解析 - 智联招聘搜索列表 一开始必须要解析智联招聘搜索列表页,从这里更方便实现各种深层级数据抓取。网页地址是:http://sou.zhaopin.com/jobs/searchresult.ashx 搜索参数 智联招聘的服务...

    VPointer 评论0 收藏0
  • PHP接入支付宝单笔订单查询接口

    摘要:今天还是继续说说项目今天主要说说支付宝订单查询接口。直接上支付宝订单查询的代码。微信的订单查询与此类似。请求后,程序会向支付宝进行查询。 payment 项目2.0版本 巴西奥运会来了,刚好我又是做体育行业的互联网。哎!这个月又要加班成狗了。最近遇到好多莫名其妙的问题,待我忙完这段,再跟大家分享下。今天还是继续说说 Payment项目今天主要说说支付宝订单查询接口。 接口调用 废话废...

    suxier 评论0 收藏0

发表评论

0条评论

pepperwang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<