【Zanuck 镇】编写php高性能snowflake算法插件(分布式64位唯一性自增id生成算法)

本文介绍了在分布式系统中生成唯一自增ID的需求,以及Twitter的Snowflake算法。在PHP环境下,作者探讨了三种解决方案:uniqid()方法(不唯一且慢)、MD5散列(不保证唯一性和自增性),最后选择了用PHP实现Snowflake算法,虽然性能较差,但可以通过编写PHP扩展来优化。
摘要由CSDN通过智能技术生成

snowflake算法是个啥?首先我来提出个问题,怎么在分布式系统中生成唯一性id并保持该id大致自增?在twitter中这是最重要的业务场景,于是twitter推出了一种snowflake算法。参考地址:https://github.com/twitter/snowflake

小镇为什么想要写这么个算法呢,因为开发环境是php并且需要生成唯一性自增id,因为业务逻辑的原因不能通过获取mysql的auto increment主键来获取该值。于是小镇想到了三种解决办法

  • 第一种,使用php官方类库中的uniqid()方法,但是在随后的多进程压力测试中造成了非常多的重复值,这证明了php的uniqid()并不能实现id的唯一性(也很容易理解,根据毫秒生成的id当然不可能唯一而且不可能在分布式中运用,其次生成的是string类型,最重要的一点,速度太慢)
  • 第二种,为了保证唯一性,使用md5算法将当前毫秒值加上随机数值散列出去。但是理论上不能严格保证id的唯一性,其次不能保证大致的自增性。
  • 第三种,使用php原生语言编写snowflake算法。缺点也非常的明显,php 写这种相对来说比较复杂的算法性能太差,在高频使用的情况下线程和进程锁的问题不是特别的乐观。(其实性能问题也不是大问题,因为本身web的瓶颈也在数据库上,但是通过编写php扩展的方式可以将这种问题一劳永逸的解决,何乐而不为呢?)
可以看出以上三种方法都有缺点,在高并发的情况会出现各种各样的问题。于是,小镇在这里使用了C语言编写了snowflake算法并作为了php的插件使用。(给大家提前透露一下,性能非常好)
好了,现在开始,先用C语言实现snowflake算法,用C语言实现非常简单,只要按照snowflake算法的规则来就行了,我摘抄了csdn上一个比较好的算法,地址如下:http://blog.csdn.net/wallwind/article/details/49701397,但是博主没有做注释,但是我看了下,就是单纯的按照规则实现了下,于是小镇决定结合snowflake算法来一句句讲解。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值