diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index 09aeedd50..6b1ce5acb 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -801,6 +801,31 @@ public final class CacheMemorySource extends AbstractCacheSource { return setnx(CacheEntryType.OBJECT, key, value); } + @Override + public boolean setnxex(String key, int expireSeconds, Type type, T value) { + return setnxex(CacheEntryType.OBJECT, expireSeconds, key, value); + } + + @Override + public boolean setnxex(String key, int expireSeconds, Convert convert, Type type, T value) { + return setnxex(CacheEntryType.OBJECT, expireSeconds, key, value); + } + + @Override + public boolean setnxexBytes(final String key, final int expireSeconds, final byte[] value) { + return setnxex(CacheEntryType.BYTES, expireSeconds, key, value); + } + + @Override + public boolean setnxexString(String key, int expireSeconds, String value) { + return setnxex(CacheEntryType.STRING, expireSeconds, key, value); + } + + @Override + public boolean setnxexLong(String key, int expireSeconds, long value) { + return setnxex(CacheEntryType.LONG, expireSeconds, key, value); + } + @Override public T getSet(String key, Type type, T value) { T old = get(key, type); @@ -917,6 +942,24 @@ public final class CacheMemorySource extends AbstractCacheSource { } } + protected boolean setnxex(CacheEntryType cacheType, int expireSeconds, String key, Object value) { + if (key == null) { + return false; + } + CacheEntry entry = container.get(key); + if (entry == null) { + entry = new CacheEntry(cacheType, expireSeconds, key, value, null, null, null); + container.putIfAbsent(key, entry); + return true; + } else { + if (expireSeconds > 0) { + entry.expireSeconds = expireSeconds; + } + entry.lastAccessed = (int) (System.currentTimeMillis() / 1000); + return false; + } + } + @Override public void setex(String key, int expireSeconds, Type type, T value) { set(CacheEntryType.OBJECT, expireSeconds, key, value); @@ -957,6 +1000,31 @@ public final class CacheMemorySource extends AbstractCacheSource { return CompletableFuture.runAsync(() -> setexLong(key, expireSeconds, value), getExecutor()).whenComplete(futureCompleteConsumer); } + @Override + public CompletableFuture setnxexStringAsync(String key, int expireSeconds, String value) { + return CompletableFuture.supplyAsync(() -> setnxexString(key, expireSeconds, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture setnxexLongAsync(String key, int expireSeconds, long value) { + return CompletableFuture.supplyAsync(() -> setnxexLong(key, expireSeconds, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture setnxexBytesAsync(String key, int expireSeconds, byte[] value) { + return CompletableFuture.supplyAsync(() -> setnxexBytes(key, expireSeconds, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture setnxexAsync(final String key, final int expireSeconds, final Type type, final T value) { + return CompletableFuture.supplyAsync(() -> setnxex(key, expireSeconds, type, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture setnxexAsync(final String key, final int expireSeconds, final Convert convert, final Type type, final T value) { + return CompletableFuture.supplyAsync(() -> setnxex(key, expireSeconds, convert, type, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + @Override public void expire(String key, int expireSeconds) { if (key == null) { diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 1ccf8ea9e..aa626a263 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -135,6 +135,17 @@ public interface CacheSource extends Resourcable { public boolean setnxBytes(final String key, final byte[] value); + //------------------------ setnxex ------------------------ + public boolean setnxex(final String key, final int expireSeconds, final Type type, final T value); + + public boolean setnxex(final String key, final int expireSeconds, final Convert convert, final Type type, final T value); + + public boolean setnxexString(final String key, final int expireSeconds, final String value); + + public boolean setnxexLong(final String key, final int expireSeconds, final long value); + + public boolean setnxexBytes(final String key, final int expireSeconds, final byte[] value); + //------------------------ setex ------------------------ public void setex(final String key, final int expireSeconds, final Type type, final T value); @@ -440,6 +451,17 @@ public interface CacheSource extends Resourcable { public CompletableFuture setnxBytesAsync(final String key, final byte[] value); + //------------------------ setnxexAsync ------------------------ + public CompletableFuture setnxexAsync(final String key, final int expireSeconds, final Type type, final T value); + + public CompletableFuture setnxexAsync(final String key, final int expireSeconds, final Convert convert, final Type type, final T value); + + public CompletableFuture setnxexStringAsync(final String key, final int expireSeconds, final String value); + + public CompletableFuture setnxexLongAsync(final String key, final int expireSeconds, final long value); + + public CompletableFuture setnxexBytesAsync(final String key, final int expireSeconds, final byte[] value); + //------------------------ setexAsync ------------------------ public CompletableFuture setexAsync(final String key, final int expireSeconds, final Type type, final T value);