From 88c20f798f2cdb268cfd4806d8af0ed194a7e274 Mon Sep 17 00:00:00 2001 From: redkale Date: Fri, 22 Dec 2023 14:54:49 +0800 Subject: [PATCH] =?UTF-8?q?CacheSource=E5=A2=9E=E5=8A=A0msetnx=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/redkale/source/CacheMemorySource.java | 49 ++++++++++++++++--- .../java/org/redkale/source/CacheSource.java | 14 ++++++ 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index bc0bee1cf..63a63dbc7 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -25,7 +25,6 @@ import org.redkale.convert.json.*; import org.redkale.inject.ResourceEvent; import org.redkale.service.Local; import org.redkale.util.*; -import org.redkale.annotation.ResourceChanged; /** * CacheSource的默认实现--内存缓存 @@ -300,21 +299,31 @@ public final class CacheMemorySource extends AbstractCacheSource { } } - @Override - public CompletableFuture msetAsync(Serializable... keyVals) { - return runFuture(() -> mset(keyVals)); - } - @Override public void mset(Map map) { map.forEach((key, val) -> set0(key.toString(), 0, null, null, val)); } + @Override + public CompletableFuture msetAsync(Serializable... keyVals) { + return runFuture(() -> mset(keyVals)); + } + + @Override + public CompletableFuture msetnxAsync(Serializable... keyVals) { + return runFuture(() -> msetnx(keyVals)); + } + @Override public CompletableFuture msetAsync(Map map) { return runFuture(() -> mset(map)); } + @Override + public CompletableFuture msetnxAsync(Map map) { + return runFuture(() -> msetnx(map)); + } + @Override public void set(String key, Convert convert, Type type, T value) { set0(key, 0, convert, type, value); @@ -420,6 +429,34 @@ public final class CacheMemorySource extends AbstractCacheSource { } } + @Override + public void msetnx(Serializable... keyVals) { + if (keyVals.length % 2 != 0) { + throw new SourceException("key value must be paired"); + } + msetnx(Utility.ofMap(keyVals)); + } + + @Override + public void msetnx(Map map) { + containerLock.lock(); + try { + for (Object key : map.keySet()) { + if (find(key.toString(), CacheEntryType.OBJECT) != null) { + return; + } + } + for (Map.Entry en : (Set>) map.entrySet()) { + CacheEntry entry = new CacheEntry(CacheEntryType.OBJECT, en.getKey()); + container.put(en.getKey(), entry); + entry.setObjectValue(this.convert, null, en.getValue()); + entry.lastAccessed = System.currentTimeMillis(); + } + } finally { + containerLock.unlock(); + } + } + @Override public void setex(String key, int expireSeconds, Convert convert, Type type, T value) { set0(key, expireSeconds, convert, type, value); diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 4da2b38df..9e3d23ab7 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -171,6 +171,15 @@ public interface CacheSource extends Resourcable { msetAsync(map).join(); } + //MSETNX key value [key value ...] + default void msetnx(Serializable... keyVals) { + msetnxAsync(keyVals).join(); + } + + default void msetnx(Map map) { + msetnxAsync(map).join(); + } + //------------------------ setnx ------------------------ default boolean setnx(String key, Convert convert, Type type, T value) { return setnxAsync(key, convert, type, value).join(); @@ -1057,6 +1066,11 @@ public interface CacheSource extends Resourcable { public CompletableFuture msetAsync(Map map); + //MSET key value [key value ...] + public CompletableFuture msetnxAsync(Serializable... keyVals); + + public CompletableFuture msetnxAsync(Map map); + //------------------------ setnx ------------------------ public CompletableFuture setnxAsync(String key, Convert convert, Type type, T value);