php id 生产器,Laravel 分布式唯一 ID 生成器运用_PHP开发框架教程
在运用程序中,常常须要全局唯一的ID作为数据库主键。怎样生成全局唯一ID?
起首,须要肯定全局唯一ID是整型照样字符串?假如是字符串,那末现有的UUID就完整满足需求,不须要分外的事情。瑕玷是字符串作为ID占用空间大,索引效力比整型低。
假如采纳整型作为ID,那末起首排撤除32位int范例,因为局限太小,必需运用64位long型。
采纳整型作为ID时,怎样生成自增、全局唯一且不反复的ID?
计划一:运用数据库的自增ID,从1入手下手,基础能够做到一连递增。Oracle能够用SEQUENCE,MySQL能够用主键的AUTO_INCREMENT,虽然不能保证全局唯一,但每一个表唯一,也基础满足需求。
数据库自增ID的瑕玷是数据在插进去前,没法取得ID。数据在插进去后,猎取的ID虽然是唯一的,但一定要比及事件提交后,ID才算是有用的。有些双向援用的数据,不能不插进去后再做一次更新,比较贫苦。
第二种体式格局是采纳一个集中式ID生成器,它能够是Redis,也能够是ZooKeeper,也能够运用数据库的表纪录末了分派的ID。
这类体式格局最大的瑕玷是庞杂性太高,须要严峻依靠第三方效劳,而且代码设置烦琐。一般来讲,越是庞杂的计划,越不牢靠,而且测试越痛楚。
第三种体式格局是相似Twitter的Snowflake算法,它给每台机械分派一个唯一标识,然后经由过程时候戳+标识+自增完成全局唯一ID。这类体式格局优点在于ID生成算法完整是一个无状态机,无收集挪用,高效牢靠。瑕玷是假如唯一标识有反复,会形成ID争执。
Snowflake算法采纳41bit毫秒时候戳,加上10bit机械ID,加上12bit序列号,理论上最多支撑1024台机械每秒生成4096000个序列号,关于Twitter的范围来讲够用了。
然则关于绝大部分一般运用程序来讲,基础不须要每秒凌驾400万的ID,机械数目也达不到1024台,所以,我们能够革新一下,运用更短的ID生成体式格局:
53bitID由32bit秒级时候戳+16bit自增+5bit机械标识构成,积累32台机械,每秒能够生成6.5万个序列号,中心代码:
private static synchronized long nextId(long epochSecond) {
if (epochSecond < lastEpoch) {
// warning: clock is turn back:
logger.warn("clock is back: " + epochSecond + " from previous:" + lastEpoch);
epochSecond = lastEpoch;
}
if (lastEpoch != epochSecond) {
lastEpoch = epochSecond;
reset();
}
offset++;
long next = offset & MAX_NEXT;
if (next == 0) {
logger.warn("maximum id reached in 1 second in epoch: " + epochSecond);
return nextId(epochSecond + 1);
}
return generateId(epochSecond, next, SHARD_ID);}
时候戳减去一个固定值,此计划最高可支撑到2106年。
假如每秒6.5万个序列号不够怎么办?没紧要,能够继承递增时候戳,向前“借”下一秒的6.5万个序列号。
同时还处置惩罚了时候回拨的问题。
机械标识采纳简朴的主机名计划,只需主机名相符host-1,host-2就能够自动提取机械标识,无需设置。
末了,为何采纳最多53位整型,而不是64位整型?这是因为考虑到大部分运用程序是Web运用,假如要和JavaScript打交道,因为JavaScript支撑的最大整型就是53位,凌驾这个位数,JavaScript将丧失精度。因而,运用53位整数能够直接由JavaScript读取,而凌驾53位时,就必需转换成字符串才保证JavaScript处置惩罚准确,这会给API接口带来分外的庞杂度。这也是为何新浪微博的API接口会同时返回id和idstr的缘由。
引荐教程:《PHP》《Laravel教程》
以上就是Laravel 分布式唯一 ID 生成器运用的细致内容,更多请关注ki4网别的相干文章!
收藏 | 0
php id 生产器,Laravel 分布式唯一 ID 生成器运用_PHP开发框架教程相关推荐
- 分布式唯一ID生成企业级方案(含时钟回拨生产级解决)
目录 分布式唯一ID要求 常见的几种方案 一. 数据库自增主键 二. UUID 三. SnowFlow算法 四. Redis自增机制 五. flickr 雅虎公司方案 六. flickr方案的高并发优 ...
- idgenerator 会重复吗_终极版:分布式唯一ID的几种生成方案
在业务开发中,大量场景需要唯一ID来进行标识:用户需要唯一身份标识.商品需要唯一标识.消息需要唯一标识.事件需要唯一标识等,都需要全局唯一ID,尤其是复杂的分布式业务场景中全局唯一ID更为重要. 那么 ...
- 分享大厂分布式唯一ID设计方案,快来围观
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:终于放弃了单调的swagger-ui了,选择了这款神器-knife4j个人原创+1博客:点击前往,查看更多 作者 ...
- java生成唯一有序序列号_分布式唯一 ID 之 Snowflake 算法
SegmentFault 社区专栏:全栈修仙之路作者:semlinker No.1 Snowflake 简介 1.1 什么是 Snowflake Snowflake is a service used ...
- Redis之String应用场景与SpringCache--存储对象信息、分布式唯一ID、文章阅读量、Lua脚本
String应用场景 一.存储对象信息 代码 重写Redis序列 解决方式 剖析SpringCache常用注解 @CacheConfig @Cacheable @CachePut @CacheEvic ...
- 分布式唯一id:snowflake算法思考
匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...
- snowflake算法 php,PHP实现Snowflake生成分布式唯一ID的方法示例
前言 Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少.使用 snowflake 生成 UUID 很多都是在 ...
- asp按时间自动递增编号_Java秒杀系统实战系列-分布式唯一ID生成订单编号
本文是"Java秒杀系统实战系列文章"的第七篇,在本文中我们将重点介绍 "在高并发,如秒杀的业务场景下如何生成全局唯一.趋势递增的订单编号",我们将介绍两种方法 ...
- 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题
转载自 百度开源的分布式唯一ID生成器UidGenerator,解决了时钟回拨问题 UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器.而且,它非常适 ...
最新文章
- 安装Oracle Database 11g 找不到文件“WFMLRSVCApp.ear” .
- OSChina 娱乐弹弹弹——Team,对你爱爱爱不完
- Android将数据库数据导出成excel格式的文本(CSV)
- 英国电信云服务直连Salesforce
- python爬虫反爬机制_Python Scrapy突破反爬虫机制(项目实践)
- 基于JAVA+SpringMVC+Mybatis+MYSQL的共享单车管理系统
- Python多线程编程中daemon属性的作用
- MMU页表的内存消耗
- 计算机中缺失freeimage.dll,修复freeimage.dll
- 转:组态软件测评∣WinCC、Citect、LabVIEW、InTouch、Ingnition,你更喜欢用哪个?
- 【51单片机】通过定时器中断 在8位数码管显示时间
- java 图片处理之寸照背景色替换
- 学会这几个可视化布局思路,轻松做出企业级可视化大屏
- 为Dragonfly配置私有仓库
- 一文读懂云计算、大数据、人工智能
- Ardunio开发:esp32—cam摄像头
- 解决服务器网卡不识别问题
- 自兴人工智能——Python第二课(列表和元组)
- 有梦想,就去追,不犹豫,不后悔
- 计算机为啥启用不了网络发现,win7系统“网络发现”功能启用不了的解决方法...