From 28afffe95e7a9567757209ff6654819ee7076b67 Mon Sep 17 00:00:00 2001 From: William Date: Mon, 12 Feb 2024 17:19:05 +0000 Subject: [PATCH] refactor/redis: use `scan` instead of `keys` --- .../husksync/redis/RedisManager.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/net/william278/husksync/redis/RedisManager.java b/common/src/main/java/net/william278/husksync/redis/RedisManager.java index e91aa9b9..6cb8325c 100644 --- a/common/src/main/java/net/william278/husksync/redis/RedisManager.java +++ b/common/src/main/java/net/william278/husksync/redis/RedisManager.java @@ -19,6 +19,7 @@ package net.william278.husksync.redis; +import com.google.common.collect.Sets; import net.william278.husksync.HuskSync; import net.william278.husksync.config.Settings; import net.william278.husksync.data.DataSnapshot; @@ -27,6 +28,8 @@ import org.jetbrains.annotations.Blocking; import org.jetbrains.annotations.NotNull; import redis.clients.jedis.*; import redis.clients.jedis.exceptions.JedisException; +import redis.clients.jedis.params.ScanParams; +import redis.clients.jedis.resps.ScanResult; import redis.clients.jedis.util.Pool; import java.nio.charset.StandardCharsets; @@ -296,16 +299,20 @@ public class RedisManager extends JedisPubSub { public void clearUsersCheckedOutOnServer() { final String keyFormat = String.format("%s*", RedisKeyType.DATA_CHECKOUT.getKeyPrefix(clusterId)); try (Jedis jedis = jedisPool.getResource()) { - final Set keys = jedis.keys(keyFormat); - if (keys == null) { - plugin.log(Level.WARNING, "Checkout key returned null from Redis during clearing"); - return; - } - for (String key : keys) { - if (jedis.get(key).equals(plugin.getServerName())) { - jedis.del(key); - } - } + final Set keys = Sets.newHashSet(); + + // Scan for keys + String nextCursor; + do { + final ScanResult scanResult = jedis.scan(keyFormat, new ScanParams().match(keyFormat)); + keys.addAll(scanResult.getResult()); + nextCursor = scanResult.getCursor(); + } while (!nextCursor.equals("0")); + + // Delete matched keys + jedis.del(keys.stream() + .filter(k -> jedis.get(k).equals(plugin.getServerName())) + .toArray(String[]::new)); } catch (Throwable e) { plugin.log(Level.SEVERE, "An exception occurred clearing this server's checkout keys on Redis", e); }