优化性能
This commit is contained in:
56
server/app/api/cache/UserCache.php
vendored
56
server/app/api/cache/UserCache.php
vendored
@@ -226,4 +226,60 @@ class UserCache
|
||||
$key = self::sessionUsernamePrefix() . $username;
|
||||
return Cache::delete($key);
|
||||
}
|
||||
|
||||
/** 玩家缓存 key 前缀(Token 中间件用,减少重复查库) */
|
||||
private static function playerCachePrefix(): string
|
||||
{
|
||||
return config('api.player_cache_prefix', 'api:player:');
|
||||
}
|
||||
|
||||
private static function playerCacheTtl(): int
|
||||
{
|
||||
return (int) config('api.player_cache_ttl', 300);
|
||||
}
|
||||
|
||||
/**
|
||||
* 按 username 缓存玩家信息(仅 id + username,供中间件注入 request->player 后使用)
|
||||
* 登录/信息变更时需调用 deletePlayerByUsername 失效
|
||||
*/
|
||||
public static function setPlayerByUsername(string $username, array $playerRow): bool
|
||||
{
|
||||
if ($username === '' || empty($playerRow)) {
|
||||
return false;
|
||||
}
|
||||
$ttl = self::playerCacheTtl();
|
||||
if ($ttl <= 0) {
|
||||
return true;
|
||||
}
|
||||
$key = self::playerCachePrefix() . $username;
|
||||
return Cache::set($key, json_encode($playerRow), $ttl);
|
||||
}
|
||||
|
||||
/** 按 username 取缓存玩家,未命中返回 null */
|
||||
public static function getPlayerByUsername(string $username): ?array
|
||||
{
|
||||
if ($username === '') {
|
||||
return null;
|
||||
}
|
||||
if (self::playerCacheTtl() <= 0) {
|
||||
return null;
|
||||
}
|
||||
$key = self::playerCachePrefix() . $username;
|
||||
$val = Cache::get($key);
|
||||
if ($val === null || $val === '') {
|
||||
return null;
|
||||
}
|
||||
$data = json_decode((string) $val, true);
|
||||
return is_array($data) ? $data : null;
|
||||
}
|
||||
|
||||
/** 退出登录或玩家信息变更时删除玩家缓存 */
|
||||
public static function deletePlayerByUsername(string $username): bool
|
||||
{
|
||||
if ($username === '') {
|
||||
return false;
|
||||
}
|
||||
$key = self::playerCachePrefix() . $username;
|
||||
return Cache::delete($key);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,7 @@ class UserController extends OpenController
|
||||
return $this->fail('token 无效', ReturnCode::TOKEN_INVALID);
|
||||
}
|
||||
UserCache::deleteSessionByUsername($username);
|
||||
UserCache::deletePlayerByUsername($username);
|
||||
return $this->success('已退出登录');
|
||||
}
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@ class UserLogic
|
||||
|
||||
$userArr = $player->hidden(['password'])->toArray();
|
||||
UserCache::setUser((int) $player->id, $userArr);
|
||||
UserCache::setPlayerByUsername($username, $userArr);
|
||||
|
||||
$baseUrl = rtrim(config('api.login_url_base', 'https://127.0.0.1:6777'), '/');
|
||||
$lang = in_array($lang, ['chs', 'en'], true) ? $lang : 'chs';
|
||||
|
||||
@@ -66,10 +66,19 @@ class TokenMiddleware implements MiddlewareInterface
|
||||
throw new ApiException('请重新登录(当前账号已在其他处登录)', ReturnCode::TOKEN_INVALID);
|
||||
}
|
||||
|
||||
$player = DicePlayer::where('username', $username)->find();
|
||||
if (!$player) {
|
||||
UserCache::deleteSessionByUsername($username);
|
||||
throw new ApiException('请重新登录', ReturnCode::TOKEN_INVALID);
|
||||
// 优先从 Redis 缓存取玩家,避免每次请求都查库
|
||||
$player = null;
|
||||
$cached = UserCache::getPlayerByUsername($username);
|
||||
if ($cached !== null && isset($cached['id'])) {
|
||||
$player = (new DicePlayer())->data($cached, true);
|
||||
}
|
||||
if ($player === null) {
|
||||
$player = DicePlayer::where('username', $username)->find();
|
||||
if (!$player) {
|
||||
UserCache::deleteSessionByUsername($username);
|
||||
throw new ApiException('请重新登录', ReturnCode::TOKEN_INVALID);
|
||||
}
|
||||
UserCache::setPlayerByUsername($username, $player->hidden(['password'])->toArray());
|
||||
}
|
||||
$request->player_id = (int) $player->id;
|
||||
$request->player = $player;
|
||||
|
||||
Reference in New Issue
Block a user