zoukankan      html  css  js  c++  java
  • DonkeyID---php扩展-64位自增ID生成器

    ##原理

    参考Twitter-Snowflake 算法,扩展了其中的细节。具体组成如下图:

    如图所示,64bits 咱们分成了4个部分。

    1. 毫秒级的时间戳,有42个bit.能够使用139年,从1970年开始计算,能使用到2109年,当然这些是可以扩展的,可以通知指定起始时间来延长这个日期长度。
    2. 自定义节点id,防止多进程运行产生重复id,占位12个bit,能够支持4096个节点。部署的时候可以配置好服务器id;
    3. 进程workerid,占位5bit,能够生成32个进程id。根据pid运算获得。(已经取消)
    4. 进程内毫秒时间自增序号。占位10bit,一毫秒能产生1024个id。也就是说并发1秒能产生1024000个id。

    ###唯一性保证

    100%唯一性保证,根据nodeid的不一样保证多服务器的唯一性,使用共享内存+自旋锁保证单节点多进程的唯一性 同一毫秒内自增变量保证并发的唯一性。

    ###安装DonkeyID扩展

    cd /usr/local/php/include/php/ext
    sudo git clone https://github.com/osgochina/donkeyid.git
    cd /usr/local/php/include/php/ext/donkeyid/donkeyid
    sudo phpize
    sudo ./configure --with-php-config=/usr/local/php/bin/php-config
    sudo make && sudo make install

    配置

    在php.ini 中配置节点id

    [DonkeyId]
    ;0-4095
    donkeyid.node_id=0
    ;0-当前时间戳
    donkeyid.epoch=0

    ####api接口

    • dk_get_next_id()

    获取基于Snowflake算法的id

    • dk_get_next_ids(num,num,time=0)

    获取基于Snowflake算法的id列表.num:id,num:生成id的数量,time:需要生成指定时间的id.$time 默认为0 生成当前时间指定数量的id

    • dk_parse_id($id)

    解析基于Snowflake算法的id元数据,返回值包括:time id生成时间,node_id 节点id,sequence 自增数

    • dk_get_ts_id()

    获取10进制的时间戳类型的id

    • dk_get_ts_ids(num,num,time=0)

    获取10进制的时间戳类型的id列表.num:id,num:生成id的数量,time:需要生成指定时间的id.$time 默认为0 生成当前时间指定数量的id

    • dk_parse_ts_id($tsid)

    解析10进制的时间戳类型的id元数据,返回值包括:time id生成时间,node_id 节点id,sequence 自增数

    • dk_get_dt_id()

    获取字符串类型的id,显式包含日期时间属性

  • 相关阅读:
    解决:IIS APPPOOLDefaultAppPool 登录失败的问题
    C#操作txt文件并清空添加操作
    linux修改yum本地源的方法
    CentOS防火墙开启、关闭与开放指定端口
    CentOS配置SSH远程连接
    判断js对象是否拥有某一个属性的js代码
    bash脚本输入密码不回显问题的解决方法
    js控制表单操作的常用代码小结
    绝版Node--Sequlize搭建服务(Node全栈之路 二)
    绝版Node--Sequlize搭建服务(Node全栈之路)
  • 原文地址:https://www.cnblogs.com/starfish29/p/11492548.html
Copyright © 2011-2022 走看看