| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?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);
- }
- }
|