1.模拟上传一个批次的优惠券
public function upload()
{
$quanId = isset($_GET['quanId']) ? $_GET['quanId'] : '';
$count = isset($_GET['count']) ? $_GET['count'] : '';
if (empty($quanId) || empty($count)) {
return $this->response(-1, '参数不合法');
}
// 模拟一个批次ID,实际上应该走数据库去生成
$batchId = time();
$result = QuanService::upload($quanId, $batchId, $count);
if (empty($result)) {
return $this->response(1, '服务端异常');
}
return $this->response(0, '生成成功', $result);
}
public static function upload($quanId, $batchId, $count)
{
$coupons = [];
// 为批次模拟生成count个券码
for ($i = 0; $i < $count; ++$i) {
$bytes = openssl_random_pseudo_bytes(8);
$coupon = base_convert(bin2hex($bytes), 16, 32);
$coupons[] = $coupon;
}
// 投递券码
$batchSize = QuanModel::uploadBatchToRedis($quanId, $batchId, $coupons);
return ['batchId' => $batchId, 'batchSize' => $batchSize, 'coupons' => $coupons];
}
}
\Redis出现找不到的情况,原因是没有安装php_redis和php_igbinary扩展;
$redisMaster->multi(\Redis::PIPELINE);中的multi参数,默认为multi()表示一次一个,开启事务。如果为PIPELINE则为高效处理,批量处理。zCard:返回有序集 key 的基数。
public static function uploadBatchToRedis($quanId, $batchId, $coupons)
{
$redisMaster = Redis::master('default');
$quanKey = "QUAN_{" . $quanId . "}"; // {quanid} redis hash tags
$batchKey = "BATCH_{" . $quanId . "}_" . $batchId; // {quanid} redis hash tags
//$tran = $redisMaster->multi(2);
$tran = $redisMaster->multi(\Redis::PIPELINE);
// 券码加入集合
foreach ($coupons as $coupon) {
$tran->zAdd($batchKey, 0, $coupon);
}
// 批次加入优惠券
$tran->hSet($quanKey, $batchKey, json_encode(['online' => true]));
$tran->exec();
return $redisMaster->zCard($batchKey);
}
传参quanId为5,count为10;
2.composer reqiure myf/core(需要php版本大于5.6)
3.下载安装lua,因为是基于lua写的。
4.下载安装redis,redis manger。
5.下载安装php_redis扩展,php_igbinary扩展;
网友评论