ItemCache.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Module\Game\Logics;
  3. use App\Module\GameItems\Events\ItemQuantityChanged;
  4. use App\Module\LCache\Cache;
  5. use Illuminate\Support\Facades\Log;
  6. /**
  7. * 物品缓存逻辑类
  8. *
  9. * 负责处理物品变更事件的缓存逻辑,包括:
  10. * 1. 将物品变更数据存入缓存
  11. * 2. 按照用户进行存储
  12. * 3. 同一物品多次变更进行数据覆盖
  13. */
  14. class ItemCache
  15. {
  16. /**
  17. * 缓存键前缀
  18. */
  19. const CACHE_KEY_PREFIX = 'game:item:changed:';
  20. /**
  21. * 缓存过期时间(秒)
  22. */
  23. const CACHE_TTL = 3600; // 1小时
  24. /**
  25. * 处理物品数量变更事件
  26. *
  27. * 将物品变更数据存入缓存,按用户ID和物品ID进行存储
  28. * 同一物品多次变更会覆盖之前的数据
  29. *
  30. * @param ItemQuantityChanged $event 物品数量变更事件
  31. * @return void
  32. */
  33. public static function handleItemQuantityChanged(ItemQuantityChanged $event): void
  34. {
  35. try {
  36. // 构建缓存键,按用户ID进行存储
  37. $cacheKey = self::CACHE_KEY_PREFIX . $event->userId;
  38. // 获取当前用户的物品变更缓存
  39. $userItemsCache = Cache::get($cacheKey, []);
  40. // 构建物品变更数据
  41. $itemData = [
  42. 'item_id' => $event->itemId,
  43. 'instance_id' => $event->instanceId,
  44. 'old_quantity' => $event->oldQuantity,
  45. 'new_quantity' => $event->newQuantity,
  46. 'change_amount' => $event->changeAmount,
  47. 'user_item_id' => $event->userItemId,
  48. 'updated_at' => time(),
  49. ];
  50. // 使用物品ID作为键,实现同一物品多次变更的数据覆盖
  51. $userItemsCache[$event->itemId] = $itemData;
  52. // dump($userItemsCache);
  53. // 将更新后的数据存回缓存
  54. Cache::put($cacheKey, $userItemsCache, self::CACHE_TTL);
  55. Log::info('物品变更数据已缓存', [
  56. 'user_id' => $event->userId,
  57. 'item_id' => $event->itemId,
  58. 'change_amount' => $event->changeAmount,
  59. ]);
  60. } catch (\Exception $e) {
  61. Log::error('物品变更数据缓存失败', [
  62. 'error' => $e->getMessage(),
  63. 'user_id' => $event->userId,
  64. 'item_id' => $event->itemId,
  65. ]);
  66. }
  67. }
  68. /**
  69. * 获取用户的物品变更缓存
  70. *
  71. * @param int $userId 用户ID
  72. * @return array 用户的物品变更数据
  73. */
  74. public static function getUserItemChanges(int $userId): array
  75. {
  76. $cacheKey = self::CACHE_KEY_PREFIX . $userId;
  77. return Cache::get($cacheKey, []);
  78. }
  79. /**
  80. * 获取用户特定物品的变更缓存
  81. *
  82. * @param int $userId 用户ID
  83. * @param int $itemId 物品ID
  84. * @return array|null 物品变更数据,不存在时返回null
  85. */
  86. public static function getUserItemChange(int $userId, int $itemId): ?array
  87. {
  88. $userItemChanges = self::getUserItemChanges($userId);
  89. return $userItemChanges[$itemId] ?? null;
  90. }
  91. /**
  92. * 清除用户的物品变更缓存
  93. *
  94. * @param int $userId 用户ID
  95. * @return void
  96. */
  97. public static function clearUserItemChanges(int $userId): void
  98. {
  99. $cacheKey = self::CACHE_KEY_PREFIX . $userId;
  100. Cache::put($cacheKey, [], 0);
  101. }
  102. }