From cc0f35ce70a21e0126c6fe31665c0825d73148f6 Mon Sep 17 00:00:00 2001 From: redkale Date: Sat, 17 Jun 2023 14:01:05 +0800 Subject: [PATCH] =?UTF-8?q?CacheSource=E5=A2=9E=E5=8A=A0zrange=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/source/CacheMemorySource.java | 43 +++++++++++ .../java/org/redkale/source/CacheSource.java | 74 +++++++++++++++++-- 2 files changed, 111 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index b53a7a914..d55786362 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -1401,6 +1401,49 @@ public final class CacheMemorySource extends AbstractCacheSource { }, getExecutor()); } + @Override + public CompletableFuture> zrangeAsync(String key, int start, int stop) { + return supplyAsync(() -> { + if (key == null) { + return new ArrayList<>(); + } + CacheEntry entry = container.get(key); + if (entry == null || !entry.isSetCacheType() || entry.csetValue == null) { + return new ArrayList<>(); + } + List list = new ArrayList<>(); + Set sets = entry.csetValue; + long c = 0; + for (CacheScoredValue v : sets) { + if (c >= start && (stop < 0 || c <= stop)) { + list.add(v.getValue()); + } + c++; + } + return list; + }, getExecutor()); + } + + @Override + public CompletableFuture> zscanAsync(String key, Type scoreType, AtomicLong cursor, int limit, String pattern) { + return supplyAsync(() -> { + if (key == null) { + return new ArrayList<>(); + } + CacheEntry entry = container.get(key); + if (entry == null || entry.isExpired() || entry.csetValue == null) { + return new ArrayList(); + } + Set sets = entry.csetValue; + if (Utility.isEmpty(pattern)) { + return sets.stream().collect(Collectors.toList()); + } else { + Predicate regx = Pattern.compile(pattern.replace("*", ".*")).asPredicate(); + return sets.stream().filter(en -> regx.test(en.getValue())).collect(Collectors.toList()); + } + }, getExecutor()); + } + @Override public CompletableFuture zremAsync(String key, String... members) { return supplyAsync(() -> { diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index e4057871d..4e57a40ea 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -788,6 +788,42 @@ public interface CacheSource extends Resourcable { return zrevrankAsync(key, member).join(); } + default List zrange(String key, int start, int stop) { + return zrangeAsync(key, start, stop).join(); + } + + default List zscan(String key, Type scoreType, AtomicLong cursor, int limit, String pattern) { + return zscanAsync(key, scoreType, cursor, limit, pattern).join(); + } + + default List zscanInteger(String key, AtomicLong cursor, int limit, String pattern) { + return zscan(key, Integer.class, cursor, limit, pattern); + } + + default List zscanLong(String key, AtomicLong cursor, int limit, String pattern) { + return zscan(key, Long.class, cursor, limit, pattern); + } + + default List zscanDouble(String key, AtomicLong cursor, int limit, String pattern) { + return zscan(key, Double.class, cursor, limit, pattern); + } + + default List zscan(String key, Type scoreType, AtomicLong cursor, int limit) { + return zscan(key, scoreType, cursor, limit, null); + } + + default List zscanInteger(String key, AtomicLong cursor, int limit) { + return zscan(key, Integer.class, cursor, limit, null); + } + + default List zscanLong(String key, AtomicLong cursor, int limit) { + return zscan(key, Long.class, cursor, limit, null); + } + + default List zscanDouble(String key, AtomicLong cursor, int limit) { + return zscan(key, Double.class, cursor, limit, null); + } + //---------------------- CompletableFuture 异步版 --------------------------------- public CompletableFuture isOpenAsync(); @@ -1401,12 +1437,38 @@ public interface CacheSource extends Resourcable { public CompletableFuture zrevrankAsync(String key, String member); -// -// public CompletableFuture> zscanAsync(String key, Type componentType, AtomicLong cursor, int limit, String pattern); -// -// default CompletableFuture> zscanAsync(String key, Type componentType, AtomicLong cursor, int limit) { -// return zscanAsync(key, componentType, cursor, limit, null); -// } + public CompletableFuture> zrangeAsync(String key, int start, int stop); + + public CompletableFuture> zscanAsync(String key, Type scoreType, AtomicLong cursor, int limit, String pattern); + + default CompletableFuture> zscanIntegerAsync(String key, AtomicLong cursor, int limit, String pattern) { + return zscanAsync(key, Integer.class, cursor, limit, pattern); + } + + default CompletableFuture> zscanLongAsync(String key, AtomicLong cursor, int limit, String pattern) { + return zscanAsync(key, Long.class, cursor, limit, pattern); + } + + default CompletableFuture> zscanDoubleAsync(String key, AtomicLong cursor, int limit, String pattern) { + return zscanAsync(key, Double.class, cursor, limit, pattern); + } + + default CompletableFuture> zscanAsync(String key, Type scoreType, AtomicLong cursor, int limit) { + return zscanAsync(key, scoreType, cursor, limit, null); + } + + default CompletableFuture> zscanIntegerAsync(String key, AtomicLong cursor, int limit) { + return zscanAsync(key, Integer.class, cursor, limit, null); + } + + default CompletableFuture> zscanLongAsync(String key, AtomicLong cursor, int limit) { + return zscanAsync(key, Long.class, cursor, limit, null); + } + + default CompletableFuture> zscanDoubleAsync(String key, AtomicLong cursor, int limit) { + return zscanAsync(key, Double.class, cursor, limit, null); + } + //-------------------------- 过期方法 ---------------------------------- @Deprecated(since = "2.8.0") public CompletableFuture> getCollectionAsync(String key, Type componentType);