diff --git a/framework/src/main/java/cn/lili/cache/Cache.java b/framework/src/main/java/cn/lili/cache/Cache.java index 0beaf69a..41d309dc 100644 --- a/framework/src/main/java/cn/lili/cache/Cache.java +++ b/framework/src/main/java/cn/lili/cache/Cache.java @@ -153,7 +153,15 @@ public interface Cache { * @param pattern 模糊key * @return 缓存中的数据 */ - List keys(String pattern); + List keys(String pattern); + + /** + * 原生阻塞keys 不推荐使用 + * + * @param pattern 模糊key + * @return 缓存中的数据 + */ + List keysBlock(String pattern); //-----------------------------------------------用于特殊场景,redis去重计数--------------------------------------------- @@ -211,11 +219,12 @@ public interface Cache { * @return 计数器结果 */ Long incr(String key, long liveTime); + /** * redis 计数器 累加 * 注:到达liveTime之后,该次增加取消,即自动-1,而不是redis值为空 * - * @param key 为累计的key,同一key每次调用则值 +1 + * @param key 为累计的key,同一key每次调用则值 +1 * @return 计数器结果 */ Long incr(String key); diff --git a/framework/src/main/java/cn/lili/cache/impl/RedisCache.java b/framework/src/main/java/cn/lili/cache/impl/RedisCache.java index bbfb5c54..a5e8aeec 100644 --- a/framework/src/main/java/cn/lili/cache/impl/RedisCache.java +++ b/framework/src/main/java/cn/lili/cache/impl/RedisCache.java @@ -90,14 +90,13 @@ public class RedisCache implements Cache { */ @Override public void vagueDel(Object key) { - Set keys = redisTemplate.keys(key + "*"); + List keys = this.keys(key + "*"); redisTemplate.delete(keys); } @Override public void clear() { - - Set keys = redisTemplate.keys("*"); + List keys = this.keys("*"); redisTemplate.delete(keys); } @@ -133,8 +132,8 @@ public class RedisCache implements Cache { * @return 模糊匹配key */ @Override - public List keys(String pattern) { - List keys = new ArrayList<>(); + public List keys(String pattern) { + List keys = new ArrayList<>(); this.scan(pattern, item -> { //符合条件的key String key = new String(item, StandardCharsets.UTF_8); @@ -143,6 +142,13 @@ public class RedisCache implements Cache { return keys; } + @Override + public List keysBlock(String pattern) { + Set set = redisTemplate.keys(pattern); + List list = new ArrayList<>(); + list.addAll(set); + return list; + } /** * scan 实现 diff --git a/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java b/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java index a048a3be..38fec97a 100644 --- a/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java +++ b/manager-api/src/test/java/cn/lili/test/CacheTest/CacheTest.java @@ -1,5 +1,6 @@ package cn.lili.test.CacheTest; +import cn.hutool.json.JSONUtil; import cn.lili.cache.Cache; import cn.lili.cache.CachePrefix; import cn.lili.modules.statistics.util.StatisticsSuffix; @@ -122,4 +123,51 @@ class CacheTest { Assertions.assertTrue(true); } + + @Test + void scanTests() { + + for (int i = 0; i < 1000000; i++) { + cache.put("scan" + i, i); + } + Date date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keys("scan999999*"))); + + System.out.println("100w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + + for (int i = 1000000; i < 5000000; i++) { + cache.put("scan" + i, i); + } + + date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keys("scan999999*"))); + System.out.println("600w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + } + + // scan 慢些,但是在缓存更多的情况下,表现更好,虽然用时更久,但是不会阻塞其他读写 + // + //["scan999999"] + //redisTemplate scan 500w数据耗时 + //2985 + //["scan999999"] + //redisTemplate keys 500w数据耗时 + //1073 + @Test + void testKsysVsScan() { + Date date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keys("scan999999*"))); + System.out.println("redisTemplate scan 500w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + date = new Date(); + System.out.println(JSONUtil.toJsonStr(cache.keysBlock("scan999999*"))); + System.out.println("redisTemplate keys 500w数据耗时"); + System.out.println(new Date().getTime() - date.getTime()); + + } + }