CacheSource增加linsert方法
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user