From d3236f57d21146cc5a9bd334fe3b2f4f935f9b32 Mon Sep 17 00:00:00 2001 From: Redkale Date: Wed, 21 Dec 2022 16:33:44 +0800 Subject: [PATCH] =?UTF-8?q?CacheSource=E5=A2=9E=E5=8A=A0setnx=E3=80=81hset?= =?UTF-8?q?nx=E7=B3=BB=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 | 129 +++++++++++++++++- .../java/org/redkale/source/CacheSource.java | 44 +++++- 2 files changed, 169 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index 90b88d183..dd04cc33d 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -245,6 +245,31 @@ public final class CacheMemorySource extends AbstractCacheSource { hset(CacheEntryType.MAP, key, field, value); } + @Override + public void hsetnx(final String key, final String field, final Convert convert, final T value) { + hsetnx(CacheEntryType.MAP, key, field, value); + } + + @Override + public void hsetnx(final String key, final String field, final Type type, final T value) { + hsetnx(CacheEntryType.MAP, key, field, value); + } + + @Override + public void hsetnx(final String key, final String field, final Convert convert, final Type type, final T value) { + hsetnx(CacheEntryType.MAP, key, field, value); + } + + @Override + public void hsetnxString(final String key, final String field, final String value) { + hsetnx(CacheEntryType.MAP, key, field, value); + } + + @Override + public void hsetnxLong(final String key, final String field, final long value) { + hsetnx(CacheEntryType.MAP, key, field, value); + } + @Override public void hmset(final String key, final Serializable... values) { for (int i = 0; i < values.length; i += 2) { @@ -426,6 +451,31 @@ public final class CacheMemorySource extends AbstractCacheSource { return CompletableFuture.runAsync(() -> hsetLong(key, field, value), getExecutor()).whenComplete(futureCompleteConsumer); } + @Override + public CompletableFuture hsetnxAsync(final String key, final String field, final Convert convert, final T value) { + return CompletableFuture.runAsync(() -> hsetnx(key, field, convert, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture hsetnxAsync(final String key, final String field, final Type type, final T value) { + return CompletableFuture.runAsync(() -> hsetnx(key, field, type, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture hsetnxAsync(final String key, final String field, final Convert convert, final Type type, final T value) { + return CompletableFuture.runAsync(() -> hsetnx(key, field, convert, type, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture hsetnxStringAsync(final String key, final String field, final String value) { + return CompletableFuture.runAsync(() -> hsetnxString(key, field, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture hsetnxLongAsync(final String key, final String field, final long value) { + return CompletableFuture.runAsync(() -> hsetnxLong(key, field, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + @Override public CompletableFuture hmsetAsync(final String key, final Serializable... values) { return CompletableFuture.runAsync(() -> hmset(key, values), getExecutor()).whenComplete(futureCompleteConsumer); @@ -550,7 +600,7 @@ public final class CacheMemorySource extends AbstractCacheSource { CacheEntry entry = container.get(key); if (entry == null) { entry = new CacheEntry(cacheType, key, value, null, null, null); - container.putIfAbsent(key, entry); + container.put(key, entry); } else { entry.expireSeconds = 0; entry.objectValue = value; @@ -558,12 +608,24 @@ public final class CacheMemorySource extends AbstractCacheSource { } } + protected void setnx(CacheEntryType cacheType, String key, Object value) { + if (key == null) return; + CacheEntry entry = container.get(key); + if (entry == null) { + entry = new CacheEntry(cacheType, key, value, null, null, null); + container.putIfAbsent(key, entry); + } else { + entry.expireSeconds = 0; + entry.lastAccessed = (int) (System.currentTimeMillis() / 1000); + } + } + protected void hset(CacheEntryType cacheType, String key, String field, Object value) { if (key == null) return; CacheEntry entry = container.get(key); if (entry == null) { entry = new CacheEntry(CacheEntryType.MAP, key, value, null, null, new ConcurrentHashMap<>()); - container.putIfAbsent(key, entry); + container.put(key, entry); entry.mapValue.put(field, value); } else { entry.expireSeconds = 0; @@ -572,6 +634,19 @@ public final class CacheMemorySource extends AbstractCacheSource { } } + protected void hsetnx(CacheEntryType cacheType, String key, String field, Object value) { + if (key == null) return; + CacheEntry entry = container.get(key); + if (entry == null) { + entry = new CacheEntry(CacheEntryType.MAP, key, value, null, null, new ConcurrentHashMap<>()); + container.putIfAbsent(key, entry); + entry.mapValue.putIfAbsent(field, value); + } else { + entry.expireSeconds = 0; + entry.lastAccessed = (int) (System.currentTimeMillis() / 1000); + } + } + @Override public void set(String key, Convert convert, T value) { set(CacheEntryType.OBJECT, key, value); @@ -587,6 +662,21 @@ public final class CacheMemorySource extends AbstractCacheSource { set(CacheEntryType.OBJECT, key, value); } + @Override + public void setnx(String key, Convert convert, T value) { + setnx(CacheEntryType.OBJECT, key, value); + } + + @Override + public void setnx(String key, Type type, T value) { + setnx(CacheEntryType.OBJECT, key, value); + } + + @Override + public void setnx(String key, Convert convert, Type type, T value) { + setnx(CacheEntryType.OBJECT, key, value); + } + @Override public T getSet(String key, Type type, T value) { T old = get(key, type); @@ -606,11 +696,21 @@ public final class CacheMemorySource extends AbstractCacheSource { set(CacheEntryType.STRING, key, value); } + @Override + public void setnxString(String key, String value) { + setnx(CacheEntryType.STRING, key, value); + } + @Override public void setLong(String key, long value) { set(CacheEntryType.LONG, key, value); } + @Override + public void setnxLong(String key, long value) { + setnx(CacheEntryType.LONG, key, value); + } + @Override public CompletableFuture setAsync(String key, Convert convert, T value) { return CompletableFuture.runAsync(() -> set(key, convert, value), getExecutor()).whenComplete(futureCompleteConsumer); @@ -626,6 +726,21 @@ public final class CacheMemorySource extends AbstractCacheSource { return CompletableFuture.runAsync(() -> set(key, convert, type, value), getExecutor()).whenComplete(futureCompleteConsumer); } + @Override + public CompletableFuture setnxAsync(String key, Convert convert, T value) { + return CompletableFuture.runAsync(() -> setnx(key, convert, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture setnxAsync(String key, Type type, T value) { + return CompletableFuture.runAsync(() -> setnx(key, type, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + + @Override + public CompletableFuture setnxAsync(String key, Convert convert, Type type, T value) { + return CompletableFuture.runAsync(() -> setnx(key, convert, type, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + @Override public CompletableFuture getSetAsync(String key, Type type, T value) { return CompletableFuture.runAsync(() -> getSet(key, type, value), getExecutor()).whenComplete(futureCompleteConsumer); @@ -641,6 +756,11 @@ public final class CacheMemorySource extends AbstractCacheSource { return CompletableFuture.runAsync(() -> setString(key, value), getExecutor()).whenComplete(futureCompleteConsumer); } + @Override + public CompletableFuture setnxStringAsync(String key, String value) { + return CompletableFuture.runAsync(() -> setnxString(key, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + @Override public CompletableFuture getSetStringAsync(String key, String value) { return CompletableFuture.runAsync(() -> getSetString(key, value), getExecutor()).whenComplete(futureCompleteConsumer); @@ -651,6 +771,11 @@ public final class CacheMemorySource extends AbstractCacheSource { return CompletableFuture.runAsync(() -> setLong(key, value), getExecutor()).whenComplete(futureCompleteConsumer); } + @Override + public CompletableFuture setnxLongAsync(String key, long value) { + return CompletableFuture.runAsync(() -> setnxLong(key, value), getExecutor()).whenComplete(futureCompleteConsumer); + } + protected void set(CacheEntryType cacheType, int expireSeconds, String key, Object value) { if (key == null) return; CacheEntry entry = container.get(key); diff --git a/src/main/java/org/redkale/source/CacheSource.java b/src/main/java/org/redkale/source/CacheSource.java index 242423a2a..7033df809 100644 --- a/src/main/java/org/redkale/source/CacheSource.java +++ b/src/main/java/org/redkale/source/CacheSource.java @@ -8,8 +8,8 @@ package org.redkale.source; import java.io.Serializable; import java.lang.reflect.Type; import java.util.*; -import java.util.concurrent.*; -import org.redkale.convert.*; +import java.util.concurrent.CompletableFuture; +import org.redkale.convert.Convert; import org.redkale.util.Resourcable; /** @@ -67,6 +67,16 @@ public interface CacheSource extends Resourcable { public void hsetLong(final String key, final String field, final long value); + public void hsetnx(final String key, final String field, final Convert convert, final T value); + + public void hsetnx(final String key, final String field, final Type type, final T value); + + public void hsetnx(final String key, final String field, final Convert convert, final Type type, final T value); + + public void hsetnxString(final String key, final String field, final String value); + + public void hsetnxLong(final String key, final String field, final long value); + public void hmset(final String key, final Serializable... values); public List hmget(final String key, final Type type, final String... fields); @@ -90,6 +100,12 @@ public interface CacheSource extends Resourcable { public void set(final String key, final Convert convert, final Type type, final T value); + public void setnx(final String key, final Convert convert, final T value); + + public void setnx(final String key, final Type type, final T value); + + public void setnx(final String key, final Convert convert, final Type type, final T value); + public T getSet(final String key, final Type type, final T value); public T getSet(final String key, final Convert convert, final Type type, final T value); @@ -166,6 +182,8 @@ public interface CacheSource extends Resourcable { public void setString(final String key, final String value); + public void setnxString(final String key, final String value); + public void setString(final int expireSeconds, final String key, final String value); public Map getStringMap(final String... keys); @@ -200,6 +218,8 @@ public interface CacheSource extends Resourcable { public void setLong(final String key, final long value); + public void setnxLong(final String key, final long value); + public void setLong(final int expireSeconds, final String key, final long value); public Map getLongMap(final String... keys); @@ -241,6 +261,12 @@ public interface CacheSource extends Resourcable { public CompletableFuture setAsync(final String key, final Convert convert, final Type type, final T value); + public CompletableFuture setnxAsync(final String key, final Convert convert, final T value); + + public CompletableFuture setnxAsync(final String key, final Type type, final T value); + + public CompletableFuture setnxAsync(final String key, final Convert convert, final Type type, final T value); + public CompletableFuture getSetAsync(final String key, final Type type, final T value); public CompletableFuture getSetAsync(final String key, final Convert convert, final Type type, final T value); @@ -290,6 +316,16 @@ public interface CacheSource extends Resourcable { public CompletableFuture hsetLongAsync(final String key, final String field, final long value); + public CompletableFuture hsetnxAsync(final String key, final String field, final Convert convert, final T value); + + public CompletableFuture hsetnxAsync(final String key, final String field, final Type type, final T value); + + public CompletableFuture hsetnxAsync(final String key, final String field, final Convert convert, final Type type, final T value); + + public CompletableFuture hsetnxStringAsync(final String key, final String field, final String value); + + public CompletableFuture hsetnxLongAsync(final String key, final String field, final long value); + public CompletableFuture hmsetAsync(final String key, final Serializable... values); public CompletableFuture> hmgetAsync(final String key, final Type type, final String... fields); @@ -359,6 +395,8 @@ public interface CacheSource extends Resourcable { public CompletableFuture setStringAsync(final String key, final String value); + public CompletableFuture setnxStringAsync(final String key, final String value); + public CompletableFuture setStringAsync(final int expireSeconds, final String key, final String value); public CompletableFuture> getStringMapAsync(final String... keys); @@ -393,6 +431,8 @@ public interface CacheSource extends Resourcable { public CompletableFuture setLongAsync(final String key, long value); + public CompletableFuture setnxLongAsync(final String key, long value); + public CompletableFuture setLongAsync(final int expireSeconds, final String key, final long value); public CompletableFuture> getLongMapAsync(final String... keys);