From 87899d514bd791362a4b6af33a799d3d69429325 Mon Sep 17 00:00:00 2001 From: redkale Date: Mon, 26 Jun 2023 16:51:43 +0800 Subject: [PATCH] =?UTF-8?q?CacheSource=E5=A2=9E=E5=8A=A0linsert=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 | 104 +++++++++++++++--- .../java/org/redkale/source/CacheSource.java | 66 +++++++++++ 2 files changed, 154 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index 4049dea1a..5ed478e57 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -958,6 +958,21 @@ public final class CacheMemorySource extends AbstractCacheSource { }, getExecutor()); } + @Override + public CompletableFuture sinterstoreAsync(final String key, final String srcKey, final String... srcKey2s) { + return supplyAsync(() -> { + Set rs = sinter(srcKey, Object.class, srcKey2s); + if (container.containsKey(key)) { + Set set = container.get(srcKey).csetValue; + set.clear(); + set.addAll(rs); + } else { + appendSetItem(CacheEntryType.SET_OBJECT, key, rs); + } + return (long) rs.size(); + }, getExecutor()); + } + @Override public CompletableFuture> sunionAsync(final String key, final Type componentType, final String... key2s) { return supplyAsync(() -> { @@ -992,21 +1007,6 @@ public final class CacheMemorySource extends AbstractCacheSource { }, getExecutor()); } - @Override - public CompletableFuture sinterstoreAsync(final String key, final String srcKey, final String... srcKey2s) { - return supplyAsync(() -> { - Set rs = sinter(srcKey, Object.class, srcKey2s); - if (container.containsKey(key)) { - Set set = container.get(srcKey).csetValue; - set.clear(); - set.addAll(rs); - } else { - appendSetItem(CacheEntryType.SET_OBJECT, key, rs); - } - return (long) rs.size(); - }, getExecutor()); - } - @Override public CompletableFuture> smembersAsync(final String key, final Type componentType) { return getAsync(key, componentType); @@ -1084,6 +1084,70 @@ public final class CacheMemorySource extends AbstractCacheSource { }, getExecutor()); } + @Override + public CompletableFuture lindexAsync(String key, Type componentType, int index) { + return supplyAsync(() -> { + List list = (List) get(key, Object.class); + if (list == null || list.isEmpty()) { + return null; + } + int pos = index >= 0 ? index : list.size() + index; + return pos >= list.size() ? null : list.get(pos); + }, getExecutor()); + } + + @Override + public CompletableFuture linsertBeforeAsync(String key, Type componentType, T pivot, T value) { + return linsertAsync(key, componentType, true, pivot, value); + } + + @Override + public CompletableFuture linsertAfterAsync(String key, Type componentType, T pivot, T value) { + return linsertAsync(key, componentType, false, pivot, value); + } + + protected CompletableFuture linsertAsync(String key, Type componentType, boolean before, T pivot, T value) { + return supplyAsync(() -> { + CacheEntry entry = container.get(key); + if (entry == null || !entry.isListCacheType() || entry.listValue == null) { + return 0L; + } + entry.lock(); + try { + List list = new ArrayList<>(entry.listValue); + int pos = list.indexOf(pivot); + if (pos < 0) { + return -1L; + } + List newList = new ArrayList<>(); + if (before) { + if (pos == 0) { + newList.add(value); + newList.addAll(list); + } else { + newList.addAll(list.subList(0, pos)); + newList.add(value); + newList.addAll(list.subList(pos, list.size())); + } + } else { + if (pos == list.size() - 1) { + newList.addAll(list); + newList.add(value); + } else { + newList.addAll(list.subList(0, pos + 1)); + newList.add(value); + newList.addAll(list.subList(pos + 1, list.size())); + } + } + entry.listValue.clear(); + entry.listValue.addAll(newList); + return 1L; + } finally { + entry.unlock(); + } + }, getExecutor()); + } + @Override public CompletableFuture saddAsync(final String key, final Type componentType, T... values) { return runAsync(() -> { @@ -1736,7 +1800,7 @@ public final class CacheMemorySource extends AbstractCacheSource { ConcurrentHashMap mapValue; - final ReentrantLock lock = new ReentrantLock(); + private final ReentrantLock lock = new ReentrantLock(); Set csetValue; @@ -1787,6 +1851,14 @@ public final class CacheMemorySource extends AbstractCacheSource { return expireSeconds > 0 && (lastAccessed + expireSeconds * 1000) < System.currentTimeMillis(); } + public void lock() { + lock.lock(); + } + + public void unlock() { + lock.unlock(); + } + public CacheEntryType getCacheType() { return cacheType; } diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 9a8871d51..54bff6eb5 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -402,6 +402,42 @@ public interface CacheSource extends Resourcable { } //------------------------ 列表 List ------------------------ + default T lindex(String key, Type componentType, int index) { + return (T) lindexAsync(key, componentType, index).join(); + } + + default String lindexString(String key, int index) { + return lindex(key, String.class, index); + } + + default Long lindexLong(String key, int index) { + return lindex(key, Long.class, index); + } + + default long linsertBefore(String key, Type componentType, T pivot, T value) { + return linsertBeforeAsync(key, componentType, pivot, value).join(); + } + + default long linsertBeforeString(String key, String pivot, String value) { + return linsertBefore(key, String.class, pivot, value); + } + + default long linsertBeforeLong(String key, Long pivot, Long value) { + return linsertBefore(key, Long.class, pivot, value); + } + + default long linsertAfter(String key, Type componentType, T pivot, T value) { + return linsertAfterAsync(key, componentType, pivot, value).join(); + } + + default long linsertAfterString(String key, String pivot, String value) { + return linsertAfter(key, String.class, pivot, value); + } + + default long linsertAfterLong(String key, Long pivot, Long value) { + return linsertAfter(key, Long.class, pivot, value); + } + default long llen(String key) { return llenAsync(key).join(); } @@ -1149,6 +1185,36 @@ public interface CacheSource extends Resourcable { } //------------------------ 列表 List ------------------------ + public CompletableFuture lindexAsync(String key, Type componentType, int index); + + default CompletableFuture lindexStringAsync(String key, int index) { + return lindexAsync(key, String.class, index); + } + + default CompletableFuture lindexLongAsync(String key, int index) { + return lindexAsync(key, Long.class, index); + } + + public CompletableFuture linsertBeforeAsync(String key, Type componentType, T pivot, T value); + + default CompletableFuture linsertBeforeStringAsync(String key, String pivot, String value) { + return linsertBeforeAsync(key, String.class, pivot, value); + } + + default CompletableFuture linsertBeforeLongAsync(String key, Long pivot, Long value) { + return linsertBeforeAsync(key, Long.class, pivot, value); + } + + public CompletableFuture linsertAfterAsync(String key, Type componentType, T pivot, T value); + + default CompletableFuture linsertAfterStringAsync(String key, String pivot, String value) { + return linsertAfterAsync(key, String.class, pivot, value); + } + + default CompletableFuture linsertAfterLongAsync(String key, Long pivot, Long value) { + return linsertAfterAsync(key, Long.class, pivot, value); + } + public CompletableFuture llenAsync(String key); public CompletableFuture ltrimAsync(String key, int start, int stop);