diff --git a/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java b/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java index 3bd5b84c4..06805716b 100644 --- a/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java @@ -37,21 +37,15 @@ import java.util.concurrent.TimeUnit; public class RedissonListMultimapCache extends RedissonListMultimap implements RListMultimapCache { private final RedissonMultimapCache baseCache; - + public RedissonListMultimapCache(EvictionScheduler evictionScheduler, CommandAsyncExecutor connectionManager, String name) { super(connectionManager, name); - if (evictionScheduler != null) { - evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - } - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); + baseCache = new RedissonMultimapCache<>(connectionManager, evictionScheduler, this, getTimeoutSetName(), prefix); } public RedissonListMultimapCache(EvictionScheduler evictionScheduler, Codec codec, CommandAsyncExecutor connectionManager, String name) { super(codec, connectionManager, name); - if (evictionScheduler != null) { - evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - } - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); + baseCache = new RedissonMultimapCache<>(connectionManager, evictionScheduler, this, getTimeoutSetName(), prefix); } @Override @@ -75,7 +69,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap + "return redis.call('llen', ARGV[3]) > 0 and 1 or 0;" + "end;" + "return 0; ", - Arrays.asList(getRawName(), getTimeoutSetName()), System.currentTimeMillis(), keyState, valuesName); + Arrays.asList(getRawName(), getTimeoutSetName()), System.currentTimeMillis(), keyState, valuesName); } String getTimeoutSetName() { @@ -109,7 +103,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap "end;" + "end; " + "return 0; ", - Arrays.asList(getRawName(), getTimeoutSetName()), + Arrays.asList(getRawName(), getTimeoutSetName()), valueState, System.currentTimeMillis(), prefix); } @@ -135,7 +129,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap "end; " + "end; " + "return 0; ", - Arrays.asList(valuesName, getTimeoutSetName()), + Arrays.asList(valuesName, getTimeoutSetName()), System.currentTimeMillis(), keyState, valueState); } @@ -144,7 +138,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap String keyHash = keyHash(key); String valuesName = getValuesName(keyHash); - return new RedissonListMultimapValues(codec, commandExecutor, valuesName, getTimeoutSetName(), key); + return new RedissonListMultimapValues<>(codec, commandExecutor, valuesName, getTimeoutSetName(), key); } @Override @@ -163,7 +157,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap "return redis.call('lrange', KEYS[1], 0, -1); " + "end; " + "return {}; ", - Arrays.asList(valuesName, getTimeoutSetName()), System.currentTimeMillis(), keyState); + Arrays.asList(valuesName, getTimeoutSetName()), System.currentTimeMillis(), keyState); } @Override @@ -178,7 +172,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap "redis.call('del', KEYS[2]); " + "redis.call('zrem', KEYS[3], ARGV[1]); " + "return members; ", - Arrays.asList(getRawName(), valuesName, getTimeoutSetName()), keyState); + Arrays.asList(getRawName(), valuesName, getTimeoutSetName()), keyState); } @Override @@ -215,5 +209,9 @@ public class RedissonListMultimapCache extends RedissonListMultimap public RFuture clearExpireAsync() { return baseCache.clearExpireAsync(); } - + + @Override + public void destroy() { + baseCache.destroy(); + } } diff --git a/redisson/src/main/java/org/redisson/RedissonMultimapCache.java b/redisson/src/main/java/org/redisson/RedissonMultimapCache.java index 8d49e7a0c..53b30adec 100644 --- a/redisson/src/main/java/org/redisson/RedissonMultimapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonMultimapCache.java @@ -24,6 +24,7 @@ import org.redisson.api.RObject; import org.redisson.client.codec.LongCodec; import org.redisson.client.protocol.RedisCommands; import org.redisson.command.CommandAsyncExecutor; +import org.redisson.eviction.EvictionScheduler; /** * @@ -31,18 +32,24 @@ import org.redisson.command.CommandAsyncExecutor; * * @param key type */ -public class RedissonMultimapCache { +class RedissonMultimapCache { private final CommandAsyncExecutor commandExecutor; private final RObject object; private final String timeoutSetName; private final String prefix; + private final EvictionScheduler evictionScheduler; - public RedissonMultimapCache(CommandAsyncExecutor commandExecutor, RObject object, String timeoutSetName, String prefix) { + RedissonMultimapCache(CommandAsyncExecutor commandExecutor, EvictionScheduler evictionScheduler, + RObject object, String timeoutSetName, String prefix) { this.commandExecutor = commandExecutor; this.object = object; this.timeoutSetName = timeoutSetName; this.prefix = prefix; + this.evictionScheduler = evictionScheduler; + if (evictionScheduler != null) { + evictionScheduler.scheduleCleanMultimap(((RedissonObject) object).getRawName(), timeoutSetName); + } } public RFuture expireKeyAsync(K key, long timeToLive, TimeUnit timeUnit) { @@ -152,5 +159,11 @@ public class RedissonMultimapCache { prefix); } + public void destroy() { + if (evictionScheduler != null) { + evictionScheduler.remove(((RedissonObject) object).getRawName()); + } + ((RedissonObject) object).removeListeners(); + } } diff --git a/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java b/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java index cb086d868..316f633ed 100644 --- a/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java @@ -40,10 +40,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im public RedissonSetMultimapCache(EvictionScheduler evictionScheduler, CommandAsyncExecutor connectionManager, String name) { super(connectionManager, name); - if (evictionScheduler != null) { - evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - } - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); + baseCache = new RedissonMultimapCache<>(connectionManager, evictionScheduler, this, getTimeoutSetName(), prefix); } public RedissonSetMultimapCache(EvictionScheduler evictionScheduler, Codec codec, CommandAsyncExecutor connectionManager, String name) { @@ -51,7 +48,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im if (evictionScheduler != null) { evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); } - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); + baseCache = new RedissonMultimapCache<>(connectionManager, evictionScheduler, this, getTimeoutSetName(), prefix); } @Override @@ -75,7 +72,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im + "return redis.call('scard', ARGV[3]) > 0 and 1 or 0;" + "end;" + "return 0; ", - Arrays.asList(getRawName(), getTimeoutSetName()), + Arrays.asList(getRawName(), getTimeoutSetName()), System.currentTimeMillis(), keyState, setName); } @@ -106,7 +103,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im "end;" + "end; " + "return 0; ", - Arrays.asList(getRawName(), getTimeoutSetName()), + Arrays.asList(getRawName(), getTimeoutSetName()), valueState, System.currentTimeMillis(), prefix); } @@ -129,7 +126,8 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im "end;" + "end; " + "return 0; ", - Arrays.asList(setName, getTimeoutSetName()), System.currentTimeMillis(), keyState, valueState); + Arrays.asList(setName, getTimeoutSetName()), + System.currentTimeMillis(), keyState, valueState); } @Override @@ -137,7 +135,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im String keyHash = keyHash(key); String setName = getValuesName(keyHash); - return new RedissonSetMultimapValues(codec, commandExecutor, setName, getTimeoutSetName(), key); + return new RedissonSetMultimapValues<>(codec, commandExecutor, setName, getTimeoutSetName(), key); } @Override @@ -156,7 +154,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im "return redis.call('smembers', KEYS[1]); " + "end; " + "return {}; ", - Arrays.asList(setName, getTimeoutSetName()), System.currentTimeMillis(), keyState); + Arrays.asList(setName, getTimeoutSetName()), System.currentTimeMillis(), keyState); } @Override @@ -171,7 +169,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im "redis.call('del', KEYS[2]); " + "redis.call('zrem', KEYS[3], ARGV[1]); " + "return members; ", - Arrays.asList(getRawName(), setName, getTimeoutSetName()), keyState); + Arrays.asList(getRawName(), setName, getTimeoutSetName()), keyState); } @Override @@ -208,5 +206,10 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im public RFuture clearExpireAsync() { return baseCache.clearExpireAsync(); } - + + @Override + public void destroy() { + baseCache.destroy(); + } + } diff --git a/redisson/src/main/java/org/redisson/api/RMultimapCache.java b/redisson/src/main/java/org/redisson/api/RMultimapCache.java index e55b524f4..292583d58 100644 --- a/redisson/src/main/java/org/redisson/api/RMultimapCache.java +++ b/redisson/src/main/java/org/redisson/api/RMultimapCache.java @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; * @param key type * @param value type */ -public interface RMultimapCache extends RMultimap, RMultimapCacheAsync { +public interface RMultimapCache extends RMultimap, RMultimapCacheAsync, RDestroyable { /** * Set a timeout for key. After the timeout has expired,