优化随机查询云仓商品

This commit is contained in:
luofei 2023-05-31 15:59:59 +08:00
parent d00c62f859
commit 6e9fb8d3f7

View File

@ -188,8 +188,7 @@ class SpuRepository extends BaseRepository
$RedisCacheService->SADD($dataKey, $productId); $RedisCacheService->SADD($dataKey, $productId);
} }
} }
$where['product_id'] = $RedisCacheService->sRandMember($dataKey, 10); $where['product_id'] = $this->getSpuFromCache($where['mer_id'], $page);
// $where['product_id'] = $this->getSpuFromCache($where['mer_id'], $page);
unset($where['mer_id'], $where['page']); unset($where['mer_id'], $where['page']);
$page = 1; $page = 1;
} }
@ -221,34 +220,37 @@ class SpuRepository extends BaseRepository
* @param $merId * @param $merId
* @param $page * @param $page
* @return array * @return array
* @throws \RedisException
*/ */
public function getSpuFromCache($merId, $page): array public function getSpuFromCache($merId, $page): array
{ {
$dataKey = 'CloudMerchantSpu_' . $merId; $dataKey = 'CloudMerchantSpu_' . $merId;
$takenKey = 'CloudMerchantSpuTakenProductIds_' . $merId . '_page_'. $page; $takenKey = 'CloudMerchantSpu_' . $merId . '_page_'. $page;
$allTakenKey = 'CloudMerchantSpuTakenProductIds_' . $merId; $remainKey = 'CloudMerchantSpuRemain_' . $merId;
/** @var RedisCacheService $RedisCacheService */ /** @var RedisCacheService $RedisCacheService */
$RedisCacheService = app()->make(RedisCacheService::class); $RedisCacheService = app()->make(RedisCacheService::class);
if ($RedisCacheService->exists($takenKey)) { if ($RedisCacheService->exists($takenKey)) {
return $RedisCacheService->sMembers($takenKey); return $RedisCacheService->sMembers($takenKey);
} }
if ($RedisCacheService->sCard($allTakenKey) == $RedisCacheService->sCard($dataKey)) { $remainCount = $RedisCacheService->sCard($remainKey);
$keys = $RedisCacheService->sRandMember($dataKey, 10); if ($remainCount == 0 && $page > 1) {
} else {
$keys = $RedisCacheService->sDiff($dataKey, $allTakenKey);
}
$number = min(count($keys), 10);
if ($number <= 0) {
return []; return [];
} }
$indexes = array_rand($keys, $number);
$productIds = []; $productIds = [];
foreach ($indexes as $index) { if ($remainCount == 0) {
$productIds[] = $keys[$index]; $productIds = $RedisCacheService->sRandMember($dataKey, 10);
} else {
for ($i = 0; $i < $remainCount; $i++) {
$productIds[] = $RedisCacheService->sPop($remainKey);
}
}
if ($page == 1) {
$allProductIds = $RedisCacheService->sMembers($dataKey);
$remainProductIds = array_diff($allProductIds, $productIds);
$RedisCacheService->sAdd($remainKey, ...$remainProductIds);
} }
$RedisCacheService->sAdd($takenKey, ...$productIds); $RedisCacheService->sAdd($takenKey, ...$productIds);
$RedisCacheService->sAdd($allTakenKey, ...$productIds); $RedisCacheService->expire($takenKey, 180);
$RedisCacheService->expire($takenKey, 60);
return $productIds; return $productIds;
} }