feat(cache): 启用缓存过期机制 #2

Merged
mrxiaozhuox merged 1 commits from feature/cache-expiration into main 2026-06-08 18:50:36 +08:00
2 changed files with 62 additions and 19 deletions
Showing only changes of commit 818ad69ce7 - Show all commits

View File

@@ -1,15 +1,24 @@
package online.mineroo.common.cache; package online.mineroo.common.cache;
import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import online.mineroo.common.request.UserRequest.SimpleUserInfoResponse; import online.mineroo.common.request.UserRequest.SimpleUserInfoResponse;
public class UserInfoCache { public class UserInfoCache {
private ConcurrentHashMap<String, UUID> uuidMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap<String, UUID> uuidMap = new ConcurrentHashMap<>();
private ConcurrentHashMap<UUID, SimpleUserCacheInfo> simpleUserInfo = new ConcurrentHashMap<>(); private final ConcurrentHashMap<UUID, SimpleUserCacheInfo> simpleUserInfo = new ConcurrentHashMap<>();
private final Duration cacheTtl;
public UserInfoCache() {} public UserInfoCache() {
this(Duration.ofHours(24));
}
public UserInfoCache(Duration cacheTtl) {
this.cacheTtl = cacheTtl != null ? cacheTtl : Duration.ofHours(24);
}
public UUID insert(UUID uuid, SimpleUserInfoResponse simpleUserInfoResponse) { public UUID insert(UUID uuid, SimpleUserInfoResponse simpleUserInfoResponse) {
this.simpleUserInfo.put(uuid, new SimpleUserCacheInfo(simpleUserInfoResponse)); this.simpleUserInfo.put(uuid, new SimpleUserCacheInfo(simpleUserInfoResponse));
@@ -32,10 +41,11 @@ public class UserInfoCache {
return null; return null;
} }
// LocalDateTime expireTime = info.getTime().plusHours(24); if (info.isExpired(cacheTtl)) {
// if (LocalDateTime.now().isAfter(expireTime)) { this.simpleUserInfo.remove(uuid);
// return null; this.uuidMap.values().removeIf(val -> val.equals(uuid));
// } return null;
}
return info.getData(); return info.getData();
} }
@@ -52,6 +62,11 @@ public class UserInfoCache {
return this.get(uuid); return this.get(uuid);
} }
public SimpleUserInfoResponse getIfPresent(UUID uuid) {
SimpleUserCacheInfo info = this.simpleUserInfo.get(uuid);
return info != null ? info.getData() : null;
}
public void remove(UUID uuid) { public void remove(UUID uuid) {
if (uuid == null) { if (uuid == null) {
return; return;
@@ -67,30 +82,50 @@ public class UserInfoCache {
} }
public void cleanup() { public void cleanup() {
// LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
//
// simpleUserInfo.entrySet().removeIf(entry -> { simpleUserInfo.entrySet().removeIf(entry -> {
// return now.isAfter(entry.getValue().getTime().plusHours(24)); boolean expired = entry.getValue().isExpiredAt(now, cacheTtl);
// }); if (expired) {
// uuidMap.values().removeIf(val -> val.equals(entry.getKey()));
// uuidMap.entrySet().removeIf(entry -> !simpleUserInfo.containsKey(entry.getValue())); }
return expired;
});
}
public int size() {
return simpleUserInfo.size();
}
public void clear() {
simpleUserInfo.clear();
uuidMap.clear();
} }
public static class SimpleUserCacheInfo { public static class SimpleUserCacheInfo {
private SimpleUserInfoResponse data; private final SimpleUserInfoResponse data;
private LocalDateTime time; private final LocalDateTime createdAt;
public SimpleUserCacheInfo(SimpleUserInfoResponse data) { public SimpleUserCacheInfo(SimpleUserInfoResponse data) {
this.data = data; this.data = data;
this.time = LocalDateTime.now(); this.createdAt = LocalDateTime.now();
} }
public SimpleUserInfoResponse getData() { public SimpleUserInfoResponse getData() {
return this.data; return this.data;
} }
public LocalDateTime getTime() { public LocalDateTime getCreatedAt() {
return this.time; return this.createdAt;
}
public boolean isExpired(Duration ttl) {
return isExpiredAt(LocalDateTime.now(), ttl);
}
public boolean isExpiredAt(LocalDateTime now, Duration ttl) {
LocalDateTime expireTime = createdAt.plus(ttl);
return now.isAfter(expireTime);
} }
} }
} }

View File

@@ -77,6 +77,14 @@ public class MinerooCore extends JavaPlugin implements Listener {
long period = 20L * 90; long period = 20L * 90;
scheduler.runTaskTimer(this, new ReportPlayersTask(this, scheduler), 20L * 30, period); scheduler.runTaskTimer(this, new ReportPlayersTask(this, scheduler), 20L * 30, period);
} }
// Schedule cache cleanup task (every 10 minutes)
getServer().getScheduler().runTaskTimerAsynchronously(this, () -> {
if (this.userInfoCache != null) {
this.userInfoCache.cleanup();
getLogger().fine("UserInfoCache cleanup completed, size: " + this.userInfoCache.size());
}
}, 20L * 60 * 10, 20L * 60 * 10); // 10 minutes
} }
@Override @Override