From 8789c0915b153ab9e72d819c0f8dc4a267671515 Mon Sep 17 00:00:00 2001 From: Redkale Date: Sun, 15 Jan 2023 16:21:37 +0800 Subject: [PATCH] =?UTF-8?q?CacheSource=E5=A2=9E=E5=8A=A0setnxex=E7=B3=BB?= =?UTF-8?q?=E5=88=97=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 | 22 ++++++ 2 files changed, 90 insertions(+) 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);