weight) * @return array end_index => weight */ public static function getCachedByTierAndDirection(string $tier, int $direction): array { $inst = self::getCachedInstance(); $byTierDirection = $inst['by_tier_direction'] ?? []; $list = $byTierDirection[$tier][$direction] ?? []; $result = []; foreach ($list as $row) { $endIndex = isset($row['end_index']) ? (int) $row['end_index'] : 0; $weight = isset($row['weight']) ? (int) $row['weight'] : 1; $result[$endIndex] = $weight; } return $result; } /** * 重新从数据库加载并写入缓存;修改/新增/删除后需调用以实例化 */ public static function refreshCache(): void { $list = (new self())->order('tier')->order('direction')->order('end_index')->select()->toArray(); $byTierDirection = []; foreach ($list as $row) { $tier = isset($row['tier']) ? (string) $row['tier'] : ''; $direction = isset($row['direction']) ? (int) $row['direction'] : 0; if ($tier !== '') { if (!isset($byTierDirection[$tier])) { $byTierDirection[$tier] = [0 => [], 1 => []]; } if (!isset($byTierDirection[$tier][$direction])) { $byTierDirection[$tier][$direction] = []; } $byTierDirection[$tier][$direction][] = $row; } } self::$instance = [ 'list' => $list, 'by_tier_direction' => $byTierDirection, ]; Cache::set(self::CACHE_KEY_INSTANCE, self::$instance, self::CACHE_TTL); } private static function buildEmptyInstance(): array { return [ 'list' => [], 'by_tier_direction' => [], ]; } public static function clearRequestInstance(): void { self::$instance = null; } public static function onAfterInsert($model): void { self::refreshCache(); } public static function onAfterUpdate($model): void { self::refreshCache(); } public static function onAfterDelete($model): void { self::refreshCache(); } }