CacheSource中的key固定使用String类型
This commit is contained in:
@@ -273,10 +273,10 @@ public abstract class NodeServer {
|
|||||||
source = (CacheSource) Sncp.createLocalService(serverClassLoader, resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService));
|
source = (CacheSource) Sncp.createLocalService(serverClassLoader, resourceName, sourceType, appResFactory, appTranFactory, sncpAddr, groups, Sncp.getConf(srcService));
|
||||||
Type genericType = field.getGenericType();
|
Type genericType = field.getGenericType();
|
||||||
ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null;
|
ParameterizedType pt = (genericType instanceof ParameterizedType) ? (ParameterizedType) genericType : null;
|
||||||
Type valType = pt == null ? null : pt.getActualTypeArguments()[1];
|
Type valType = pt == null ? null : pt.getActualTypeArguments()[0];
|
||||||
if (sourceType == CacheMemorySource.class) {
|
if (sourceType == CacheMemorySource.class) {
|
||||||
CacheMemorySource memorySource = (CacheMemorySource) source;
|
CacheMemorySource memorySource = (CacheMemorySource) source;
|
||||||
memorySource.setStoreType(pt == null ? Serializable.class : (Class) pt.getActualTypeArguments()[0], valType instanceof Class ? (Class) valType : Object.class);
|
memorySource.setStoreType(valType instanceof Class ? (Class) valType : Object.class);
|
||||||
if (field.getAnnotation(Transient.class) != null) memorySource.setNeedStore(false); //必须在setStoreType之后
|
if (field.getAnnotation(Transient.class) != null) memorySource.setNeedStore(false); //必须在setStoreType之后
|
||||||
}
|
}
|
||||||
application.cacheSources.add((CacheSource) source);
|
application.cacheSources.add((CacheSource) source);
|
||||||
|
|||||||
@@ -28,11 +28,14 @@ import org.redkale.util.*;
|
|||||||
*/
|
*/
|
||||||
public abstract class WebSocketNode {
|
public abstract class WebSocketNode {
|
||||||
|
|
||||||
|
@Comment("存储用户ID的key前缀")
|
||||||
|
public static final String SOURCE_SNCP_USERID_PREFIX = "wsuid_";
|
||||||
|
|
||||||
@Comment("存储当前SNCP节点列表的key")
|
@Comment("存储当前SNCP节点列表的key")
|
||||||
public static final String SOURCE_SNCP_NODES_KEY = "redkale_sncpnodes";
|
public static final String SOURCE_SNCP_NODES_KEY = "ws_sncpnodes";
|
||||||
|
|
||||||
@Comment("存储当前用户数量的key")
|
@Comment("存储当前用户数量的key")
|
||||||
public static final String SOURCE_USER_COUNT_KEY = "redkale_usercount";
|
public static final String SOURCE_USER_COUNT_KEY = "ws_usercount";
|
||||||
|
|
||||||
protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
|
protected final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
|
||||||
|
|
||||||
@@ -52,7 +55,7 @@ public abstract class WebSocketNode {
|
|||||||
//集合包含 localSncpAddress
|
//集合包含 localSncpAddress
|
||||||
//如果不是分布式(没有SNCP),sncpNodeAddresses 将不会被用到
|
//如果不是分布式(没有SNCP),sncpNodeAddresses 将不会被用到
|
||||||
@Resource(name = "$_nodes")
|
@Resource(name = "$_nodes")
|
||||||
protected CacheSource<Serializable, InetSocketAddress> sncpNodeAddresses;
|
protected CacheSource<InetSocketAddress> sncpNodeAddresses;
|
||||||
|
|
||||||
//当前节点的本地WebSocketEngine
|
//当前节点的本地WebSocketEngine
|
||||||
protected WebSocketEngine localEngine;
|
protected WebSocketEngine localEngine;
|
||||||
@@ -124,7 +127,7 @@ public abstract class WebSocketNode {
|
|||||||
* @return 地址列表
|
* @return 地址列表
|
||||||
*/
|
*/
|
||||||
public CompletableFuture<Collection<InetSocketAddress>> getRpcNodeAddresses(final Serializable userid) {
|
public CompletableFuture<Collection<InetSocketAddress>> getRpcNodeAddresses(final Serializable userid) {
|
||||||
if (this.sncpNodeAddresses != null) return this.sncpNodeAddresses.getCollectionAsync(userid);
|
if (this.sncpNodeAddresses != null) return this.sncpNodeAddresses.getCollectionAsync(SOURCE_SNCP_USERID_PREFIX + userid);
|
||||||
List<InetSocketAddress> rs = new ArrayList<>();
|
List<InetSocketAddress> rs = new ArrayList<>();
|
||||||
rs.add(this.localSncpAddress);
|
rs.add(this.localSncpAddress);
|
||||||
return CompletableFuture.completedFuture(rs);
|
return CompletableFuture.completedFuture(rs);
|
||||||
@@ -165,7 +168,7 @@ public abstract class WebSocketNode {
|
|||||||
if (this.localEngine != null && this.sncpNodeAddresses == null) {
|
if (this.localEngine != null && this.sncpNodeAddresses == null) {
|
||||||
return CompletableFuture.completedFuture(this.localEngine.existsLocalWebSocket(userid));
|
return CompletableFuture.completedFuture(this.localEngine.existsLocalWebSocket(userid));
|
||||||
}
|
}
|
||||||
return this.sncpNodeAddresses.existsAsync(userid);
|
return this.sncpNodeAddresses.existsAsync(SOURCE_SNCP_USERID_PREFIX + userid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -199,7 +202,7 @@ public abstract class WebSocketNode {
|
|||||||
return localFuture;
|
return localFuture;
|
||||||
}
|
}
|
||||||
//远程节点关闭
|
//远程节点关闭
|
||||||
CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(userid);
|
CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(SOURCE_SNCP_USERID_PREFIX + userid);
|
||||||
CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
|
CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
|
||||||
if (finest) logger.finest("websocket found userid:" + userid + " on " + addrs);
|
if (finest) logger.finest("websocket found userid:" + userid + " on " + addrs);
|
||||||
if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(0);
|
if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(0);
|
||||||
@@ -402,7 +405,7 @@ public abstract class WebSocketNode {
|
|||||||
return this.localEngine.broadcastMessage(message, last);
|
return this.localEngine.broadcastMessage(message, last);
|
||||||
}
|
}
|
||||||
CompletableFuture<Integer> localFuture = this.localEngine == null ? null : this.localEngine.broadcastMessage(message, last);
|
CompletableFuture<Integer> localFuture = this.localEngine == null ? null : this.localEngine.broadcastMessage(message, last);
|
||||||
CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync("redkale_sncpnodes");
|
CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(SOURCE_SNCP_NODES_KEY);
|
||||||
CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
|
CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
|
||||||
if (finest) logger.finest("websocket broadcast message on " + addrs);
|
if (finest) logger.finest("websocket broadcast message on " + addrs);
|
||||||
if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(0);
|
if (addrs == null || addrs.isEmpty()) return CompletableFuture.completedFuture(0);
|
||||||
@@ -427,7 +430,7 @@ public abstract class WebSocketNode {
|
|||||||
return localFuture == null ? CompletableFuture.completedFuture(RETCODE_GROUP_EMPTY) : localFuture;
|
return localFuture == null ? CompletableFuture.completedFuture(RETCODE_GROUP_EMPTY) : localFuture;
|
||||||
}
|
}
|
||||||
//远程节点发送消息
|
//远程节点发送消息
|
||||||
CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(userid);
|
CompletableFuture<Collection<InetSocketAddress>> addrsFuture = sncpNodeAddresses.getCollectionAsync(SOURCE_SNCP_USERID_PREFIX + userid);
|
||||||
CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
|
CompletableFuture<Integer> remoteFuture = addrsFuture.thenCompose((Collection<InetSocketAddress> addrs) -> {
|
||||||
if (addrs == null || addrs.isEmpty()) {
|
if (addrs == null || addrs.isEmpty()) {
|
||||||
if (finer) logger.finer("websocket not found userid:" + userid + " on any node ");
|
if (finer) logger.finer("websocket not found userid:" + userid + " on any node ");
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public class WebSocketNodeService extends WebSocketNode implements Service {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> connect(Serializable userid, InetSocketAddress sncpAddr) {
|
public CompletableFuture<Void> connect(Serializable userid, InetSocketAddress sncpAddr) {
|
||||||
CompletableFuture<Void> future = sncpNodeAddresses.appendSetItemAsync(userid, sncpAddr);
|
CompletableFuture<Void> future = sncpNodeAddresses.appendSetItemAsync(SOURCE_SNCP_USERID_PREFIX + userid, sncpAddr);
|
||||||
future = future.thenAccept((a) -> sncpNodeAddresses.appendSetItemAsync(SOURCE_SNCP_NODES_KEY, sncpAddr));
|
future = future.thenAccept((a) -> sncpNodeAddresses.appendSetItemAsync(SOURCE_SNCP_NODES_KEY, sncpAddr));
|
||||||
if (finest) logger.finest(WebSocketNodeService.class.getSimpleName() + ".event: " + userid + " connect from " + sncpAddr);
|
if (finest) logger.finest(WebSocketNodeService.class.getSimpleName() + ".event: " + userid + " connect from " + sncpAddr);
|
||||||
return future;
|
return future;
|
||||||
@@ -83,7 +83,7 @@ public class WebSocketNodeService extends WebSocketNode implements Service {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> disconnect(Serializable userid, InetSocketAddress sncpAddr) {
|
public CompletableFuture<Void> disconnect(Serializable userid, InetSocketAddress sncpAddr) {
|
||||||
CompletableFuture<Void> future = sncpNodeAddresses.removeSetItemAsync(userid, sncpAddr);
|
CompletableFuture<Void> future = sncpNodeAddresses.removeSetItemAsync(SOURCE_SNCP_USERID_PREFIX + userid, sncpAddr);
|
||||||
if (finest) logger.finest(WebSocketNodeService.class.getSimpleName() + ".event: " + userid + " disconnect from " + sncpAddr);
|
if (finest) logger.finest(WebSocketNodeService.class.getSimpleName() + ".event: " + userid + " disconnect from " + sncpAddr);
|
||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import org.redkale.util.*;
|
|||||||
/**
|
/**
|
||||||
* CacheSource的默认实现--内存缓存
|
* CacheSource的默认实现--内存缓存
|
||||||
*
|
*
|
||||||
* @param <K> key类型
|
|
||||||
* @param <V> value类型
|
* @param <V> value类型
|
||||||
* <p>
|
* <p>
|
||||||
* 详情见: https://redkale.org
|
* 详情见: https://redkale.org
|
||||||
@@ -30,7 +29,7 @@ import org.redkale.util.*;
|
|||||||
@Local
|
@Local
|
||||||
@AutoLoad(false)
|
@AutoLoad(false)
|
||||||
@ResourceType(CacheSource.class)
|
@ResourceType(CacheSource.class)
|
||||||
public class CacheMemorySource<K extends Serializable, V extends Object> extends AbstractService implements CacheSource<K, V>, Service, AutoCloseable, Resourcable {
|
public class CacheMemorySource<V extends Object> extends AbstractService implements CacheSource<V>, Service, AutoCloseable, Resourcable {
|
||||||
|
|
||||||
@Resource(name = "APP_HOME")
|
@Resource(name = "APP_HOME")
|
||||||
private File home;
|
private File home;
|
||||||
@@ -40,8 +39,6 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
|
|
||||||
private boolean needStore;
|
private boolean needStore;
|
||||||
|
|
||||||
private Class keyType;
|
|
||||||
|
|
||||||
private Type objValueType;
|
private Type objValueType;
|
||||||
|
|
||||||
private Type setValueType;
|
private Type setValueType;
|
||||||
@@ -54,20 +51,19 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
|
|
||||||
private final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
|
private final Logger logger = Logger.getLogger(this.getClass().getSimpleName());
|
||||||
|
|
||||||
protected final ConcurrentHashMap<K, CacheEntry<K, Object>> container = new ConcurrentHashMap<>();
|
protected final ConcurrentHashMap<String, CacheEntry<Object>> container = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@RpcRemote
|
@RpcRemote
|
||||||
protected CacheSource<K, V> remoteSource;
|
protected CacheSource<V> remoteSource;
|
||||||
|
|
||||||
public CacheMemorySource() {
|
public CacheMemorySource() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public final CacheMemorySource setStoreType(Class keyType, Class valueType) {
|
public final CacheMemorySource setStoreType(Class valueType) {
|
||||||
this.keyType = keyType;
|
|
||||||
this.objValueType = valueType;
|
this.objValueType = valueType;
|
||||||
this.setValueType = TypeToken.createParameterizedType(null, CopyOnWriteArraySet.class, valueType);
|
this.setValueType = TypeToken.createParameterizedType(null, CopyOnWriteArraySet.class, valueType);
|
||||||
this.listValueType = TypeToken.createParameterizedType(null, ConcurrentLinkedQueue.class, valueType);
|
this.listValueType = TypeToken.createParameterizedType(null, ConcurrentLinkedQueue.class, valueType);
|
||||||
this.setNeedStore(this.keyType != null && this.keyType != Serializable.class && this.objValueType != null);
|
this.setNeedStore(this.objValueType != null);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,14 +75,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
public void init(AnyValue conf) {
|
public void init(AnyValue conf) {
|
||||||
final CacheMemorySource self = this;
|
final CacheMemorySource self = this;
|
||||||
AnyValue prop = conf == null ? null : conf.getAnyValue("property");
|
AnyValue prop = conf == null ? null : conf.getAnyValue("property");
|
||||||
if (keyType == null && prop != null) {
|
if (prop != null) {
|
||||||
String storeKeyStr = prop.getValue("key-type");
|
|
||||||
String storeValueStr = prop.getValue("value-type");
|
String storeValueStr = prop.getValue("value-type");
|
||||||
if (storeKeyStr != null && storeValueStr != null) {
|
if (storeValueStr != null) {
|
||||||
try {
|
try {
|
||||||
this.setStoreType(Thread.currentThread().getContextClassLoader().loadClass(storeKeyStr), Thread.currentThread().getContextClassLoader().loadClass(storeValueStr));
|
this.setStoreType(Thread.currentThread().getContextClassLoader().loadClass(storeValueStr));
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.log(Level.SEVERE, self.getClass().getSimpleName() + " load key & value store class (" + storeKeyStr + ", " + storeValueStr + ") error", e);
|
logger.log(Level.SEVERE, self.getClass().getSimpleName() + " load key & value store class (" + storeValueStr + ") error", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (prop.getBoolValue("store-ignore", false)) setNeedStore(false);
|
if (prop.getBoolValue("store-ignore", false)) setNeedStore(false);
|
||||||
@@ -105,7 +100,7 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
t.setDaemon(true);
|
t.setDaemon(true);
|
||||||
return t;
|
return t;
|
||||||
});
|
});
|
||||||
final List<K> keys = new ArrayList<>();
|
final List<String> keys = new ArrayList<>();
|
||||||
scheduler.scheduleWithFixedDelay(() -> {
|
scheduler.scheduleWithFixedDelay(() -> {
|
||||||
keys.clear();
|
keys.clear();
|
||||||
int now = (int) (System.currentTimeMillis() / 1000);
|
int now = (int) (System.currentTimeMillis() / 1000);
|
||||||
@@ -114,7 +109,7 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
keys.add(x.key);
|
keys.add(x.key);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
for (K key : keys) {
|
for (String key : keys) {
|
||||||
CacheEntry entry = container.remove(key);
|
CacheEntry entry = container.remove(key);
|
||||||
if (expireHandler != null && entry != null) expireHandler.accept(entry);
|
if (expireHandler != null && entry != null) expireHandler.accept(entry);
|
||||||
}
|
}
|
||||||
@@ -131,19 +126,18 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
File store = new File(home, "cache/" + resourceName());
|
File store = new File(home, "cache/" + resourceName());
|
||||||
if (!store.isFile() || !store.canRead()) return;
|
if (!store.isFile() || !store.canRead()) return;
|
||||||
LineNumberReader reader = new LineNumberReader(new FileReader(store));
|
LineNumberReader reader = new LineNumberReader(new FileReader(store));
|
||||||
if (this.keyType == null) this.keyType = Serializable.class;
|
|
||||||
if (this.objValueType == null) {
|
if (this.objValueType == null) {
|
||||||
this.objValueType = Object.class;
|
this.objValueType = Object.class;
|
||||||
this.setValueType = TypeToken.createParameterizedType(null, CopyOnWriteArraySet.class, this.objValueType);
|
this.setValueType = TypeToken.createParameterizedType(null, CopyOnWriteArraySet.class, this.objValueType);
|
||||||
this.listValueType = TypeToken.createParameterizedType(null, ConcurrentLinkedQueue.class, this.objValueType);
|
this.listValueType = TypeToken.createParameterizedType(null, ConcurrentLinkedQueue.class, this.objValueType);
|
||||||
}
|
}
|
||||||
final Type storeObjType = TypeToken.createParameterizedType(null, CacheEntry.class, keyType, objValueType);
|
final Type storeObjType = TypeToken.createParameterizedType(null, CacheEntry.class, objValueType);
|
||||||
final Type storeSetType = TypeToken.createParameterizedType(null, CacheEntry.class, keyType, setValueType);
|
final Type storeSetType = TypeToken.createParameterizedType(null, CacheEntry.class, setValueType);
|
||||||
final Type storeListType = TypeToken.createParameterizedType(null, CacheEntry.class, keyType, listValueType);
|
final Type storeListType = TypeToken.createParameterizedType(null, CacheEntry.class, listValueType);
|
||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
if (line.isEmpty()) continue;
|
if (line.isEmpty()) continue;
|
||||||
CacheEntry<K, Object> entry = convert.convertFrom(line.startsWith(CacheEntry.JSON_SET_KEY) ? storeSetType : (line.startsWith(CacheEntry.JSON_LIST_KEY) ? storeListType : storeObjType), line);
|
CacheEntry<Object> entry = convert.convertFrom(line.startsWith(CacheEntry.JSON_SET_KEY) ? storeSetType : (line.startsWith(CacheEntry.JSON_LIST_KEY) ? storeListType : storeObjType), line);
|
||||||
if (entry.isExpired()) continue;
|
if (entry.isExpired()) continue;
|
||||||
if (datasync && container.containsKey(entry.key)) continue; //已经同步了
|
if (datasync && container.containsKey(entry.key)) continue; //已经同步了
|
||||||
container.put(entry.key, entry);
|
container.put(entry.key, entry);
|
||||||
@@ -159,12 +153,12 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
if (client != null && client.getRemoteGroupTransport() != null) {
|
if (client != null && client.getRemoteGroupTransport() != null) {
|
||||||
super.runAsync(() -> {
|
super.runAsync(() -> {
|
||||||
try {
|
try {
|
||||||
CompletableFuture<List<CacheEntry<K, Object>>> listFuture = remoteSource.queryListAsync();
|
CompletableFuture<List<CacheEntry<Object>>> listFuture = remoteSource.queryListAsync();
|
||||||
listFuture.whenComplete((list, exp) -> {
|
listFuture.whenComplete((list, exp) -> {
|
||||||
if (exp != null) {
|
if (exp != null) {
|
||||||
logger.log(Level.FINEST, CacheSource.class.getSimpleName() + "(" + resourceName() + ") queryListAsync error", exp);
|
logger.log(Level.FINEST, CacheSource.class.getSimpleName() + "(" + resourceName() + ") queryListAsync error", exp);
|
||||||
} else {
|
} else {
|
||||||
for (CacheEntry<K, Object> entry : list) {
|
for (CacheEntry<Object> entry : list) {
|
||||||
container.put(entry.key, entry);
|
container.put(entry.key, entry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -196,10 +190,10 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
File store = new File(home, "cache/" + resourceName());
|
File store = new File(home, "cache/" + resourceName());
|
||||||
store.getParentFile().mkdirs();
|
store.getParentFile().mkdirs();
|
||||||
PrintStream stream = new PrintStream(store, "UTF-8");
|
PrintStream stream = new PrintStream(store, "UTF-8");
|
||||||
final Type storeObjType = TypeToken.createParameterizedType(null, CacheEntry.class, keyType, objValueType);
|
final Type storeObjType = TypeToken.createParameterizedType(null, CacheEntry.class, objValueType);
|
||||||
final Type storeSetType = TypeToken.createParameterizedType(null, CacheEntry.class, keyType, setValueType);
|
final Type storeSetType = TypeToken.createParameterizedType(null, CacheEntry.class, setValueType);
|
||||||
final Type storeListType = TypeToken.createParameterizedType(null, CacheEntry.class, keyType, listValueType);
|
final Type storeListType = TypeToken.createParameterizedType(null, CacheEntry.class, listValueType);
|
||||||
Collection<CacheEntry<K, Object>> entrys = container.values();
|
Collection<CacheEntry<Object>> entrys = container.values();
|
||||||
for (CacheEntry entry : entrys) {
|
for (CacheEntry entry : entrys) {
|
||||||
stream.println(convert.convertTo(entry.isSetCacheType() ? storeSetType : (entry.isListCacheType() ? storeListType : storeObjType), entry));
|
stream.println(convert.convertTo(entry.isSetCacheType() ? storeSetType : (entry.isListCacheType() ? storeListType : storeObjType), entry));
|
||||||
}
|
}
|
||||||
@@ -211,7 +205,7 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean exists(K key) {
|
public boolean exists(String key) {
|
||||||
if (key == null) return false;
|
if (key == null) return false;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null) return false;
|
if (entry == null) return false;
|
||||||
@@ -219,12 +213,12 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Boolean> existsAsync(final K key) {
|
public CompletableFuture<Boolean> existsAsync(final String key) {
|
||||||
return CompletableFuture.supplyAsync(() -> exists(key), getExecutor());
|
return CompletableFuture.supplyAsync(() -> exists(key), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public V get(K key) {
|
public V get(String key) {
|
||||||
if (key == null) return null;
|
if (key == null) return null;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null || entry.isExpired()) return null;
|
if (entry == null || entry.isExpired()) return null;
|
||||||
@@ -234,13 +228,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<V> getAsync(final K key) {
|
public CompletableFuture<V> getAsync(final String key) {
|
||||||
return CompletableFuture.supplyAsync(() -> get(key), getExecutor());
|
return CompletableFuture.supplyAsync(() -> get(key), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public V getAndRefresh(K key, final int expireSeconds) {
|
public V getAndRefresh(String key, final int expireSeconds) {
|
||||||
if (key == null) return null;
|
if (key == null) return null;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null || entry.isExpired()) return null;
|
if (entry == null || entry.isExpired()) return null;
|
||||||
@@ -252,13 +246,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<V> getAndRefreshAsync(final K key, final int expireSeconds) {
|
public CompletableFuture<V> getAndRefreshAsync(final String key, final int expireSeconds) {
|
||||||
return CompletableFuture.supplyAsync(() -> getAndRefresh(key, expireSeconds), getExecutor());
|
return CompletableFuture.supplyAsync(() -> getAndRefresh(key, expireSeconds), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void refresh(K key, final int expireSeconds) {
|
public void refresh(String key, final int expireSeconds) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null) return;
|
if (entry == null) return;
|
||||||
@@ -267,13 +261,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> refreshAsync(final K key, final int expireSeconds) {
|
public CompletableFuture<Void> refreshAsync(final String key, final int expireSeconds) {
|
||||||
return CompletableFuture.runAsync(() -> refresh(key, expireSeconds), getExecutor());
|
return CompletableFuture.runAsync(() -> refresh(key, expireSeconds), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void set(K key, V value) {
|
public void set(String key, V value) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
@@ -287,13 +281,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> setAsync(K key, V value) {
|
public CompletableFuture<Void> setAsync(String key, V value) {
|
||||||
return CompletableFuture.runAsync(() -> set(key, value), getExecutor());
|
return CompletableFuture.runAsync(() -> set(key, value), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void set(int expireSeconds, K key, V value) {
|
public void set(int expireSeconds, String key, V value) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
@@ -307,13 +301,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> setAsync(int expireSeconds, K key, V value) {
|
public CompletableFuture<Void> setAsync(int expireSeconds, String key, V value) {
|
||||||
return CompletableFuture.runAsync(() -> set(expireSeconds, key, value), getExecutor());
|
return CompletableFuture.runAsync(() -> set(expireSeconds, key, value), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void setExpireSeconds(K key, int expireSeconds) {
|
public void setExpireSeconds(String key, int expireSeconds) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null) return;
|
if (entry == null) return;
|
||||||
@@ -321,56 +315,56 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> setExpireSecondsAsync(final K key, final int expireSeconds) {
|
public CompletableFuture<Void> setExpireSecondsAsync(final String key, final int expireSeconds) {
|
||||||
return CompletableFuture.runAsync(() -> setExpireSeconds(key, expireSeconds), getExecutor());
|
return CompletableFuture.runAsync(() -> setExpireSeconds(key, expireSeconds), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void remove(K key) {
|
public void remove(String key) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
container.remove(key);
|
container.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> removeAsync(final K key) {
|
public CompletableFuture<Void> removeAsync(final String key) {
|
||||||
return CompletableFuture.runAsync(() -> remove(key), getExecutor());
|
return CompletableFuture.runAsync(() -> remove(key), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<V> getCollection(final K key) {
|
public Collection<V> getCollection(final String key) {
|
||||||
return (Collection<V>) get(key);
|
return (Collection<V>) get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Collection<V>> getCollectionAsync(final K key) {
|
public CompletableFuture<Collection<V>> getCollectionAsync(final String key) {
|
||||||
return CompletableFuture.supplyAsync(() -> getCollection(key), getExecutor());
|
return CompletableFuture.supplyAsync(() -> getCollection(key), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCollectionSize(final K key) {
|
public int getCollectionSize(final String key) {
|
||||||
Collection<V> collection = (Collection<V>) get(key);
|
Collection<V> collection = (Collection<V>) get(key);
|
||||||
return collection == null ? 0 : collection.size();
|
return collection == null ? 0 : collection.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Integer> getCollectionSizeAsync(final K key) {
|
public CompletableFuture<Integer> getCollectionSizeAsync(final String key) {
|
||||||
return CompletableFuture.supplyAsync(() -> getCollectionSize(key), getExecutor());
|
return CompletableFuture.supplyAsync(() -> getCollectionSize(key), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<V> getCollectionAndRefresh(final K key, final int expireSeconds) {
|
public Collection<V> getCollectionAndRefresh(final String key, final int expireSeconds) {
|
||||||
return (Collection<V>) getAndRefresh(key, expireSeconds);
|
return (Collection<V>) getAndRefresh(key, expireSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Collection<V>> getCollectionAndRefreshAsync(final K key, final int expireSeconds) {
|
public CompletableFuture<Collection<V>> getCollectionAndRefreshAsync(final String key, final int expireSeconds) {
|
||||||
return CompletableFuture.supplyAsync(() -> getCollectionAndRefresh(key, expireSeconds), getExecutor());
|
return CompletableFuture.supplyAsync(() -> getCollectionAndRefresh(key, expireSeconds), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void appendListItem(K key, V value) {
|
public void appendListItem(String key, V value) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null || !entry.isListCacheType() || entry.listValue == null) {
|
if (entry == null || !entry.isListCacheType() || entry.listValue == null) {
|
||||||
@@ -385,13 +379,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> appendListItemAsync(final K key, final V value) {
|
public CompletableFuture<Void> appendListItemAsync(final String key, final V value) {
|
||||||
return CompletableFuture.runAsync(() -> appendListItem(key, value), getExecutor());
|
return CompletableFuture.runAsync(() -> appendListItem(key, value), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void removeListItem(K key, V value) {
|
public void removeListItem(String key, V value) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null || entry.listValue == null) return;
|
if (entry == null || entry.listValue == null) return;
|
||||||
@@ -399,13 +393,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> removeListItemAsync(final K key, final V value) {
|
public CompletableFuture<Void> removeListItemAsync(final String key, final V value) {
|
||||||
return CompletableFuture.runAsync(() -> removeListItem(key, value), getExecutor());
|
return CompletableFuture.runAsync(() -> removeListItem(key, value), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void appendSetItem(K key, V value) {
|
public void appendSetItem(String key, V value) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null || !entry.isSetCacheType() || entry.setValue == null) {
|
if (entry == null || !entry.isSetCacheType() || entry.setValue == null) {
|
||||||
@@ -420,13 +414,13 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> appendSetItemAsync(final K key, final V value) {
|
public CompletableFuture<Void> appendSetItemAsync(final String key, final V value) {
|
||||||
return CompletableFuture.runAsync(() -> appendSetItem(key, value), getExecutor());
|
return CompletableFuture.runAsync(() -> appendSetItem(key, value), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@RpcMultiRun
|
@RpcMultiRun
|
||||||
public void removeSetItem(K key, V value) {
|
public void removeSetItem(String key, V value) {
|
||||||
if (key == null) return;
|
if (key == null) return;
|
||||||
CacheEntry entry = container.get(key);
|
CacheEntry entry = container.get(key);
|
||||||
if (entry == null || entry.setValue == null) return;
|
if (entry == null || entry.setValue == null) return;
|
||||||
@@ -434,12 +428,12 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<Void> removeSetItemAsync(final K key, final V value) {
|
public CompletableFuture<Void> removeSetItemAsync(final String key, final V value) {
|
||||||
return CompletableFuture.runAsync(() -> removeSetItem(key, value), getExecutor());
|
return CompletableFuture.runAsync(() -> removeSetItem(key, value), getExecutor());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<K> queryKeys() {
|
public List<String> queryKeys() {
|
||||||
return new ArrayList<>(container.keySet());
|
return new ArrayList<>(container.keySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -449,17 +443,17 @@ public class CacheMemorySource<K extends Serializable, V extends Object> extends
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<CacheEntry<K, Object>>> queryListAsync() {
|
public CompletableFuture<List<CacheEntry<Object>>> queryListAsync() {
|
||||||
return CompletableFuture.completedFuture(new ArrayList<>(container.values()));
|
return CompletableFuture.completedFuture(new ArrayList<>(container.values()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<CacheEntry<K, Object>> queryList() {
|
public List<CacheEntry< Object>> queryList() {
|
||||||
return new ArrayList<>(container.values());
|
return new ArrayList<>(container.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<List<K>> queryKeysAsync() {
|
public CompletableFuture<List<String>> queryKeysAsync() {
|
||||||
return CompletableFuture.completedFuture(new ArrayList<>(container.keySet()));
|
return CompletableFuture.completedFuture(new ArrayList<>(container.keySet()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
package org.redkale.source;
|
package org.redkale.source;
|
||||||
|
|
||||||
import java.beans.ConstructorProperties;
|
import java.beans.ConstructorProperties;
|
||||||
import java.io.*;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
import org.redkale.convert.ConvertColumn;
|
import org.redkale.convert.ConvertColumn;
|
||||||
@@ -14,91 +13,90 @@ import org.redkale.convert.json.JsonFactory;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param <K> key的类型
|
|
||||||
* @param <V> value的类型
|
* @param <V> value的类型
|
||||||
* <p>
|
* <p>
|
||||||
* 详情见: https://redkale.org
|
* 详情见: https://redkale.org
|
||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
public interface CacheSource<K extends Serializable, V extends Object> {
|
public interface CacheSource<V extends Object> {
|
||||||
|
|
||||||
default boolean isOpen() {
|
default boolean isOpen() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean exists(final K key);
|
public boolean exists(final String key);
|
||||||
|
|
||||||
public V get(final K key);
|
public V get(final String key);
|
||||||
|
|
||||||
public V getAndRefresh(final K key, final int expireSeconds);
|
public V getAndRefresh(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public void refresh(final K key, final int expireSeconds);
|
public void refresh(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public void set(final K key, final V value);
|
public void set(final String key, final V value);
|
||||||
|
|
||||||
public void set(final int expireSeconds, final K key, final V value);
|
public void set(final int expireSeconds, final String key, final V value);
|
||||||
|
|
||||||
public void setExpireSeconds(final K key, final int expireSeconds);
|
public void setExpireSeconds(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public void remove(final K key);
|
public void remove(final String key);
|
||||||
|
|
||||||
public Collection<V> getCollection(final K key);
|
public Collection<V> getCollection(final String key);
|
||||||
|
|
||||||
public int getCollectionSize(final K key);
|
public int getCollectionSize(final String key);
|
||||||
|
|
||||||
public Collection<V> getCollectionAndRefresh(final K key, final int expireSeconds);
|
public Collection<V> getCollectionAndRefresh(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public void appendListItem(final K key, final V value);
|
public void appendListItem(final String key, final V value);
|
||||||
|
|
||||||
public void removeListItem(final K key, final V value);
|
public void removeListItem(final String key, final V value);
|
||||||
|
|
||||||
public void appendSetItem(final K key, final V value);
|
public void appendSetItem(final String key, final V value);
|
||||||
|
|
||||||
public void removeSetItem(final K key, final V value);
|
public void removeSetItem(final String key, final V value);
|
||||||
|
|
||||||
public List<K> queryKeys();
|
public List<String> queryKeys();
|
||||||
|
|
||||||
public int getKeySize();
|
public int getKeySize();
|
||||||
|
|
||||||
public List<CacheEntry<K, Object>> queryList();
|
public List<CacheEntry<Object>> queryList();
|
||||||
|
|
||||||
//---------------------- CompletableFuture 异步版 ---------------------------------
|
//---------------------- CompletableFuture 异步版 ---------------------------------
|
||||||
public CompletableFuture<Boolean> existsAsync(final K key);
|
public CompletableFuture<Boolean> existsAsync(final String key);
|
||||||
|
|
||||||
public CompletableFuture<V> getAsync(final K key);
|
public CompletableFuture<V> getAsync(final String key);
|
||||||
|
|
||||||
public CompletableFuture<V> getAndRefreshAsync(final K key, final int expireSeconds);
|
public CompletableFuture<V> getAndRefreshAsync(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public CompletableFuture<Void> refreshAsync(final K key, final int expireSeconds);
|
public CompletableFuture<Void> refreshAsync(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public CompletableFuture<Void> setAsync(final K key, final V value);
|
public CompletableFuture<Void> setAsync(final String key, final V value);
|
||||||
|
|
||||||
public CompletableFuture<Void> setAsync(final int expireSeconds, final K key, final V value);
|
public CompletableFuture<Void> setAsync(final int expireSeconds, final String key, final V value);
|
||||||
|
|
||||||
public CompletableFuture<Void> setExpireSecondsAsync(final K key, final int expireSeconds);
|
public CompletableFuture<Void> setExpireSecondsAsync(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public CompletableFuture<Void> removeAsync(final K key);
|
public CompletableFuture<Void> removeAsync(final String key);
|
||||||
|
|
||||||
public CompletableFuture<Collection<V>> getCollectionAsync(final K key);
|
public CompletableFuture<Collection<V>> getCollectionAsync(final String key);
|
||||||
|
|
||||||
public CompletableFuture<Integer> getCollectionSizeAsync(final K key);
|
public CompletableFuture<Integer> getCollectionSizeAsync(final String key);
|
||||||
|
|
||||||
public CompletableFuture<Collection<V>> getCollectionAndRefreshAsync(final K key, final int expireSeconds);
|
public CompletableFuture<Collection<V>> getCollectionAndRefreshAsync(final String key, final int expireSeconds);
|
||||||
|
|
||||||
public CompletableFuture<Void> appendListItemAsync(final K key, final V value);
|
public CompletableFuture<Void> appendListItemAsync(final String key, final V value);
|
||||||
|
|
||||||
public CompletableFuture<Void> removeListItemAsync(final K key, final V value);
|
public CompletableFuture<Void> removeListItemAsync(final String key, final V value);
|
||||||
|
|
||||||
public CompletableFuture<Void> appendSetItemAsync(final K key, final V value);
|
public CompletableFuture<Void> appendSetItemAsync(final String key, final V value);
|
||||||
|
|
||||||
public CompletableFuture<Void> removeSetItemAsync(final K key, final V value);
|
public CompletableFuture<Void> removeSetItemAsync(final String key, final V value);
|
||||||
|
|
||||||
public CompletableFuture<List<K>> queryKeysAsync();
|
public CompletableFuture<List<String>> queryKeysAsync();
|
||||||
|
|
||||||
public CompletableFuture<Integer> getKeySizeAsync();
|
public CompletableFuture<Integer> getKeySizeAsync();
|
||||||
|
|
||||||
public CompletableFuture<List<CacheEntry<K, Object>>> queryListAsync();
|
public CompletableFuture<List<CacheEntry< Object>>> queryListAsync();
|
||||||
|
|
||||||
default CompletableFuture<Boolean> isOpenAsync() {
|
default CompletableFuture<Boolean> isOpenAsync() {
|
||||||
return CompletableFuture.completedFuture(true);
|
return CompletableFuture.completedFuture(true);
|
||||||
@@ -108,7 +106,7 @@ public interface CacheSource<K extends Serializable, V extends Object> {
|
|||||||
OBJECT, SET, LIST;
|
OBJECT, SET, LIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class CacheEntry<K extends Serializable, T> {
|
public static final class CacheEntry<T> {
|
||||||
|
|
||||||
static final String JSON_SET_KEY = "{\"cacheType\":\"" + CacheEntryType.SET + "\"";
|
static final String JSON_SET_KEY = "{\"cacheType\":\"" + CacheEntryType.SET + "\"";
|
||||||
|
|
||||||
@@ -116,7 +114,7 @@ public interface CacheSource<K extends Serializable, V extends Object> {
|
|||||||
|
|
||||||
final CacheEntryType cacheType;
|
final CacheEntryType cacheType;
|
||||||
|
|
||||||
final K key;
|
final String key;
|
||||||
|
|
||||||
//<=0表示永久保存
|
//<=0表示永久保存
|
||||||
int expireSeconds;
|
int expireSeconds;
|
||||||
@@ -129,16 +127,16 @@ public interface CacheSource<K extends Serializable, V extends Object> {
|
|||||||
|
|
||||||
ConcurrentLinkedQueue<T> listValue;
|
ConcurrentLinkedQueue<T> listValue;
|
||||||
|
|
||||||
public CacheEntry(CacheEntryType cacheType, K key, T objectValue, CopyOnWriteArraySet<T> setValue, ConcurrentLinkedQueue<T> listValue) {
|
public CacheEntry(CacheEntryType cacheType, String key, T objectValue, CopyOnWriteArraySet<T> setValue, ConcurrentLinkedQueue<T> listValue) {
|
||||||
this(cacheType, 0, key, objectValue, setValue, listValue);
|
this(cacheType, 0, key, objectValue, setValue, listValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CacheEntry(CacheEntryType cacheType, int expireSeconds, K key, T objectValue, CopyOnWriteArraySet<T> setValue, ConcurrentLinkedQueue<T> listValue) {
|
public CacheEntry(CacheEntryType cacheType, int expireSeconds, String key, T objectValue, CopyOnWriteArraySet<T> setValue, ConcurrentLinkedQueue<T> listValue) {
|
||||||
this(cacheType, expireSeconds, (int) (System.currentTimeMillis() / 1000), key, objectValue, setValue, listValue);
|
this(cacheType, expireSeconds, (int) (System.currentTimeMillis() / 1000), key, objectValue, setValue, listValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ConstructorProperties({"cacheType", "expireSeconds", "lastAccessed", "key", "objectValue", "setValue", "listValue"})
|
@ConstructorProperties({"cacheType", "expireSeconds", "lastAccessed", "key", "objectValue", "setValue", "listValue"})
|
||||||
public CacheEntry(CacheEntryType cacheType, int expireSeconds, int lastAccessed, K key, T objectValue, CopyOnWriteArraySet<T> setValue, ConcurrentLinkedQueue<T> listValue) {
|
public CacheEntry(CacheEntryType cacheType, int expireSeconds, int lastAccessed, String key, T objectValue, CopyOnWriteArraySet<T> setValue, ConcurrentLinkedQueue<T> listValue) {
|
||||||
this.cacheType = cacheType;
|
this.cacheType = cacheType;
|
||||||
this.expireSeconds = expireSeconds;
|
this.expireSeconds = expireSeconds;
|
||||||
this.lastAccessed = lastAccessed;
|
this.lastAccessed = lastAccessed;
|
||||||
@@ -180,7 +178,7 @@ public interface CacheSource<K extends Serializable, V extends Object> {
|
|||||||
return lastAccessed;
|
return lastAccessed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public K getKey() {
|
public String getKey() {
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user