|
|
@@ -0,0 +1,118 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Module\Game\Logics;
|
|
|
+
|
|
|
+use App\Module\GameItems\Events\ItemQuantityChanged;
|
|
|
+use App\Module\LCache\Cache;
|
|
|
+use Illuminate\Support\Facades\Log;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 物品缓存逻辑类
|
|
|
+ *
|
|
|
+ * 负责处理物品变更事件的缓存逻辑,包括:
|
|
|
+ * 1. 将物品变更数据存入缓存
|
|
|
+ * 2. 按照用户进行存储
|
|
|
+ * 3. 同一物品多次变更进行数据覆盖
|
|
|
+ */
|
|
|
+class ItemCache
|
|
|
+{
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 缓存键前缀
|
|
|
+ */
|
|
|
+ const CACHE_KEY_PREFIX = 'game:item:changed:';
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 缓存过期时间(秒)
|
|
|
+ */
|
|
|
+ const CACHE_TTL = 3600; // 1小时
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理物品数量变更事件
|
|
|
+ *
|
|
|
+ * 将物品变更数据存入缓存,按用户ID和物品ID进行存储
|
|
|
+ * 同一物品多次变更会覆盖之前的数据
|
|
|
+ *
|
|
|
+ * @param ItemQuantityChanged $event 物品数量变更事件
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public static function handleItemQuantityChanged(ItemQuantityChanged $event): void
|
|
|
+ {
|
|
|
+ try {
|
|
|
+ // 构建缓存键,按用户ID进行存储
|
|
|
+ $cacheKey = self::CACHE_KEY_PREFIX . $event->userId;
|
|
|
+
|
|
|
+ // 获取当前用户的物品变更缓存
|
|
|
+ $userItemsCache = Cache::get($cacheKey, []);
|
|
|
+
|
|
|
+ // 构建物品变更数据
|
|
|
+ $itemData = [
|
|
|
+ 'item_id' => $event->itemId,
|
|
|
+ 'instance_id' => $event->instanceId,
|
|
|
+ 'old_quantity' => $event->oldQuantity,
|
|
|
+ 'new_quantity' => $event->newQuantity,
|
|
|
+ 'change_amount' => $event->changeAmount,
|
|
|
+ 'user_item_id' => $event->userItemId,
|
|
|
+ 'updated_at' => time(),
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 使用物品ID作为键,实现同一物品多次变更的数据覆盖
|
|
|
+ $userItemsCache[$event->itemId] = $itemData;
|
|
|
+ dump($userItemsCache);
|
|
|
+ // 将更新后的数据存回缓存
|
|
|
+ Cache::put($cacheKey, $userItemsCache, self::CACHE_TTL);
|
|
|
+
|
|
|
+ Log::info('物品变更数据已缓存', [
|
|
|
+ 'user_id' => $event->userId,
|
|
|
+ 'item_id' => $event->itemId,
|
|
|
+ 'change_amount' => $event->changeAmount,
|
|
|
+ ]);
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('物品变更数据缓存失败', [
|
|
|
+ 'error' => $e->getMessage(),
|
|
|
+ 'user_id' => $event->userId,
|
|
|
+ 'item_id' => $event->itemId,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户的物品变更缓存
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @return array 用户的物品变更数据
|
|
|
+ */
|
|
|
+ public static function getUserItemChanges(int $userId): array
|
|
|
+ {
|
|
|
+ $cacheKey = self::CACHE_KEY_PREFIX . $userId;
|
|
|
+
|
|
|
+ return Cache::get($cacheKey, []);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取用户特定物品的变更缓存
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @param int $itemId 物品ID
|
|
|
+ * @return array|null 物品变更数据,不存在时返回null
|
|
|
+ */
|
|
|
+ public static function getUserItemChange(int $userId, int $itemId): ?array
|
|
|
+ {
|
|
|
+ $userItemChanges = self::getUserItemChanges($userId);
|
|
|
+
|
|
|
+ return $userItemChanges[$itemId] ?? null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 清除用户的物品变更缓存
|
|
|
+ *
|
|
|
+ * @param int $userId 用户ID
|
|
|
+ * @return void
|
|
|
+ */
|
|
|
+ public static function clearUserItemChanges(int $userId): void
|
|
|
+ {
|
|
|
+ $cacheKey = self::CACHE_KEY_PREFIX . $userId;
|
|
|
+ Cache::put($cacheKey, [], 0);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|