CacheSource增加linsert方法

This commit is contained in:
redkale
2023-06-26 16:51:43 +08:00
parent acee7cdfb0
commit 87899d514b
2 changed files with 154 additions and 16 deletions

View File

@@ -958,6 +958,21 @@ public final class CacheMemorySource extends AbstractCacheSource {
}, getExecutor());
}
@Override
public CompletableFuture<Long> 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 <T> CompletableFuture<Set<T>> 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<Long> 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 <T> CompletableFuture<Set<T>> smembersAsync(final String key, final Type componentType) {
return getAsync(key, componentType);
@@ -1084,6 +1084,70 @@ public final class CacheMemorySource extends AbstractCacheSource {
}, getExecutor());
}
@Override
public <T> CompletableFuture<T> lindexAsync(String key, Type componentType, int index) {
return supplyAsync(() -> {
List<T> 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 <T> CompletableFuture<Long> linsertBeforeAsync(String key, Type componentType, T pivot, T value) {
return linsertAsync(key, componentType, true, pivot, value);
}
@Override
public <T> CompletableFuture<Long> linsertAfterAsync(String key, Type componentType, T pivot, T value) {
return linsertAsync(key, componentType, false, pivot, value);
}
protected <T> CompletableFuture<Long> 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<T> list = new ArrayList<>(entry.listValue);
int pos = list.indexOf(pivot);
if (pos < 0) {
return -1L;
}
List<T> 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 <T> CompletableFuture<Void> saddAsync(final String key, final Type componentType, T... values) {
return runAsync(() -> {
@@ -1736,7 +1800,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
ConcurrentHashMap<String, Serializable> mapValue;
final ReentrantLock lock = new ReentrantLock();
private final ReentrantLock lock = new ReentrantLock();
Set<T> 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;
}

View File

@@ -402,6 +402,42 @@ public interface CacheSource extends Resourcable {
}
//------------------------ 列表 List ------------------------
default <T> 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 <T> 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 <T> 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 <T> CompletableFuture<T> lindexAsync(String key, Type componentType, int index);
default CompletableFuture<String> lindexStringAsync(String key, int index) {
return lindexAsync(key, String.class, index);
}
default CompletableFuture<Long> lindexLongAsync(String key, int index) {
return lindexAsync(key, Long.class, index);
}
public <T> CompletableFuture<Long> linsertBeforeAsync(String key, Type componentType, T pivot, T value);
default CompletableFuture<Long> linsertBeforeStringAsync(String key, String pivot, String value) {
return linsertBeforeAsync(key, String.class, pivot, value);
}
default CompletableFuture<Long> linsertBeforeLongAsync(String key, Long pivot, Long value) {
return linsertBeforeAsync(key, Long.class, pivot, value);
}
public <T> CompletableFuture<Long> linsertAfterAsync(String key, Type componentType, T pivot, T value);
default CompletableFuture<Long> linsertAfterStringAsync(String key, String pivot, String value) {
return linsertAfterAsync(key, String.class, pivot, value);
}
default CompletableFuture<Long> linsertAfterLongAsync(String key, Long pivot, Long value) {
return linsertAfterAsync(key, Long.class, pivot, value);
}
public CompletableFuture<Long> llenAsync(String key);
public CompletableFuture<Void> ltrimAsync(String key, int start, int stop);