mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-10-29 22:10:49 +00:00
数据库锁,缓存处理
This commit is contained in:
parent
2745406886
commit
579324aab0
@ -65,18 +65,8 @@ class StoreIntegralOrderController
|
||||
|
||||
$num = (int)$num;
|
||||
//判断积分商品限量
|
||||
$unique = $storeIntegralServices->checkoutProductStock($uid, $productInfo['product_id'], $num, $unique);
|
||||
try {
|
||||
//弹出队列
|
||||
if (!CacheService::popStock($unique, $num, 4)) {
|
||||
return app('json')->fail(410296);
|
||||
}
|
||||
$order = $this->services->createOrder($uid, $addressId, $mark, $request->user()->toArray(), $num, $productInfo);
|
||||
} catch (\Throwable $e) {
|
||||
//生成失败归还库存
|
||||
CacheService::setStock($unique, $num, 4, false);
|
||||
return app('json')->fail($e->getMessage());
|
||||
}
|
||||
$storeIntegralServices->checkoutProductStock($uid, $productInfo['product_id'], $num, $unique);
|
||||
$order = $this->services->createOrder($uid, $addressId, $mark, $request->user()->toArray(), $num, $productInfo);
|
||||
return app('json')->status('success', 410203, ['orderId' => $order['order_id']]);
|
||||
}
|
||||
|
||||
|
||||
@ -65,13 +65,6 @@ class UnpaidOrderCancelJob extends BaseJobs
|
||||
$orderInfo->is_del = 1;
|
||||
$orderInfo->mark = '订单未支付已超过系统预设时间';
|
||||
$orderInfo->save();
|
||||
try {
|
||||
/** @var StoreSeckillServices $seckiiServices */
|
||||
$seckiiServices = app()->make(StoreSeckillServices::class);
|
||||
$seckiiServices->cancelOccupySeckillStock($cartInfo, $orderInfo['unique']);
|
||||
$seckiiServices->rollBackStock($cartInfo);
|
||||
} catch (\Throwable $e) {
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
} catch (\Throwable $e) {
|
||||
|
||||
@ -46,14 +46,6 @@ class OrderPaySuccessListener implements ListenerInterface
|
||||
'change_time' => time()
|
||||
]);
|
||||
|
||||
//回退秒杀库存占用
|
||||
/** @var StoreOrderCartInfoServices $cartServices */
|
||||
$cartServices = app()->make(StoreOrderCartInfoServices::class);
|
||||
$cartInfo = $cartServices->getOrderCartInfo($orderInfo['id']);
|
||||
/** @var StoreSeckillServices $seckiiServices */
|
||||
$seckiiServices = app()->make(StoreSeckillServices::class);
|
||||
$seckiiServices->cancelOccupySeckillStock($cartInfo, $orderInfo['unique']);
|
||||
|
||||
//赠送购买商品优惠券
|
||||
/** @var StoreProductCouponServices $storeProductCouponServices */
|
||||
$storeProductCouponServices = app()->make(StoreProductCouponServices::class);
|
||||
|
||||
@ -115,13 +115,6 @@ class StoreAdvanceServices extends BaseServices
|
||||
$valueGroup = $storeProductAttrServices->saveProductAttr($skuList, (int)$res->id, 6);
|
||||
if (!$res) throw new AdminException(100022);
|
||||
}
|
||||
$res = true;
|
||||
foreach ($valueGroup->toArray() as $item) {
|
||||
$res = $res && CacheService::setStock($item['unique'], (int)$item['quota_show'], 6);
|
||||
}
|
||||
if (!$res) {
|
||||
throw new AdminException(400092);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -171,13 +171,6 @@ class StoreBargainServices extends BaseServices
|
||||
$valueGroup = $storeProductAttrServices->saveProductAttr($skuList, (int)$res->id, 2);
|
||||
if (!$res) throw new AdminException(100022);
|
||||
}
|
||||
$res = true;
|
||||
foreach ($valueGroup->toArray() as $item) {
|
||||
$res = $res && CacheService::setStock($item['unique'], (int)$item['quota_show'], 2);
|
||||
}
|
||||
if (!$res) {
|
||||
throw new AdminException(400092);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -118,13 +118,6 @@ class StoreCombinationServices extends BaseServices
|
||||
$valueGroup = $storeProductAttrServices->saveProductAttr($skuList, (int)$res->id, 3);
|
||||
if (!$res) throw new AdminException(100022);
|
||||
}
|
||||
$res = true;
|
||||
foreach ($valueGroup->toArray() as $item) {
|
||||
$res = $res && CacheService::setStock($item['unique'], (int)$item['quota_show'], 3);
|
||||
}
|
||||
if (!$res) {
|
||||
throw new AdminException(400092);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -131,9 +131,6 @@ class StorePinkServices extends BaseServices
|
||||
} else if ($countY) {//团员
|
||||
$res = $this->dao->update($countY['id'], ['stop_time' => time() - 1, 'k_id' => 0, 'is_refund' => $id, 'status' => 3]);
|
||||
}
|
||||
if ($res) {
|
||||
CacheService::setStock(md5((string)$id), 1, 3, false);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
@ -478,9 +475,6 @@ class StorePinkServices extends BaseServices
|
||||
$pink['id'] = $res1['id'];
|
||||
}
|
||||
|
||||
$number = (int)bcsub((string)$pink['people'], '1', 0);
|
||||
if ($number) CacheService::setStock(md5($pink['id']), $number, 3);
|
||||
|
||||
PinkJob::dispatchSecs((int)(($product->effective_time * 3600) + 60), [$pink['id']]);
|
||||
// 开团成功发送模板消息
|
||||
event('NoticeListener', [['orderInfo' => $orderInfo, 'title' => $product['title'], 'pink' => $pink], 'open_pink_success']);
|
||||
|
||||
@ -87,7 +87,7 @@ class StoreIntegralServices extends BaseServices
|
||||
$res = $this->dao->update($id, $data);
|
||||
$storeDescriptionServices->saveDescription((int)$id, $description, 4);
|
||||
$skuList = $storeProductServices->validateProductAttr($items, $detail, (int)$id, 4);
|
||||
$valueGroup = $storeProductAttrServices->saveProductAttr($skuList, (int)$id, 4);
|
||||
$storeProductAttrServices->saveProductAttr($skuList, (int)$id, 4);
|
||||
if (!$res) throw new AdminException(100007);
|
||||
} else {
|
||||
if (!$storeProductServices->getOne(['is_show' => 1, 'is_del' => 0, 'id' => $data['product_id']])) {
|
||||
@ -97,16 +97,9 @@ class StoreIntegralServices extends BaseServices
|
||||
$res = $this->dao->save($data);
|
||||
$storeDescriptionServices->saveDescription((int)$res->id, $description, 4);
|
||||
$skuList = $storeProductServices->validateProductAttr($items, $detail, (int)$res->id, 4);
|
||||
$valueGroup = $storeProductAttrServices->saveProductAttr($skuList, (int)$res->id, 4);
|
||||
$storeProductAttrServices->saveProductAttr($skuList, (int)$res->id, 4);
|
||||
if (!$res) throw new AdminException(100022);
|
||||
}
|
||||
$res = true;
|
||||
foreach ($valueGroup->toArray() as $item) {
|
||||
$res = $res && CacheService::setStock($item['unique'], (int)$item['quota_show'], 4);
|
||||
}
|
||||
if (!$res) {
|
||||
throw new AdminException(400092);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -393,9 +386,6 @@ class StoreIntegralServices extends BaseServices
|
||||
if ($product_stock < $num) {
|
||||
throw new ApiException(410297, ['num' => $num]);
|
||||
}
|
||||
if (!CacheService::checkStock($unique, $num, 4)) {
|
||||
throw new ApiException(410297, ['num' => $num]);
|
||||
}
|
||||
return $unique;
|
||||
}
|
||||
|
||||
|
||||
@ -190,13 +190,6 @@ class StoreSeckillServices extends BaseServices
|
||||
$valueGroup = $storeProductAttrServices->saveProductAttr($skuList, (int)$res->id, 1);
|
||||
if (!$res) throw new AdminException(100022);
|
||||
}
|
||||
$res = true;
|
||||
foreach ($valueGroup->toArray() as $item) {
|
||||
$res = $res && CacheService::setStock($item['unique'], (int)$item['quota_show'], 1);
|
||||
}
|
||||
if (!$res) {
|
||||
throw new AdminException(400092);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -602,33 +595,18 @@ class StoreSeckillServices extends BaseServices
|
||||
}
|
||||
|
||||
/**
|
||||
* 秒杀库存添加入redis的队列中
|
||||
* @param string $unique sku唯一值
|
||||
* @param int $type 类型
|
||||
* @param int $number 库存个数
|
||||
* @param bool $isPush 是否放入之前删除当前队列
|
||||
* @return bool|int
|
||||
*/
|
||||
public function pushSeckillStock(string $unique, int $type, int $number, bool $isPush = false)
|
||||
{
|
||||
$name = 'seckill_' . $unique . '_' . $type;
|
||||
/** @var CacheService $cache */
|
||||
$cache = app()->make(CacheService::class);
|
||||
$res = true;
|
||||
if (!$isPush) {
|
||||
$cache->delete($name);
|
||||
}
|
||||
for ($i = 1; $i <= $number; $i++) {
|
||||
$res = $res && $cache->lPush($name, $i);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $productId
|
||||
* @param string $unique
|
||||
* 检查秒杀库存
|
||||
* @param int $uid
|
||||
* @param int $seckillId
|
||||
* @param int $cartNum
|
||||
* @param string $value
|
||||
* @param string $unique
|
||||
* @return array
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/03/01
|
||||
*/
|
||||
public function checkSeckillStock(int $uid, int $seckillId, int $cartNum = 1, string $unique = '')
|
||||
{
|
||||
@ -661,139 +639,18 @@ class StoreSeckillServices extends BaseServices
|
||||
return [$attrInfo, $unique, $StoreSeckillinfo];
|
||||
}
|
||||
|
||||
/**
|
||||
* 弹出redis队列中的库存条数
|
||||
* @param string $unique
|
||||
* @param int $type
|
||||
* @return mixed
|
||||
*/
|
||||
public function popSeckillStock(string $unique, int $type, int $number = 1)
|
||||
{
|
||||
$name = 'seckill_' . $unique . '_' . $type;
|
||||
/** @var CacheService $cache */
|
||||
$cache = app()->make(CacheService::class);
|
||||
if ($number > $cache->lLen($name)) {
|
||||
return false;
|
||||
}
|
||||
$res = true;
|
||||
for ($i = 1; $i <= $number; $i++) {
|
||||
$res = $res && $cache->lPop($name);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有库存
|
||||
* @param string $unique
|
||||
* @param int $type
|
||||
* @return mixed
|
||||
* @throws \Psr\SimpleCache\InvalidArgumentException
|
||||
*/
|
||||
public function isSeckillStock(string $unique, int $type, int $number)
|
||||
{
|
||||
/** @var CacheService $cache */
|
||||
$cache = app()->make(CacheService::class);
|
||||
return $cache->lLen('seckill_' . $unique . '_' . $type) >= $number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 回滚库存
|
||||
* @param array $cartInfo
|
||||
* @param int $number
|
||||
* @return bool
|
||||
*/
|
||||
public function rollBackStock(array $cartInfo)
|
||||
{
|
||||
$res = true;
|
||||
foreach ($cartInfo as $item) {
|
||||
$value = $item['cart_info'];
|
||||
if ($value['seckill_id']) {
|
||||
$res = $res && $this->pushSeckillStock($value['product_attr_unique'], 1, (int)$value['cart_num'], true);
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 占用库存
|
||||
* @param $cartInfo
|
||||
*/
|
||||
public function occupySeckillStock($cartInfo, $key, $time = 0)
|
||||
{
|
||||
//占用库存
|
||||
if ($cartInfo) {
|
||||
if (!$time) {
|
||||
$time = time() + 600;
|
||||
}
|
||||
foreach ($cartInfo as $val) {
|
||||
if ($val['seckill_id']) {
|
||||
$this->setSeckillStock($val['product_id'], $val['product_attr_unique'], $time, $key, (int)$val['cart_num']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消秒杀占用的库存
|
||||
* @param array $cartInfo
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function cancelOccupySeckillStock(array $cartInfo, string $key)
|
||||
{
|
||||
if ($cartInfo) {
|
||||
foreach ($cartInfo as $val) {
|
||||
if (isset($val['seckill_id']) && $val['seckill_id']) {
|
||||
$this->backSeckillStock((int)$val['product_id'], $val['product_attr_unique'], $key, (int)$val['cart_num']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 存入当前秒杀商品属性有序集合
|
||||
* @param $product_id
|
||||
* @param $unique
|
||||
* @param $score
|
||||
* @param $value
|
||||
* @param int $cart_num
|
||||
* @return bool
|
||||
*/
|
||||
public function setSeckillStock($product_id, $unique, $score, $value, $cart_num = 1)
|
||||
{
|
||||
$set_key = md5('seckill_set_attr_stock_' . $product_id . '_' . $unique);
|
||||
$i = 0;
|
||||
for ($i; $i < $cart_num; $i++) {
|
||||
CacheService::zAdd($set_key, $score, $value . $i);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消集合中的秒杀商品
|
||||
* @param int $product_id
|
||||
* @param string $unique
|
||||
* @param $value
|
||||
* @param int $cart_num
|
||||
* @return bool
|
||||
*/
|
||||
public function backSeckillStock(int $product_id, string $unique, $value, int $cart_num = 1)
|
||||
{
|
||||
$set_key = md5('seckill_set_attr_stock_' . $product_id . '_' . $unique);
|
||||
$i = 0;
|
||||
for ($i; $i < $cart_num; $i++) {
|
||||
CacheService::zRem($set_key, $value . $i);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改秒杀库存
|
||||
* @param int $num
|
||||
* @param int $seckillId
|
||||
* @param string $unique
|
||||
* @return bool
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/03/01
|
||||
*/
|
||||
public function decSeckillStock(int $num, int $seckillId, string $unique = '')
|
||||
{
|
||||
|
||||
@ -208,9 +208,6 @@ class StoreCartServices extends BaseServices
|
||||
if ($product_stock < $cartNum) {
|
||||
throw new ApiException(410297, ['num' => $cartNum]);
|
||||
}
|
||||
if ($type != 5 && !CacheService::checkStock($unique, (int)$cartNum, $type)) {
|
||||
throw new ApiException(410297, ['num' => $cartNum]);
|
||||
}
|
||||
}
|
||||
return [$attrInfo, $unique, $bargainUserInfo['bargain_price_min'] ?? 0, $cartNum, $productInfo];
|
||||
}
|
||||
|
||||
@ -167,9 +167,6 @@ class StoreOrderCreateServices extends BaseServices
|
||||
throw new ApiStatusException('ORDER_EXIST', 410210, ['orderId' => $storeOrderServices->getStoreIdPink($pinkId, $uid)]);
|
||||
if ($storeOrderServices->getIsOrderPink($pinkId, $uid))
|
||||
throw new ApiStatusException('ORDER_EXIST', 410211, ['orderId' => $storeOrderServices->getStoreIdPink($pinkId, $uid)]);
|
||||
if (!CacheService::checkStock(md5($pinkId), 1, 3) || !CacheService::popStock(md5($pinkId), 1, 3)) {
|
||||
throw new ApiException(410212);
|
||||
}
|
||||
}
|
||||
$virtual_type = $cartGroup['cartInfo'][0]['productInfo']['virtual_type'] ?? 0;
|
||||
|
||||
@ -297,8 +294,6 @@ class StoreOrderCreateServices extends BaseServices
|
||||
/** @var UserServices $userService */
|
||||
$userService = app()->make(UserServices::class);
|
||||
$userService->update(['uid' => $uid], ['real_name' => $orderInfo['real_name'], 'record_phone' => $orderInfo['user_phone']]);
|
||||
//占用库存
|
||||
$seckillServices->occupySeckillStock($cartInfo, $key);
|
||||
//积分抵扣
|
||||
if ($priceData['usedIntegral'] > 0) {
|
||||
$this->deductIntegral($userInfo, $useIntegral, $priceData, (int)$userInfo['uid'], $order['id']);
|
||||
|
||||
@ -526,6 +526,10 @@ class StoreOrderRefundServices extends BaseServices
|
||||
* 回退库存
|
||||
* @param $order
|
||||
* @return bool
|
||||
* @throws \Psr\SimpleCache\InvalidArgumentException
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/03/01
|
||||
*/
|
||||
public function regressionStock($order)
|
||||
{
|
||||
@ -533,7 +537,6 @@ class StoreOrderRefundServices extends BaseServices
|
||||
$combination_id = $order['combination_id'];
|
||||
$seckill_id = $order['seckill_id'];
|
||||
$bargain_id = $order['bargain_id'];
|
||||
$advance_id = $order['advance_id'];
|
||||
$res5 = true;
|
||||
/** @var StoreOrderCartInfoServices $cartServices */
|
||||
$cartServices = app()->make(StoreOrderCartInfoServices::class);
|
||||
@ -553,20 +556,15 @@ class StoreOrderRefundServices extends BaseServices
|
||||
//增库存减销量
|
||||
$unique = isset($cart['cart_info']['productInfo']['attrInfo']) ? $cart['cart_info']['productInfo']['attrInfo']['unique'] : '';
|
||||
$cart_num = (int)$cart['cart_info']['cart_num'];
|
||||
$type = 0;
|
||||
if ($combination_id) {
|
||||
$type = 3;
|
||||
$res5 = $res5 && $pinkServices->incCombinationStock($cart_num, (int)$combination_id, $unique);
|
||||
} else if ($seckill_id) {
|
||||
$type = 1;
|
||||
$res5 = $res5 && $seckillServices->incSeckillStock($cart_num, (int)$seckill_id, $unique);
|
||||
} else if ($bargain_id) {
|
||||
$type = 2;
|
||||
$res5 = $res5 && $bargainServices->incBargainStock($cart_num, (int)$bargain_id, $unique);
|
||||
} else {
|
||||
$res5 = $res5 && $services->incProductStock($cart_num, (int)$cart['cart_info']['productInfo']['id'], $unique);
|
||||
}
|
||||
if ($type) CacheService::setStock($unique, $cart_num, $type, false);
|
||||
}
|
||||
return $res5;
|
||||
}
|
||||
|
||||
@ -1930,10 +1930,6 @@ HTML;
|
||||
throw new ApiException(100020);
|
||||
}
|
||||
});
|
||||
/** @var StoreSeckillServices $seckiiServices */
|
||||
$seckiiServices = app()->make(StoreSeckillServices::class);
|
||||
$seckiiServices->cancelOccupySeckillStock($cartInfo, $order['unique']);
|
||||
$seckiiServices->rollBackStock($cartInfo);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -2154,10 +2150,6 @@ HTML;
|
||||
/** @var StoreOrderCartInfoServices $cartServices */
|
||||
$cartServices = app()->make(StoreOrderCartInfoServices::class);
|
||||
$cartInfo = $cartServices->getOrderCartInfo((int)$order['id']);
|
||||
/** @var StoreSeckillServices $seckiiServices */
|
||||
$seckiiServices = app()->make(StoreSeckillServices::class);
|
||||
$seckiiServices->cancelOccupySeckillStock($cartInfo, $order['unique']);
|
||||
$seckiiServices->rollBackStock($cartInfo);
|
||||
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('自动取消订单失败,失败原因:' . $e->getMessage(), $e->getTrace());
|
||||
|
||||
@ -61,8 +61,15 @@ class StoreProductRelationServices extends BaseServices
|
||||
}
|
||||
|
||||
/**
|
||||
* 收藏
|
||||
* @param int $uid
|
||||
* @return mixed
|
||||
* @return array
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
* @author 吴汐
|
||||
* @email 442384644@qq.com
|
||||
* @date 2023/03/01
|
||||
*/
|
||||
public function getUserCollectProduct(int $uid)
|
||||
{
|
||||
|
||||
@ -123,7 +123,7 @@ class UserRechargeServices extends BaseServices
|
||||
$item['_pay_time'] = $item['pay_time'] ? date('Y-m-d H:i:s', $item['pay_time']) : '暂无';
|
||||
$item['_add_time'] = $item['add_time'] ? date('Y-m-d H:i:s', $item['add_time']) : '暂无';
|
||||
$item['paid_type'] = $item['paid'] ? '已支付' : '未支付';
|
||||
$item['avatar'] = strpos($item['avatar'], 'http') === false ? (sys_config('site_url') . $item['avatar']) : $item['avatar'];
|
||||
$item['avatar'] = strpos($item['avatar'] ?? '', 'http') === false ? (sys_config('site_url') . $item['avatar']) : $item['avatar'];
|
||||
unset($item['user']);
|
||||
}
|
||||
return compact('list', 'count');
|
||||
|
||||
@ -145,104 +145,6 @@ class CacheService
|
||||
}
|
||||
}
|
||||
|
||||
/** 以下三个方法仅开启redis之后才使用 */
|
||||
/**
|
||||
* 设置redis入库队列
|
||||
* @param string $unique
|
||||
* @param int $number
|
||||
* @param int $type
|
||||
* @param bool $isPush
|
||||
* @return false
|
||||
* @throws \Psr\SimpleCache\InvalidArgumentException
|
||||
*/
|
||||
public static function setStock(string $unique, int $number, int $type = 1, bool $isPush = true)
|
||||
{
|
||||
if (Config::get('cache.default') == 'file') return true;
|
||||
if (!$unique || !$number) return false;
|
||||
$name = (self::$redisQueueKey[$type] ?? '') . '_' . $type . '_' . $unique;
|
||||
if ($isPush) {
|
||||
Cache::store('redis')->delete($name);
|
||||
}
|
||||
$data = [];
|
||||
for ($i = 1; $i <= $number; $i++) {
|
||||
$data[] = $i;
|
||||
}
|
||||
return Cache::store('redis')->lPush($name, ...$data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否有库存|返回库存
|
||||
* @param string $unique
|
||||
* @param int $number
|
||||
* @param int $type
|
||||
* @return bool
|
||||
*/
|
||||
public static function checkStock(string $unique, int $number = 0, int $type = 1)
|
||||
{
|
||||
if (Config::get('cache.default') == 'file') return true;
|
||||
$name = (self::$redisQueueKey[$type] ?? '') . '_' . $type . '_' . $unique;
|
||||
if ($number) {
|
||||
return Cache::store('redis')->lLen($name) >= $number;
|
||||
} else {
|
||||
return Cache::store('redis')->lLen($name);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 弹出redis队列中的库存条数
|
||||
* @param string $unique
|
||||
* @param int $number
|
||||
* @param int $type
|
||||
* @return bool
|
||||
*/
|
||||
public static function popStock(string $unique, int $number, int $type = 1)
|
||||
{
|
||||
if (Config::get('cache.default') == 'file') return true;
|
||||
if (!$unique || !$number) return false;
|
||||
$name = (self::$redisQueueKey[$type] ?? '') . '_' . $type . '_' . $unique;
|
||||
$res = true;
|
||||
if ($number > Cache::store('redis')->lLen($name)) {
|
||||
return false;
|
||||
}
|
||||
for ($i = 1; $i <= $number; $i++) {
|
||||
$res = $res && Cache::store('redis')->lPop($name);
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 存入当前秒杀商品属性有序集合
|
||||
* @param $set_key
|
||||
* @param $score
|
||||
* @param $value
|
||||
* @return false
|
||||
*/
|
||||
public static function zAdd($set_key, $score, $value)
|
||||
{
|
||||
if (Config::get('cache.default') == 'file') return true;
|
||||
try {
|
||||
return Cache::store('redis')->zAdd($set_key, $score, $value);
|
||||
} catch (\Throwable $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 取消集合中的秒杀商品
|
||||
* @param $set_key
|
||||
* @param $value
|
||||
* @return false
|
||||
*/
|
||||
public static function zRem($set_key, $value)
|
||||
{
|
||||
if (Config::get('cache.default') == 'file') return true;
|
||||
try {
|
||||
return Cache::store('redis')->zRem($set_key, $value);
|
||||
} catch (\Throwable $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查锁
|
||||
* @param string $key
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user