From 6e9fb8d3f7cac16e792c19fececc5b5e1d64b2e7 Mon Sep 17 00:00:00 2001 From: luofei <604446095@qq.com> Date: Wed, 31 May 2023 15:59:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=9A=8F=E6=9C=BA=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BA=91=E4=BB=93=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/product/SpuRepository.php | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/app/common/repositories/store/product/SpuRepository.php b/app/common/repositories/store/product/SpuRepository.php index 69605d9b..424c293e 100644 --- a/app/common/repositories/store/product/SpuRepository.php +++ b/app/common/repositories/store/product/SpuRepository.php @@ -188,8 +188,7 @@ class SpuRepository extends BaseRepository $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']); $page = 1; } @@ -221,34 +220,37 @@ class SpuRepository extends BaseRepository * @param $merId * @param $page * @return array + * @throws \RedisException */ public function getSpuFromCache($merId, $page): array { $dataKey = 'CloudMerchantSpu_' . $merId; - $takenKey = 'CloudMerchantSpuTakenProductIds_' . $merId . '_page_'. $page; - $allTakenKey = 'CloudMerchantSpuTakenProductIds_' . $merId; + $takenKey = 'CloudMerchantSpu_' . $merId . '_page_'. $page; + $remainKey = 'CloudMerchantSpuRemain_' . $merId; /** @var RedisCacheService $RedisCacheService */ $RedisCacheService = app()->make(RedisCacheService::class); if ($RedisCacheService->exists($takenKey)) { return $RedisCacheService->sMembers($takenKey); } - if ($RedisCacheService->sCard($allTakenKey) == $RedisCacheService->sCard($dataKey)) { - $keys = $RedisCacheService->sRandMember($dataKey, 10); - } else { - $keys = $RedisCacheService->sDiff($dataKey, $allTakenKey); - } - $number = min(count($keys), 10); - if ($number <= 0) { + $remainCount = $RedisCacheService->sCard($remainKey); + if ($remainCount == 0 && $page > 1) { return []; } - $indexes = array_rand($keys, $number); $productIds = []; - foreach ($indexes as $index) { - $productIds[] = $keys[$index]; + if ($remainCount == 0) { + $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($allTakenKey, ...$productIds); - $RedisCacheService->expire($takenKey, 60); + $RedisCacheService->expire($takenKey, 180); return $productIds; }