From 40947b320889eaaa7b7db62ca45d59e0f67852ce Mon Sep 17 00:00:00 2001 From: Wizzer Date: Fri, 8 Sep 2023 12:10:21 +0800 Subject: [PATCH] =?UTF-8?q?update:=20wkcache=20=E4=BC=98=E5=8C=96=E6=8E=89?= =?UTF-8?q?scan=EF=BC=8C=E9=87=87=E7=94=A8lua=E8=84=9A=E6=9C=AC=E5=88=A0?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wkcache/WkcacheRemoveAllInterceptor.java | 35 +++------- .../WkcacheRemoveEntryInterceptor.java | 70 ++++++------------- .../plugins/wkcache/test/MyCacheTest.java | 2 +- 3 files changed, 33 insertions(+), 74 deletions(-) diff --git a/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveAllInterceptor.java b/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveAllInterceptor.java index d68d39f2..6aedc39d 100644 --- a/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveAllInterceptor.java +++ b/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveAllInterceptor.java @@ -6,11 +6,11 @@ import org.nutz.lang.Strings; import org.nutz.plugins.wkcache.annotation.CacheDefaults; import org.nutz.plugins.wkcache.annotation.CacheRemoveAll; -import redis.clients.jedis.*; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisPool; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.List; /** * Created by wizzer on 2017/6/14. @@ -48,39 +48,22 @@ public void filter(InterceptorChain chain) throws Throwable { } private void delCache(String cacheName) { - ScanParams match = new ScanParams().match(cacheName + ":*"); + String lua = "local keysToDelete = redis.call('KEYS', ARGV[1])\n" + + "for _, key in ipairs(keysToDelete) do\n" + + " redis.call('DEL', key)\n" + + "end"; if (getJedisAgent().isClusterMode()) { JedisCluster jedisCluster = getJedisAgent().getJedisClusterWrapper().getJedisCluster(); - List keys = new ArrayList<>(); for (JedisPool pool : jedisCluster.getClusterNodes().values()) { try (Jedis jedis = pool.getResource()) { - ScanResult scan = null; - do { - scan = jedis.scan(scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); - keys.addAll(scan.getResult()); - } while (!scan.isCompleteIteration()); + jedis.eval(lua, 0, cacheName + ":*"); } } - Jedis jedis = null; - try { - jedis = getJedisAgent().jedis(); - for (String key : keys) { - jedis.del(key); - } - } finally { - Streams.safeClose(jedis); - } } else { Jedis jedis = null; try { jedis = getJedisAgent().jedis(); - ScanResult scan = null; - do { - scan = jedis.scan(scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); - for (String key : scan.getResult()) { - jedis.del(key.getBytes()); - } - } while (!scan.isCompleteIteration()); + jedis.eval(lua, 0, cacheName + ":*"); } finally { Streams.safeClose(jedis); } diff --git a/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveEntryInterceptor.java b/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveEntryInterceptor.java index bb4579f7..e4a50044 100644 --- a/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveEntryInterceptor.java +++ b/nutz-plugins-wkcache/src/main/java/org/nutz/plugins/wkcache/WkcacheRemoveEntryInterceptor.java @@ -11,13 +11,15 @@ import org.nutz.lang.util.MethodParamNamesScaner; import org.nutz.plugins.wkcache.annotation.CacheDefaults; import org.nutz.plugins.wkcache.annotation.CacheRemove; -import redis.clients.jedis.*; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.ScanParams; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; -import java.util.Map; /** * Created by wizzer on 2017/6/14. @@ -81,73 +83,47 @@ public void filter(InterceptorChain chain) throws Throwable { private void delCache(String cacheName, String cacheKey) { if (cacheKey.endsWith("*")) { if (isHash) { - ScanParams match = new ScanParams().match(cacheKey); + String lua = "local hashKey = KEYS[1]\n" + + "local prefix = ARGV[1]\n" + + "local fields = redis.call('HKEYS', hashKey)\n" + + "for _, field in ipairs(fields) do\n" + + " if string.sub(field, 1, string.len(prefix)) == prefix then\n" + + " redis.call('HDEL', hashKey, field)\n" + + " end\n" + + "end"; if (getJedisAgent().isClusterMode()) { JedisCluster jedisCluster = getJedisAgent().getJedisClusterWrapper().getJedisCluster(); - List> keys = new ArrayList<>(); - ScanResult> scan = null; - do { - scan = jedisCluster.hscan(cacheName, scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); - keys.addAll(scan.getResult()); - } while (!scan.isCompleteIteration()); - Jedis jedis = null; - try { - jedis = getJedisAgent().jedis(); - for (Map.Entry key : keys) { - jedis.hdel(cacheName, key.getKey()); + for (JedisPool pool : jedisCluster.getClusterNodes().values()) { + try (Jedis jedis = pool.getResource()) { + jedis.eval(lua, Collections.singletonList(cacheName), Collections.singletonList(cacheKey.substring(0, cacheKey.lastIndexOf("*")))); } - } finally { - Streams.safeClose(jedis); } } else { Jedis jedis = null; try { jedis = getJedisAgent().jedis(); - ScanResult> scan = null; - do { - scan = jedis.hscan(cacheName, scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); - for (Map.Entry key : scan.getResult()) { - jedis.hdel(cacheName, key.getKey()); - } - } while (!scan.isCompleteIteration()); + jedis.eval(lua, Collections.singletonList(cacheName), Collections.singletonList(cacheKey.substring(0, cacheKey.lastIndexOf("*")))); } finally { Streams.safeClose(jedis); } } } else { - ScanParams match = new ScanParams().match(cacheName + ":" + cacheKey); + String lua = "local keysToDelete = redis.call('KEYS', ARGV[1])\n" + + "for _, key in ipairs(keysToDelete) do\n" + + " redis.call('DEL', key)\n" + + "end"; if (getJedisAgent().isClusterMode()) { JedisCluster jedisCluster = getJedisAgent().getJedisClusterWrapper().getJedisCluster(); - List keys = new ArrayList<>(); for (JedisPool pool : jedisCluster.getClusterNodes().values()) { try (Jedis jedis = pool.getResource()) { - ScanResult scan = null; - do { - scan = jedis.scan(scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); - keys.addAll(scan.getResult()); - } while (!scan.isCompleteIteration()); + jedis.eval(lua, 0, cacheName + ":" + cacheKey); } } - Jedis jedis = null; - try { - jedis = getJedisAgent().jedis(); - for (String key : keys) { - jedis.del(key); - } - } finally { - Streams.safeClose(jedis); - } } else { Jedis jedis = null; try { jedis = getJedisAgent().jedis(); - ScanResult scan = null; - do { - scan = jedis.scan(scan == null ? ScanParams.SCAN_POINTER_START : scan.getStringCursor(), match); - for (String key : scan.getResult()) { - jedis.del(key.getBytes()); - } - } while (!scan.isCompleteIteration()); + jedis.eval(lua, 0, cacheName + ":" + cacheKey); } finally { Streams.safeClose(jedis); } diff --git a/nutz-plugins-wkcache/src/test/java/org/nutz/plugins/wkcache/test/MyCacheTest.java b/nutz-plugins-wkcache/src/test/java/org/nutz/plugins/wkcache/test/MyCacheTest.java index 2d1b9a09..857c68bf 100644 --- a/nutz-plugins-wkcache/src/test/java/org/nutz/plugins/wkcache/test/MyCacheTest.java +++ b/nutz-plugins-wkcache/src/test/java/org/nutz/plugins/wkcache/test/MyCacheTest.java @@ -9,7 +9,7 @@ /** * Created by wizzer on 2017/6/14. */ -@CacheDefaults(cacheName = "nutzwk_cache", cacheLiveTime = 3000) +@CacheDefaults(cacheName = "budwk_cache", cacheLiveTime = 3000) @IocBean public class MyCacheTest { @CacheResult(cacheName = "cache_time_1", cacheKey = "test")