diff --git a/redisson/src/main/java/org/redisson/RedissonMap.java b/redisson/src/main/java/org/redisson/RedissonMap.java index 83b4ac441..0799c758d 100644 --- a/redisson/src/main/java/org/redisson/RedissonMap.java +++ b/redisson/src/main/java/org/redisson/RedissonMap.java @@ -1846,6 +1846,11 @@ public class RedissonMap extends RedissonExpirable implements RMap { } + @Override + public RFuture clearAsync() { + return deleteAsync(); + } + @Override public void destroy() { if (writeBehindService != null) { diff --git a/redisson/src/main/java/org/redisson/RedissonMapCache.java b/redisson/src/main/java/org/redisson/RedissonMapCache.java index 9eff921a9..20cb2c26b 100644 --- a/redisson/src/main/java/org/redisson/RedissonMapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonMapCache.java @@ -2376,6 +2376,11 @@ public class RedissonMapCache extends RedissonMap implements RMapCac get(future); } + @Override + public RFuture clearAsync() { + return deleteAsync(getRawName(), getTimeoutSetName(), getIdleSetName(), getLastAccessTimeSetName()); + } + @Override public RFuture deleteAsync() { return deleteAsync(getRawName(), getTimeoutSetName(), getIdleSetName(), getLastAccessTimeSetName(), getOptionsName()); diff --git a/redisson/src/main/java/org/redisson/api/RMapAsync.java b/redisson/src/main/java/org/redisson/api/RMapAsync.java index d17324453..48f6e8cee 100644 --- a/redisson/src/main/java/org/redisson/api/RMapAsync.java +++ b/redisson/src/main/java/org/redisson/api/RMapAsync.java @@ -411,4 +411,11 @@ public interface RMapAsync extends RExpirableAsync { */ RFuture putIfExistsAsync(K key, V value); + /** + * Clears map without removing options data used during map creation. + * + * @return true if map was cleared false if not + */ + RFuture clearAsync(); + } diff --git a/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java b/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java index 831e4b4a2..c60d8e160 100644 --- a/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java +++ b/redisson/src/main/java/org/redisson/spring/cache/RedissonCache.java @@ -15,17 +15,20 @@ */ package org.redisson.spring.cache; -import java.lang.reflect.Constructor; -import java.util.concurrent.Callable; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicLong; - +import org.redisson.api.RFuture; import org.redisson.api.RLock; import org.redisson.api.RMap; import org.redisson.api.RMapCache; +import org.redisson.client.RedisException; import org.springframework.cache.Cache; import org.springframework.cache.support.SimpleValueWrapper; +import java.lang.reflect.Constructor; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; + /** * * @author Nikita Koksharov @@ -161,7 +164,23 @@ public class RedissonCache implements Cache { } public boolean invalidate() { - return map.delete(); + return get(map.clearAsync()); + } + + private V get(RFuture future) { + if (Thread.currentThread().getName().startsWith("redisson-netty")) { + throw new IllegalStateException("Sync methods can't be invoked from async/rx/reactive listeners"); + } + + try { + return future.get(); + } catch (InterruptedException e) { + future.cancel(true); + Thread.currentThread().interrupt(); + throw new RedisException(e); + } catch (ExecutionException e) { + throw new RedisException(e.getCause()); + } } private ValueWrapper toValueWrapper(Object value) {