diff --git a/yrdatabase-allay/src/main/java/com/yirankuma/yrdatabase/allay/YRDatabaseAllay.java b/yrdatabase-allay/src/main/java/com/yirankuma/yrdatabase/allay/YRDatabaseAllay.java index 0e9019a..be58684 100644 --- a/yrdatabase-allay/src/main/java/com/yirankuma/yrdatabase/allay/YRDatabaseAllay.java +++ b/yrdatabase-allay/src/main/java/com/yirankuma/yrdatabase/allay/YRDatabaseAllay.java @@ -171,7 +171,6 @@ private DatabaseConfig buildDatabaseConfig() { // Caching DatabaseConfig.CachingConfig cachingConfig = dbConfig.getCaching(); cachingConfig.setDefaultTTL(config.getLong("caching.defaultTTL", 3600)); - cachingConfig.setPlayerDataTTL(config.getLong("caching.playerDataTTL", 7200)); cachingConfig.setAutoRefresh(config.getBoolean("caching.autoRefresh", true)); cachingConfig.setRefreshThreshold(config.getLong("caching.refreshThreshold", 300)); diff --git a/yrdatabase-allay/src/main/resources/config.yml b/yrdatabase-allay/src/main/resources/config.yml index b97b40c..3800768 100644 --- a/yrdatabase-allay/src/main/resources/config.yml +++ b/yrdatabase-allay/src/main/resources/config.yml @@ -40,8 +40,7 @@ persist: # Caching behavior caching: - defaultTTL: 3600 - playerDataTTL: 7200 + defaultTTL: 3600 # seconds autoRefresh: true refreshThreshold: 300 diff --git a/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/DatabaseManager.java b/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/DatabaseManager.java index 25b665d..32fe8d1 100644 --- a/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/DatabaseManager.java +++ b/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/DatabaseManager.java @@ -26,6 +26,16 @@ public interface DatabaseManager extends AutoCloseable { */ CompletableFuture>> get(String table, String key); + /** + * Smart get: tries cache first, then persistence layer. + * + * @param table Table name + * @param key Primary key + * @param TTLSeconds Custom TTL time(Seconds) + * @return Data map wrapped in Optional + */ + CompletableFuture>> get(String table, String key, int TTLSeconds); + /** * Smart set: writes to cache with optional delayed persistence. * @@ -47,6 +57,17 @@ public interface DatabaseManager extends AutoCloseable { */ CompletableFuture set(String table, String key, Map data, CacheStrategy strategy); + /** + * Smart set with cache strategy. + * + * @param table Table name + * @param key Primary key + * @param data Data to store + * @param strategy Cache strategy + * @param TTLSeconds Custom TTL time(Seconds) + * @return Success status + */ + CompletableFuture set(String table, String key, Map data, CacheStrategy strategy, int TTLSeconds); /** * Persist data from cache to persistence layer and clear cache. * diff --git a/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/config/DatabaseConfig.java b/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/config/DatabaseConfig.java index 7700b8e..1338531 100644 --- a/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/config/DatabaseConfig.java +++ b/yrdatabase-api/src/main/java/com/yirankuma/yrdatabase/api/config/DatabaseConfig.java @@ -95,7 +95,6 @@ public static class SQLiteConfig { @Data public static class CachingConfig { private long defaultTTL = 3600; - private long playerDataTTL = 7200; private boolean autoRefresh = true; private long refreshThreshold = 300; } diff --git a/yrdatabase-api/src/test/java/com/yirankuma/yrdatabase/api/config/DatabaseConfigTest.java b/yrdatabase-api/src/test/java/com/yirankuma/yrdatabase/api/config/DatabaseConfigTest.java index 5d88119..c3238aa 100644 --- a/yrdatabase-api/src/test/java/com/yirankuma/yrdatabase/api/config/DatabaseConfigTest.java +++ b/yrdatabase-api/src/test/java/com/yirankuma/yrdatabase/api/config/DatabaseConfigTest.java @@ -152,7 +152,6 @@ void shouldHaveDefaultTtlValues() { DatabaseConfig config = new DatabaseConfig(); assertEquals(3600, config.getCaching().getDefaultTTL()); - assertEquals(7200, config.getCaching().getPlayerDataTTL()); } @Test diff --git a/yrdatabase-core/src/main/java/com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java b/yrdatabase-core/src/main/java/com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java index 1f4923f..a43a3b7 100644 --- a/yrdatabase-core/src/main/java/com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java +++ b/yrdatabase-core/src/main/java/com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java @@ -117,6 +117,11 @@ public CompletableFuture flush() { @Override public CompletableFuture>> get(String table, String key) { + return get(table,key,0); + } + + @Override + public CompletableFuture>> get(String table, String key, int TTLSeconds) { String cacheKey = buildCacheKey(table, key); // Try cache first @@ -135,6 +140,7 @@ public CompletableFuture>> get(String table, String // Write back to cache String json = gson.toJson(persisted.get()); long ttl = config.getCaching().getDefaultTTL(); + if(TTLSeconds > 0)ttl = TTLSeconds; redisProvider.setEx(cacheKey, json, Duration.ofSeconds(ttl)); } return CompletableFuture.completedFuture(persisted); @@ -167,10 +173,16 @@ public CompletableFuture set(String table, String key, Map set(String table, String key, Map data, CacheStrategy strategy) { + return set(table, key, data, strategy,0); + } + + @Override + public CompletableFuture set(String table, String key, Map data, CacheStrategy strategy, int TTLSeconds) { String cacheKey = buildCacheKey(table, key); String json = gson.toJson(data); long ttl = config.getCaching().getDefaultTTL(); - + if(TTLSeconds > 0)ttl = TTLSeconds; + final long finalTTL = ttl; // Ensure data has the key Map dataWithKey = new HashMap<>(data); dataWithKey.put("id", key); @@ -189,7 +201,7 @@ public CompletableFuture set(String table, String key, Map persistFuture = saveToPersist(table, key, dataWithKey); if (redisProvider != null && redisProvider.isConnected()) { return persistFuture.thenCompose(persistOk -> - redisProvider.setEx(cacheKey, json, Duration.ofSeconds(ttl)) + redisProvider.setEx(cacheKey, json, Duration.ofSeconds(finalTTL)) .thenApply(cacheOk -> persistOk && cacheOk) ); } @@ -199,12 +211,12 @@ public CompletableFuture set(String table, String key, Map { if (cacheOk) { scheduler.schedule(() -> { // ← 直接用调度器延迟 saveToPersist(table, key, dataWithKey); - }, ttl, TimeUnit.SECONDS); + }, finalTTL, TimeUnit.SECONDS); } return CompletableFuture.completedFuture(cacheOk); }); diff --git a/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/YRDatabaseNukkit.java b/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/YRDatabaseNukkit.java index 12c5004..0e7af40 100644 --- a/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/YRDatabaseNukkit.java +++ b/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/YRDatabaseNukkit.java @@ -198,7 +198,6 @@ private DatabaseConfig loadDatabaseConfig() { Map cachingSection = pluginConfig.getSection("caching").getAllMap(); if (!cachingSection.isEmpty()) { config.getCaching().setDefaultTTL(getInt(cachingSection, "defaultTTL", 3600)); - config.getCaching().setPlayerDataTTL(getInt(cachingSection, "playerDataTTL", 7200)); config.getCaching().setAutoRefresh(getBoolean(cachingSection, "autoRefresh", true)); } diff --git a/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/listener/PlayerEventListener.java b/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/listener/PlayerEventListener.java index cef5554..2a45a04 100644 --- a/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/listener/PlayerEventListener.java +++ b/yrdatabase-nukkit/src/main/java/com/yirankuma/yrdatabase/nukkit/listener/PlayerEventListener.java @@ -6,6 +6,7 @@ import cn.nukkit.event.Listener; import cn.nukkit.event.player.PlayerJoinEvent; import cn.nukkit.event.player.PlayerQuitEvent; +import com.yirankuma.yrdatabase.api.CacheStrategy; import com.yirankuma.yrdatabase.api.DatabaseManager; import com.yirankuma.yrdatabase.api.event.SessionReason; import com.yirankuma.yrdatabase.nukkit.YRDatabaseNukkit; @@ -69,7 +70,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { sessionBridge.triggerLocalJoin(uuid.toString(), playerName); } - db.get("player_sessions", uuid.toString()) + db.get("player_sessions", uuid.toString(),30) .thenAccept(result -> { if (result.isPresent()) { Map data = result.get(); @@ -131,7 +132,7 @@ public void onPlayerQuit(PlayerQuitEvent event) { sessionData.put("z", player.getZ()); sessionData.put("world", player.getLevel().getName()); - db.set("player_sessions", uuid.toString(), sessionData) + db.set("player_sessions", uuid.toString(), sessionData, CacheStrategy.PERSIST_ONLY) .thenAccept(success -> { if (success) { plugin.getLogger().debug("Cached session data for " + playerName); @@ -156,7 +157,7 @@ private void createNewSession(UUID uuid, String playerName) { sessionData.put("firstJoin", System.currentTimeMillis()); sessionData.put("lastSeen", System.currentTimeMillis()); - db.set("player_sessions", uuid.toString(), sessionData) + db.set("player_sessions", uuid.toString(), sessionData,CacheStrategy.PERSIST_ONLY) .thenAccept(success -> { if (success) { plugin.getLogger().debug("Created new session for " + playerName); @@ -175,7 +176,7 @@ private void recordPlayerEvent(UUID uuid, String playerName, String eventType) { eventData.put("timestamp", System.currentTimeMillis()); eventData.put("server", plugin.getServer().getName()); - db.set("player_events", uuid.toString(), eventData) + db.set("player_events", uuid.toString(), eventData,CacheStrategy.PERSIST_ONLY) .exceptionally(e -> { plugin.getLogger().error("Failed to record event " + eventType + " for " + playerName, e); return null; diff --git a/yrdatabase-nukkit/src/main/resources/config.yml b/yrdatabase-nukkit/src/main/resources/config.yml index a2daddc..b1ebde7 100644 --- a/yrdatabase-nukkit/src/main/resources/config.yml +++ b/yrdatabase-nukkit/src/main/resources/config.yml @@ -43,7 +43,6 @@ persist: # Caching settings caching: defaultTTL: 3600 # seconds - playerDataTTL: 7200 # seconds autoRefresh: true # Session management