• 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,显式包含日期时间属性

  • 相关阅读:
    操作系统发展、同步异步阻塞非阻塞、进程
    day27作业
    tcp粘包、解决粘包问题
    基于TCP连接的socket套接字编程
    《python》join、守护进程、锁/信号量/事件、进程队列
    《Python》并发编程
    《Python》网络编程之验证客户端连接的合法性、socketserver模块
    《Python》网络编程之客户端/服务端框架、套接字(socket)初使用
    《Python》网络编程基础
    《Python》re模块补充、异常处理
  • 原文地址:https://www.cnblogs.com/starfish29/p/11492548.html
Copyright © 2020-2023  润新知