cache = $this->getDI()->get('cache'); $this->redis = $this->cache->getRedis(); $this->rebuild(); } protected function rebuild() { $key = $this->getCacheKey(); $reviewIds = $this->redis->sRandMember($key, 500); if (!$reviewIds) return; $reviewRepo = new ReviewRepo(); $reviews = $reviewRepo->findByIds($reviewIds); if ($reviews->count() == 0) { return; } $counterCache = new ReviewCounterCache(); $hour = date('H'); $recount = $this->checkEnableRecount(); foreach ($reviews as $review) { if ($recount && $hour % 3 == 0) { $review->agree_count = $reviewRepo->countAgrees($review->id); $review->oppose_count = $reviewRepo->countOpposes($review->id); $review->update(); $counterCache->rebuild($review->id); } else { $counter = $counterCache->get($review->id); if ($counter) { $review->agree_count = $counter['agree_count']; $review->oppose_count = $counter['oppose_count']; $review->update(); } } } $this->redis->sRem($key, ...$reviewIds); } protected function getCacheKey() { $syncer = new ReviewCounterSyncer(); return $syncer->getSyncKey(); } protected function checkEnableRecount() { $config = $this->getDI()->get('config'); return $config['recount_review'] ?? false; } }