From 705db8b615dd1fefbb7246547eef51fd5f071577 Mon Sep 17 00:00:00 2001 From: ReiyansCN <2777807622@qq.com> Date: Thu, 5 Mar 2026 11:14:54 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84PlayerDataTTL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yirankuma/yrdatabase/allay/YRDatabaseAllay.java | 1 - yrdatabase-allay/src/main/resources/config.yml | 3 +-- .../com/yirankuma/yrdatabase/api/config/DatabaseConfig.java | 1 - .../yirankuma/yrdatabase/api/config/DatabaseConfigTest.java | 1 - .../java/com/yirankuma/yrdatabase/nukkit/YRDatabaseNukkit.java | 1 - yrdatabase-nukkit/src/main/resources/config.yml | 1 - 6 files changed, 1 insertion(+), 7 deletions(-) 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/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-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/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 From 69c88620bbbb74ea3d07e5633738274c446e22e3 Mon Sep 17 00:00:00 2001 From: ReiyansCN <2777807622@qq.com> Date: Thu, 5 Mar 2026 13:14:11 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20get=20set=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89Time=20to=20live?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yrdatabase/api/DatabaseManager.java | 21 +++++++++++++++++++ .../yrdatabase/core/DatabaseManagerImpl.java | 20 ++++++++++++++---- 2 files changed, 37 insertions(+), 4 deletions(-) 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-core/src/main/java/com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java b/yrdatabase-core/src/main/java/com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java index 1f4923f..f1a7f48 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, CacheStrategy.CACHE_FIRST,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); }); From 1986c07455ec63e27628038949fef6d35a18b492 Mon Sep 17 00:00:00 2001 From: ReiyansCN <2777807622@qq.com> Date: Thu, 5 Mar 2026 17:37:31 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E4=BA=86=20player=5Fsess?= =?UTF-8?q?ion=20=E4=B8=8E=20player=5Fevent=20=E5=AD=98=E5=82=A8=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F,=E7=8E=B0=E7=9B=B4=E6=8E=A5=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E5=88=B0=E6=95=B0=E6=8D=AE=E5=BA=93=E8=80=8C=E4=B8=8D=E7=BB=8F?= =?UTF-8?q?=E8=BF=87=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yrdatabase/nukkit/listener/PlayerEventListener.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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; From 18e9c9a15f24707d3bcb0c8d93aaf06558e90617 Mon Sep 17 00:00:00 2001 From: ReiyansCN <2777807622@qq.com> Date: Thu, 5 Mar 2026 17:45:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E7=BA=A0=E6=AD=A3=E4=B8=8A=E6=AC=A1commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yrdatabase/nukkit/listener/PlayerEventListener.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 2a45a04..81117b7 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 @@ -132,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, CacheStrategy.PERSIST_ONLY) + db.set("player_sessions", uuid.toString(), sessionData, CacheStrategy.CACHE_FIRST,30) .thenAccept(success -> { if (success) { plugin.getLogger().debug("Cached session data for " + playerName); @@ -157,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,CacheStrategy.PERSIST_ONLY) + db.set("player_sessions", uuid.toString(), sessionData,CacheStrategy.CACHE_FIRST,30) .thenAccept(success -> { if (success) { plugin.getLogger().debug("Created new session for " + playerName); @@ -176,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,CacheStrategy.PERSIST_ONLY) + db.set("player_events", uuid.toString(), eventData,CacheStrategy.CACHE_FIRST,30) .exceptionally(e -> { plugin.getLogger().error("Failed to record event " + eventType + " for " + playerName, e); return null; From 38a1860069965c67ec67f347c0fcdf0e838ae08f Mon Sep 17 00:00:00 2001 From: ReiyansCN <2777807622@qq.com> Date: Thu, 5 Mar 2026 19:18:08 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=9C=80=E7=BB=88=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yirankuma/yrdatabase/core/DatabaseManagerImpl.java | 2 +- .../yrdatabase/nukkit/listener/PlayerEventListener.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 f1a7f48..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 @@ -173,7 +173,7 @@ public CompletableFuture set(String table, String key, Map set(String table, String key, Map data, CacheStrategy strategy) { - return set(table, key, data, CacheStrategy.CACHE_FIRST,0); + return set(table, key, data, strategy,0); } @Override 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 81117b7..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 @@ -132,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, CacheStrategy.CACHE_FIRST,30) + db.set("player_sessions", uuid.toString(), sessionData, CacheStrategy.PERSIST_ONLY) .thenAccept(success -> { if (success) { plugin.getLogger().debug("Cached session data for " + playerName); @@ -157,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,CacheStrategy.CACHE_FIRST,30) + db.set("player_sessions", uuid.toString(), sessionData,CacheStrategy.PERSIST_ONLY) .thenAccept(success -> { if (success) { plugin.getLogger().debug("Created new session for " + playerName); @@ -176,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,CacheStrategy.CACHE_FIRST,30) + 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;