秒杀订单需要提前生成订单号时,可以使用雪花id来作为订单号;
如果对订单号有要求,可以使用alpha_id,自定义数据的长度;然后自己进行拼接其他的数字长度【自定义拼接】
至于uuid:目前还没有需求- 一般用于软件注册码之类的
基于thinkphp的容器方式返回数据:里面的app('api_result')是接口的统一处理返回值类app('api_log')是日志类 app('alarm') 是邮件通知类 ,所以请参考方式即可
<?php
/*
* @Description: 生成唯一ID
* 雪花算法是由 1 + 41 + 5 + 5 + 12 = 64 位二进制组成的,最终将这些二进制转化为 10 进制得到雪花 ID
* 第一个 bit 为未使用的符号位。
* 第二部分由 41 位的时间戳(毫秒)构成,他的取值是当前时间相对于某一时间的偏移量。
* 第三部分和第四部分的 5 个 bit 位表示数据中心和机器ID,其能表示的最大值为 2^5 -1 = 31。
* 最后部分由 12 个 bit 组成,其表示每个工作节点每毫秒生成的序列号 ID,同一毫秒内最多可生成 2^12 -1 即 4095 个 ID。
* @ComposerRequire: 雪花算法:composer require godruoyi/php-snowflake
* UUID:composer require ramsey/uuid 3.9.3
* UUID依赖包:composer require paragonie/random_compat 2.0.9
* UUID依赖包:composer require symfony/polyfill-ctype 1.19.0
* @ComposerRemove: 雪花算法:composer remove godruoyi/php-snowflake
* UUID:composer remove ramsey/uuid >> composer remove paragonie/random_compat >> composer remove symfony/polyfill-ctype
* @Author: 阿海 <764882431@qq.com>
* @Date: 2021-02-01 17:10:06
* @LastEditTime: 2021-02-22 11:50:03
* @LastEditors: 阿海
*/
namespace app\common\library;
use Godruoyi\Snowflake\Snowflake;
use Ramsey\Uuid\Uuid;
// use think\Exception;
class Uniqid {
/**
* 雪花算法 取值0:则随机(1,31)
* 数据中心 取值范围1-31 最大值为:2^5-1=31
*/
private $datacenterId = 1;
/**
* 雪花算法 取值0:则随机(1,31)
* 机器id 取值范围1-31 最大值为:2^5-1=31
*/
private $workerId = 1;
/**
* 雪花算法 === 41 个 1 组成的二进制转为 10 进制得到时间差的毫秒数,转化为 年 为 69年
* 41 位的二进制长度最多能表示 2^41 -1 毫秒即69 年,所以雪花算法最多能正常使用 69年,为了能最大限度的使用该算法,应该为其指定一个开始时间
*/
private $startTime = 1614049994*1000; //2021-01-30的时间戳*1000毫秒
public function __construct($config=[])
{
$this->datacenterId = isset($config['datacenterId'])?(int)$config['datacenterId']:$this->datacenterId;
$this->workerId = isset($config['workerId'])?(int)$config['workerId']:$this->workerId;
$this->startTime = isset($config['startTime'])?(int)$config['startTime']:$this->startTime;
}
/**
* @param int $number 新创建雪花id的个数
* @param array $data 已经存在的id数组
* 雪花算法
* 时钟错乱:基于redis
* ==》 验证当前系统(eg:生成一个lock文件) 是否注册过机器id
* ==》(没有则注册机器id)校验系统当前时间是否大于上次上报的时间(失败时启动失败报警)
* ==》 如果是分布式系统,则校验各个系统时间,取平均值校验(失败时启动失败报警)
* ==》 周期性