From 3d379d59ef0482e5dac98240c5ab80573e85c15a Mon Sep 17 00:00:00 2001 From: redkale Date: Sun, 11 Jun 2023 22:53:17 +0800 Subject: [PATCH] =?UTF-8?q?CacheSource=E5=A2=9E=E5=8A=A0smismember?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/source/CacheMemorySource.java | 68 +++- .../java/org/redkale/source/CacheSource.java | 313 ++++++++++++++---- 2 files changed, 305 insertions(+), 76 deletions(-) diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index 8d6b349ff..b65f11d52 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -154,6 +154,11 @@ public final class CacheMemorySource extends AbstractCacheSource { } } + @Override + public CompletableFuture isOpenAsync() { + return CompletableFuture.completedFuture(true); + } + //----------- hxxx -------------- @Override public long hdel(final String key, String... fields) { @@ -932,6 +937,11 @@ public final class CacheMemorySource extends AbstractCacheSource { return supplyAsync(() -> sdiffstore(key, srcKey, srcKey2s), getExecutor()).whenComplete(futureCompleteConsumer); } + @Override + public CompletableFuture> smismembersAsync(final String key, final String... members) { + return supplyAsync(() -> smismembers(key, members), getExecutor()).whenComplete(futureCompleteConsumer); + } + @Override public Set sdiff(final String key, final Type componentType, final String... key2s) { Set rs = new HashSet<>(); @@ -951,18 +961,56 @@ public final class CacheMemorySource extends AbstractCacheSource { @Override public long sdiffstore(final String key, final String srcKey, final String... srcKey2s) { - Set rs = new HashSet<>(); - CacheEntry entry = container.get(srcKey); + Set rs = sdiff(srcKey, Object.class, srcKey2s); + if (container.containsKey(key)) { + CopyOnWriteArraySet set = container.get(srcKey).csetValue; + set.clear(); + set.addAll(rs); + } else { + appendSetItem(CacheEntryType.OBJECT_SET, key, rs); + } + return rs.size(); + } + + @Override + public CompletableFuture> sinterAsync(final String key, final Type componentType, final String... key2s) { + return supplyAsync(() -> sinter(key, componentType, key2s), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture sinterstoreAsync(final String key, final String srcKey, final String... srcKey2s) { + return supplyAsync(() -> sinterstore(key, srcKey, srcKey2s), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public Set sinter(final String key, final Type componentType, final String... key2s) { + Set rs = new HashSet<>(); + CacheEntry entry = container.get(key); if (entry == null || entry.csetValue == null) { - return 0L; + return rs; } rs.addAll(entry.csetValue); - for (String k : srcKey2s) { + for (String k : key2s) { CacheEntry en2 = container.get(k); if (en2 != null && en2.csetValue != null) { - en2.csetValue.forEach(v -> rs.remove(v)); + Set removes = new HashSet<>(); + for (T v : rs) { + if (!en2.csetValue.contains(v)) { + removes.add(v); + } + } + rs.removeAll(removes); + } else { + rs.clear(); + return rs; } } + return rs; + } + + @Override + public long sinterstore(final String key, final String srcKey, final String... srcKey2s) { + Set rs = sinter(srcKey, Object.class, srcKey2s); if (container.containsKey(key)) { CopyOnWriteArraySet set = container.get(srcKey).csetValue; set.clear(); @@ -995,6 +1043,16 @@ public final class CacheMemorySource extends AbstractCacheSource { return map; } + @Override + public List smismembers(final String key, final String... members) { + Set s = (Set) get(key, Object.class); + List rs = new ArrayList<>(); + for (String member : members) { + rs.add(s != null && s.contains(member)); + } + return rs; + } + @Override public Map> lrange(final Type componentType, final String... keys) { Map> map = new HashMap<>(); diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 29f0b46b6..e4a43bb79 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -33,11 +33,13 @@ public interface CacheSource extends Resourcable { public String getType(); default boolean isOpen() { - return true; + return isOpenAsync().join(); } //------------------------ get ------------------------ - public T get(final String key, final Type type); + default T get(final String key, final Type type) { + return (T) getAsync(key, type).join(); + } default String getString(final String key) { return get(key, String.class); @@ -49,7 +51,9 @@ public interface CacheSource extends Resourcable { } //------------------------ mget ------------------------ - public Map mget(final Type componentType, final String... keys); + default Map mget(final Type componentType, final String... keys) { + return (Map) mgetAsync(componentType, keys).join(); + } default Map mgetString(final String... keys) { return mget(String.class, keys); @@ -87,7 +91,9 @@ public interface CacheSource extends Resourcable { } //------------------------ getex ------------------------ - public T getex(final String key, final int expireSeconds, final Type type); + default T getex(final String key, final int expireSeconds, final Type type) { + return (T) getexAsync(key, expireSeconds, type).join(); + } default String getexString(final String key, final int expireSeconds) { return getex(key, expireSeconds, String.class); @@ -99,7 +105,9 @@ public interface CacheSource extends Resourcable { } //------------------------ getset ------------------------ - public T getSet(final String key, final Convert convert, final Type type, final T value); + default T getSet(final String key, final Convert convert, final Type type, final T value) { + return getSetAsync(key, convert, type, value).join(); + } default T getSet(final String key, final Type type, final T value) { return getSet(key, (Convert) null, type, value); @@ -116,11 +124,17 @@ public interface CacheSource extends Resourcable { //------------------------ set ------------------------ //MSET key value [key value ...] - public void mset(final Serializable... keyVals); + default void mset(final Serializable... keyVals) { + msetAsync(keyVals).join(); + } - public void mset(final Map map); + default void mset(final Map map) { + msetAsync(map).join(); + } - public void set(final String key, final Convert convert, final Type type, final T value); + default void set(final String key, final Convert convert, final Type type, final T value) { + setAsync(key, convert, type, value).join(); + } default void set(final String key, final Type type, final T value) { set(key, (Convert) null, type, value); @@ -135,7 +149,9 @@ public interface CacheSource extends Resourcable { } //------------------------ setnx ------------------------ - public boolean setnx(final String key, final Convert convert, final Type type, final T value); + default boolean setnx(final String key, final Convert convert, final Type type, final T value) { + return setnxAsync(key, convert, type, value).join(); + } default boolean setnx(final String key, final Type type, final T value) { return setnx(key, (Convert) null, type, value); @@ -150,7 +166,9 @@ public interface CacheSource extends Resourcable { } //------------------------ setnxex ------------------------ - public boolean setnxex(final String key, final int expireSeconds, final Convert convert, final Type type, final T value); + default boolean setnxex(final String key, final int expireSeconds, final Convert convert, final Type type, final T value) { + return setnxexAsync(key, expireSeconds, convert, type, value).join(); + } default boolean setnxex(final String key, final int expireSeconds, final Type type, final T value) { return setnxex(key, expireSeconds, (Convert) null, type, value); @@ -165,7 +183,9 @@ public interface CacheSource extends Resourcable { } //------------------------ setex ------------------------ - public void setex(final String key, final int expireSeconds, final Convert convert, final Type type, final T value); + default void setex(final String key, final int expireSeconds, final Convert convert, final Type type, final T value) { + setexAsync(key, expireSeconds, convert, type, value).join(); + } default void setex(final String key, final int expireSeconds, final Type type, final T value) { setex(key, expireSeconds, (Convert) null, type, value); @@ -180,30 +200,54 @@ public interface CacheSource extends Resourcable { } //------------------------ xxxx ------------------------ - public boolean exists(final String key); + default boolean exists(final String key) { + return existsAsync(key).join(); + } - public void expire(final String key, final int seconds); + default void expire(final String key, final int expireSeconds) { + expireAsync(key, expireSeconds).join(); + } - public boolean persist(final String key); + default boolean persist(final String key) { + return persistAsync(key).join(); + } - public boolean rename(String oldKey, String newKey); + default boolean rename(String oldKey, String newKey) { + return renameAsync(oldKey, newKey).join(); + } - public boolean renamenx(String oldKey, String newKey); + default boolean renamenx(String oldKey, String newKey) { + return renamenxAsync(oldKey, newKey).join(); + } - public long del(final String... keys); + default long del(final String... keys) { + return delAsync(keys).join(); + } - public long incr(final String key); + default long incr(final String key) { + return incrAsync(key).join(); + } - public long incrby(final String key, long num); + default long incrby(final String key, long num) { + return incrbyAsync(key, num).join(); + } - public long decr(final String key); + default double incrbyFloat(final String key, double num) { + return incrbyFloatAsync(key, num).join(); + } - public long decrby(final String key, long num); + default long decr(final String key) { + return decrAsync(key).join(); + } - public double incrbyFloat(final String key, double num); + default long decrby(final String key, long num) { + return decrbyAsync(key, num).join(); + } //------------------------ 键 Keys ------------------------ - public List keys(String pattern); + default List keys(String pattern) { + return keysAsync(pattern).join(); + } default List keys() { return keys(null); @@ -213,43 +257,75 @@ public interface CacheSource extends Resourcable { return keys(startsWith + "*"); } - public List scan(AtomicLong cursor, int limit, String pattern); + default List scan(AtomicLong cursor, int limit, String pattern) { + return scanAsync(cursor, limit, pattern).join(); + } default List scan(AtomicLong cursor, int limit) { return scan(cursor, limit, null); } //------------------------ 服务器 Server ------------------------ - public long dbsize(); + default long dbsize() { + return dbsizeAsync().join(); + } - public void flushdb(); + default void flushdb() { + flushdbAsync().join(); + } - public void flushall(); + default void flushall() { + flushallAsync().join(); + } //------------------------ 哈希表 Hash ------------------------ - public long hdel(final String key, String... fields); + default long hdel(final String key, String... fields) { + return hdelAsync(key, fields).join(); + } - public List hkeys(final String key); + default List hkeys(final String key) { + return hkeysAsync(key).join(); + } - public long hlen(final String key); + default long hlen(final String key) { + return hlenAsync(key).join(); + } - public long hincr(final String key, String field); + default long hincr(final String key, String field) { + return hincrAsync(key, field).join(); + } - public long hincrby(final String key, String field, long num); + default long hincrby(final String key, String field, long num) { + return hincrbyAsync(key, field, num).join(); + } - public double hincrbyFloat(final String key, String field, double num); + default double hincrbyFloat(final String key, String field, double num) { + return hincrbyFloatAsync(key, field, num).join(); + } - public long hdecr(final String key, String field); + default long hdecr(final String key, String field) { + return hdecrAsync(key, field).join(); + } - public long hdecrby(final String key, String field, long num); + default long hdecrby(final String key, String field, long num) { + return hdecrbyAsync(key, field, num).join(); + } - public boolean hexists(final String key, String field); + default boolean hexists(final String key, String field) { + return hexistsAsync(key, field).join(); + } - public void hmset(final String key, final Serializable... values); + default void hmset(final String key, final Serializable... values) { + hmsetAsync(key, values).join(); + } - public void hmset(final String key, final Map map); + default void hmset(final String key, final Map map) { + hmsetAsync(key, map).join(); + } - public List hmget(final String key, final Type type, final String... fields); + default List hmget(final String key, final Type type, final String... fields) { + return (List) hmgetAsync(key, type, fields).join(); + } default List hmgetString(final String key, final String... fields) { return hmget(key, String.class, fields); @@ -259,13 +335,17 @@ public interface CacheSource extends Resourcable { return hmget(key, Long.class, fields); } - public Map hscan(final String key, final Type type, AtomicLong cursor, int limit, String pattern); + default Map hscan(final String key, final Type type, AtomicLong cursor, int limit, String pattern) { + return (Map) hscanAsync(key, type, cursor, limit, pattern).join(); + } default Map hscan(final String key, final Type type, AtomicLong cursor, int limit) { return hscan(key, type, cursor, limit, null); } - public T hget(final String key, final String field, final Type type); + default T hget(final String key, final String field, final Type type) { + return (T) hgetAsync(key, field, type).join(); + } default String hgetString(final String key, final String field) { return hget(key, field, String.class); @@ -276,7 +356,9 @@ public interface CacheSource extends Resourcable { return val == null ? defValue : val; } - public void hset(final String key, final String field, final Convert convert, final Type type, final T value); + default void hset(final String key, final String field, final Convert convert, final Type type, final T value) { + hsetAsync(key, field, convert, type, value).join(); + } default void hset(final String key, final String field, final Type type, final T value) { hset(key, field, (Convert) null, type, value); @@ -290,7 +372,9 @@ public interface CacheSource extends Resourcable { hset(key, field, Long.class, value); } - public boolean hsetnx(final String key, final String field, final Convert convert, final Type type, final T value); + default boolean hsetnx(final String key, final String field, final Convert convert, final Type type, final T value) { + return hsetnxAsync(key, field, convert, type, value).join(); + } default boolean hsetnx(final String key, final String field, final Type type, final T value) { return hsetnx(key, field, (Convert) null, type, value); @@ -304,7 +388,9 @@ public interface CacheSource extends Resourcable { return hsetnx(key, field, Long.class, value); } - public Map hgetall(final String key, final Type type); + default Map hgetall(final String key, final Type type) { + return (Map) hgetallAsync(key, type).join(); + } default Map hgetallString(final String key) { return hgetall(key, String.class); @@ -314,7 +400,9 @@ public interface CacheSource extends Resourcable { return hgetall(key, Long.class); } - public List hvals(final String key, final Type type); + default List hvals(final String key, final Type type) { + return (List) hvalsAsync(key, type).join(); + } default List hvalsString(final String key) { return hvals(key, String.class); @@ -325,11 +413,17 @@ public interface CacheSource extends Resourcable { } //------------------------ 列表 List ------------------------ - public long llen(final String key); + default long llen(final String key) { + return llenAsync(key).join(); + } - public void ltrim(final String key, int start, int stop); + default void ltrim(final String key, int start, int stop) { + ltrimAsync(key, start, stop).join(); + } - public Map> lrange(final Type componentType, final String... keys); + default Map> lrange(final Type componentType, final String... keys) { + return (Map) lrangeAsync(componentType, keys).join(); + } default Map> lrangeString(final String... keys) { return lrange(String.class, keys); @@ -339,7 +433,9 @@ public interface CacheSource extends Resourcable { return lrange(Long.class, keys); } - public List lrange(final String key, final Type componentType, int start, int stop); + default List lrange(final String key, final Type componentType, int start, int stop) { + return (List) lrangeAsync(key, componentType, start, stop).join(); + } default List lrangeString(final String key, int start, int stop) { return lrange(key, String.class, start, stop); @@ -361,7 +457,9 @@ public interface CacheSource extends Resourcable { return lrange(key, Long.class, 0, -1); } - public T lpop(final String key, final Type componentType); + default T lpop(final String key, final Type componentType) { + return (T) lpopAsync(key, componentType).join(); + } default String lpopString(final String key) { return lpop(key, String.class); @@ -371,7 +469,9 @@ public interface CacheSource extends Resourcable { return lpop(key, Long.class); } - public void lpush(final String key, final Type componentType, T... values); + default void lpush(final String key, final Type componentType, T... values) { + lpushAsync(key, componentType, values).join(); + } default void lpushString(final String key, String... values) { lpush(key, String.class, values); @@ -381,7 +481,9 @@ public interface CacheSource extends Resourcable { lpush(key, Long.class, values); } - public void lpushx(final String key, final Type componentType, T... values); + default void lpushx(final String key, final Type componentType, T... values) { + lpushxAsync(key, componentType, values).join(); + } default void lpushxString(final String key, String... values) { lpushx(key, String.class, values); @@ -391,7 +493,9 @@ public interface CacheSource extends Resourcable { lpushx(key, Long.class, values); } - public void rpushx(final String key, final Type componentType, T... values); + default void rpushx(final String key, final Type componentType, T... values) { + rpushxAsync(key, componentType, values).join(); + } default void rpushxString(final String key, String... values) { rpushx(key, String.class, values); @@ -401,7 +505,9 @@ public interface CacheSource extends Resourcable { rpushx(key, Long.class, values); } - public T rpop(final String key, final Type componentType); + default T rpop(final String key, final Type componentType) { + return (T) rpopAsync(key, componentType).join(); + } default String rpopString(final String key) { return rpop(key, String.class); @@ -411,7 +517,9 @@ public interface CacheSource extends Resourcable { return rpop(key, Long.class); } - public T rpoplpush(final String key, final String key2, final Type componentType); + default T rpoplpush(final String key, final String key2, final Type componentType) { + return (T) rpoplpushAsync(key, key2, componentType).join(); + } default String rpoplpushString(final String key, final String key2) { return rpoplpush(key, key2, String.class); @@ -421,7 +529,9 @@ public interface CacheSource extends Resourcable { return rpoplpush(key, key2, Long.class); } - public int lrem(final String key, final Type componentType, final T value); + default int lrem(final String key, final Type componentType, final T value) { + return lremAsync(key, componentType, value).join(); + } default int lremString(final String key, final String value) { return lrem(key, String.class, value); @@ -431,7 +541,9 @@ public interface CacheSource extends Resourcable { return lrem(key, Long.class, value); } - public void rpush(final String key, final Type componentType, final T... values); + default void rpush(final String key, final Type componentType, final T... values) { + rpushAsync(key, componentType, values).join(); + } default void rpushString(final String key, final String... values) { rpush(key, String.class, values); @@ -442,7 +554,9 @@ public interface CacheSource extends Resourcable { } //------------------------ 集合 Set ------------------------ - public void sadd(final String key, final Type componentType, final T... values); + default void sadd(final String key, final Type componentType, final T... values) { + saddAsync(key, componentType, values).join(); + } default void saddString(final String key, final String... values) { sadd(key, String.class, values); @@ -452,7 +566,9 @@ public interface CacheSource extends Resourcable { sadd(key, Long.class, values); } - public Set sdiff(final String key, final Type componentType, final String... key2s); + default Set sdiff(final String key, final Type componentType, final String... key2s) { + return (Set) sdiffAsync(key, componentType, key2s).join(); + } default Set sdiffString(final String key, final String... key2s) { return sdiff(key, String.class, key2s); @@ -462,11 +578,33 @@ public interface CacheSource extends Resourcable { return sdiff(key, Long.class, key2s); } - public long sdiffstore(final String key, final String srcKey, final String... srcKey2s); + default long sdiffstore(final String key, final String srcKey, final String... srcKey2s) { + return sdiffstoreAsync(key, srcKey, srcKey2s).join(); + } - public long scard(final String key); + default Set sinter(final String key, final Type componentType, final String... key2s) { + return (Set) sinterAsync(key, componentType, key2s).join(); + } - public Set smembers(final String key, final Type componentType); + default Set sinterString(final String key, final String... key2s) { + return sinter(key, String.class, key2s); + } + + default Set sinterLong(final String key, final String... key2s) { + return sinter(key, Long.class, key2s); + } + + default long sinterstore(final String key, final String srcKey, final String... srcKey2s) { + return sinterstoreAsync(key, srcKey, srcKey2s).join(); + } + + default long scard(final String key) { + return scardAsync(key).join(); + } + + default Set smembers(final String key, final Type componentType) { + return (Set) smembersAsync(key, componentType).join(); + } default Set smembersString(final String key) { return smembers(key, String.class); @@ -476,7 +614,9 @@ public interface CacheSource extends Resourcable { return smembers(key, Long.class); } - public Map> smembers(final Type componentType, final String... keys); + default Map> smembers(final Type componentType, final String... keys) { + return (Map) smembersAsync(componentType, keys).join(); + } default Map> smembersString(final String... keys) { return smembers(String.class, keys); @@ -486,7 +626,9 @@ public interface CacheSource extends Resourcable { return smembers(Long.class, keys); } - public boolean sismember(final String key, final Type componentType, final T value); + default boolean sismember(final String key, final Type componentType, final T value) { + return sismemberAsync(key, componentType, value).join(); + } default boolean sismemberString(final String key, final String value) { return sismember(key, String.class, value); @@ -496,7 +638,18 @@ public interface CacheSource extends Resourcable { return sismember(key, Long.class, value); } - public long srem(final String key, final Type componentType, final T... values); + default boolean smismember(final String key, final String member) { + List rs = smismembers(key, member); + return rs.get(0); + } + + default List smismembers(final String key, final String... members) { + return smismembersAsync(key, members).join(); + } + + default long srem(final String key, final Type componentType, final T... values) { + return sremAsync(key, componentType, values).join(); + } default long sremString(final String key, final String... values) { return srem(key, String.class, values); @@ -506,7 +659,9 @@ public interface CacheSource extends Resourcable { return srem(key, Long.class, values); } - public T spop(final String key, final Type componentType); + default T spop(final String key, final Type componentType) { + return (T) spopAsync(key, componentType).join(); + } default String spopString(final String key) { return spop(key, String.class); @@ -516,7 +671,9 @@ public interface CacheSource extends Resourcable { return spop(key, Long.class); } - public Set spop(final String key, final int count, final Type componentType); + default Set spop(final String key, final int count, final Type componentType) { + return (Set) spopAsync(key, count, componentType).join(); + } default Set spopString(final String key, final int count) { return spop(key, count, String.class); @@ -526,7 +683,9 @@ public interface CacheSource extends Resourcable { return spop(key, count, Long.class); } - public Set sscan(final String key, final Type componentType, AtomicLong cursor, int limit, String pattern); + default Set sscan(final String key, final Type componentType, AtomicLong cursor, int limit, String pattern) { + return (Set) sscanAsync(key, componentType, cursor, limit, pattern).join(); + } default Set sscanString(final String key, AtomicLong cursor, int limit, String pattern) { return sscan(key, String.class, cursor, limit, pattern); @@ -549,9 +708,7 @@ public interface CacheSource extends Resourcable { } //---------------------- CompletableFuture 异步版 --------------------------------- - default CompletableFuture isOpenAsync() { - return CompletableFuture.completedFuture(isOpen()); - } + public CompletableFuture isOpenAsync(); //------------------------ getAsync ------------------------ public CompletableFuture getAsync(final String key, final Type type); @@ -980,6 +1137,18 @@ public interface CacheSource extends Resourcable { public CompletableFuture sdiffstoreAsync(final String key, final String srcKey, final String... srcKey2s); + public CompletableFuture> sinterAsync(final String key, final Type componentType, final String... key2s); + + default CompletableFuture> sinterStringAsync(final String key, final String... key2s) { + return sinterAsync(key, String.class, key2s); + } + + default CompletableFuture> sinterLongAsync(final String key, final String... key2s) { + return sinterAsync(key, Long.class, key2s); + } + + public CompletableFuture sinterstoreAsync(final String key, final String srcKey, final String... srcKey2s); + public CompletableFuture scardAsync(final String key); public CompletableFuture> smembersAsync(final String key, final Type componentType); @@ -1012,6 +1181,8 @@ public interface CacheSource extends Resourcable { return sismemberAsync(key, Long.class, value); } + public CompletableFuture> smismembersAsync(final String key, final String... members); + public CompletableFuture sremAsync(final String key, final Type componentType, final T... values); default CompletableFuture sremStringAsync(final String key, final String... values) {