参考Twitter-Snowflake 算法,扩展了其中的细节。具体组成如下图:
如图所示,64bits 咱们分成了4个部分。
100%唯一性保证,根据nodeid的不一样保证多服务器的唯一性,使用共享内存+自旋锁保证单节点多进程的唯一性 同一毫秒内自增变量保证并发的唯一性。
下载代码到本地,进入项目文件夹,执行
cd ./donkeyid && /path/to/phpize && ./configure && make && make install
echo "extension=donkeyid.so" >> /path/to/php.ini
DonkeyId 有两种id生成模式:
在php.ini 中配置节点id
[DonkeyId] ;[0,1] donkeyid.type=0 ;0-4095 donkeyid.node_id=0 ;0-当前时间戳 donkeyid.epoch=0
也可以运行时配置,这样会覆盖php.ini中的配置
echo "1--id=".($id1 = dk_get_next_id())."/n"; print_r(dk_parse_id($id1)); echo "/n"; $donkey = new DonkeyId(1); $id2 = $donkey->getNextId(); echo "2--id=".$id2."/n"; print_r($donkey->parseId($id2)); echo "/n";
支持 php5.3+ ,支持php 7
提供http的api接口,方便部署多台机器。
donkeyid_server 有以下启动方式:
帮助信息: Usage: /path/to/php main.php [options] -- [args...] --help 显示帮助信息 -h [--host] ip地址,默认监听127.0.0.1 -p [--port] 端口,默认9521 -pd [--pid] 指定pid文件位置(默认pid文件保存在当前目录) -l [--log] log文件夹的位置 -s start 启动进程 -s stop 停止进程 -d [--daemon] 是否后台运行
启动server以后通过url访问: http://127.0.0.1:9521/getNextid 就能获取到id.
http://127.0.0.1:9521/getNextid/0 //获取默认类型id http://127.0.0.1:9521/getNextid/1 //获取10进制相乘类型id http://127.0.0.1:9521/getIdByTime/{$type}/{$time}/{$num} //$type[0|1],$time 时间戳 ,$num 数量 //批量生成指定时间,指定数量的id。 //type=0 num需要小于512000 type=1 num需小于9999 http://127.0.0.1:9521/parseId/0/$id //解析默认类型ID http://127.0.0.1:9521/parseId/1/$id //解析10进制相乘类型ID 解析的返回值有: { "code":0, //执行状态 0正常,其他失败 "data":{ "time":"1461674906404", //时间戳 "node_id":1, //节点id "sequence":0 //自增值 } }