From 07131b883a346e036f0fb6087b8e1fa93affec84 Mon Sep 17 00:00:00 2001 From: Nikita Date: Thu, 8 Feb 2018 07:35:06 +0300 Subject: [PATCH] Fixed - Multimap cluster compatibility. #1286 --- .../org/redisson/RedissonListMultimap.java | 10 +- .../redisson/RedissonListMultimapCache.java | 14 +- .../java/org/redisson/RedissonMultimap.java | 25 ++- .../org/redisson/RedissonMultimapCache.java | 30 ++- .../org/redisson/RedissonSetMultimap.java | 10 +- .../redisson/RedissonSetMultimapCache.java | 14 +- .../RedissonBaseMultimapCacheTest.java | 172 ++++++++++++++++++ .../RedissonListMultimapCacheTest.java | 113 +----------- .../redisson/RedissonListMultimapTest.java | 4 +- .../RedissonSetMultimapCacheTest.java | 166 +---------------- 10 files changed, 250 insertions(+), 308 deletions(-) create mode 100644 redisson/src/test/java/org/redisson/RedissonBaseMultimapCacheTest.java diff --git a/redisson/src/main/java/org/redisson/RedissonListMultimap.java b/redisson/src/main/java/org/redisson/RedissonListMultimap.java index f607439a2..27aaf5c61 100644 --- a/redisson/src/main/java/org/redisson/RedissonListMultimap.java +++ b/redisson/src/main/java/org/redisson/RedissonListMultimap.java @@ -62,12 +62,13 @@ public class RedissonListMultimap extends RedissonMultimap implement "local size = 0; " + "for i, v in ipairs(keys) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[1] .. v; " + "size = size + redis.call('llen', name); " + "end;" + "end; " + "return size; ", - Arrays.asList(getName())); + Arrays.asList(getName()), + prefix); } @Override @@ -87,7 +88,7 @@ public class RedissonListMultimap extends RedissonMultimap implement "local keys = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(keys) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[2] .. v; " + "local items = redis.call('lrange', name, 0, -1) " + "for i=1,#items do " + @@ -98,7 +99,8 @@ public class RedissonListMultimap extends RedissonMultimap implement "end;" + "end; " + "return 0; ", - Arrays.asList(getName()), valueState); + Arrays.asList(getName()), + valueState, prefix); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java b/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java index 0d9e23588..981b526e7 100644 --- a/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonListMultimapCache.java @@ -43,13 +43,13 @@ public class RedissonListMultimapCache extends RedissonListMultimap RedissonListMultimapCache(UUID id, EvictionScheduler evictionScheduler, CommandAsyncExecutor connectionManager, String name) { super(id, connectionManager, name); evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName()); + baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); } RedissonListMultimapCache(UUID id, EvictionScheduler evictionScheduler, Codec codec, CommandAsyncExecutor connectionManager, String name) { super(id, codec, connectionManager, name); evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName()); + baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); } public RFuture containsKeyAsync(Object key) { @@ -76,7 +76,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap } String getTimeoutSetName() { - return "redisson_list_multimap_ttl{" + getName() + "}"; + return suffixName(getName(), "redisson_list_multimap_ttl"); } @@ -93,7 +93,7 @@ public class RedissonListMultimapCache extends RedissonListMultimap + "expireDate = tonumber(expireDateScore) " + "end; " + "if expireDate > tonumber(ARGV[2]) then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[3] .. v; " + "local items = redis.call('lrange', name, 0, -1) " + "for i=1,#items do " + @@ -106,7 +106,8 @@ public class RedissonListMultimapCache extends RedissonListMultimap "end;" + "end; " + "return 0; ", - Arrays.asList(getName(), getTimeoutSetName()), valueState, System.currentTimeMillis()); + Arrays.asList(getName(), getTimeoutSetName()), + valueState, System.currentTimeMillis(), prefix); } public RFuture containsEntryAsync(Object key, Object value) { @@ -130,7 +131,8 @@ public class RedissonListMultimapCache extends RedissonListMultimap "end; " + "end; " + "return 0; ", - Arrays.asList(valuesName, getTimeoutSetName()), System.currentTimeMillis(), keyState, valueState); + Arrays.asList(valuesName, getTimeoutSetName()), + System.currentTimeMillis(), keyState, valueState); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonMultimap.java b/redisson/src/main/java/org/redisson/RedissonMultimap.java index d3a54f397..a678ede8e 100644 --- a/redisson/src/main/java/org/redisson/RedissonMultimap.java +++ b/redisson/src/main/java/org/redisson/RedissonMultimap.java @@ -15,7 +15,6 @@ */ package org.redisson; -import java.net.InetSocketAddress; import java.util.AbstractCollection; import java.util.AbstractSet; import java.util.ArrayList; @@ -58,15 +57,18 @@ import io.netty.buffer.ByteBuf; public abstract class RedissonMultimap extends RedissonExpirable implements RMultimap { private final UUID id; + final String prefix; RedissonMultimap(UUID id, CommandAsyncExecutor connectionManager, String name) { super(connectionManager, name); this.id = id; + prefix = suffixName(getName(), ""); } RedissonMultimap(UUID id, Codec codec, CommandAsyncExecutor connectionManager, String name) { super(codec, connectionManager, name); this.id = id; + prefix = suffixName(getName(), ""); } @Override @@ -139,7 +141,7 @@ public abstract class RedissonMultimap extends RedissonExpirable implement } String getValuesName(String hash) { - return "{" + getName() + "}:" + hash; + return suffixName(getName(), hash); } @Override @@ -239,7 +241,7 @@ public abstract class RedissonMultimap extends RedissonExpirable implement "local keys = {KEYS[1]}; " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[1] .. v; " + "table.insert(keys, name); " + "end;" + "end; " + @@ -249,7 +251,7 @@ public abstract class RedissonMultimap extends RedissonExpirable implement + "n = n + redis.call('del', unpack(keys, i, math.min(i+4999, table.getn(keys)))) " + "end; " + "return n;", - Arrays.asList(getName())); + Arrays.asList(getName()), prefix); } @Override @@ -258,12 +260,13 @@ public abstract class RedissonMultimap extends RedissonExpirable implement "local entries = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[2] .. v; " + "redis.call('pexpire', name, ARGV[1]); " + "end;" + "end; " + "return redis.call('pexpire', KEYS[1], ARGV[1]); ", - Arrays.asList(getName()), timeUnit.toMillis(timeToLive)); + Arrays.asList(getName()), + timeUnit.toMillis(timeToLive), prefix); } @Override @@ -272,12 +275,13 @@ public abstract class RedissonMultimap extends RedissonExpirable implement "local entries = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[2] .. v; " + "redis.call('pexpireat', name, ARGV[1]); " + "end;" + "end; " + "return redis.call('pexpireat', KEYS[1], ARGV[1]); ", - Arrays.asList(getName()), timestamp); + Arrays.asList(getName()), + timestamp, prefix); } @Override @@ -286,12 +290,13 @@ public abstract class RedissonMultimap extends RedissonExpirable implement "local entries = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[1] .. v; " + "redis.call('persist', name); " + "end;" + "end; " + "return redis.call('persist', KEYS[1]); ", - Arrays.asList(getName())); + Arrays.asList(getName()), + prefix); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonMultimapCache.java b/redisson/src/main/java/org/redisson/RedissonMultimapCache.java index 7d3acbcc3..7ca0221f8 100644 --- a/redisson/src/main/java/org/redisson/RedissonMultimapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonMultimapCache.java @@ -24,16 +24,24 @@ import org.redisson.client.codec.LongCodec; import org.redisson.client.protocol.RedisCommands; import org.redisson.command.CommandAsyncExecutor; +/** + * + * @author Nikita Koksharov + * + * @param key type + */ public class RedissonMultimapCache { private final CommandAsyncExecutor commandExecutor; private final RObject object; private final String timeoutSetName; + private final String prefix; - public RedissonMultimapCache(CommandAsyncExecutor commandExecutor, RObject object, String timeoutSetName) { + public RedissonMultimapCache(CommandAsyncExecutor commandExecutor, RObject object, String timeoutSetName, String prefix) { this.commandExecutor = commandExecutor; this.object = object; this.timeoutSetName = timeoutSetName; + this.prefix = prefix; } public RFuture expireKeyAsync(K key, long timeToLive, TimeUnit timeUnit) { @@ -60,7 +68,7 @@ public class RedissonMultimapCache { "local keys = {KEYS[1], KEYS[2]}; " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[1] .. v; " + "table.insert(keys, name); " + "end;" + "end; " + @@ -70,7 +78,8 @@ public class RedissonMultimapCache { + "n = n + redis.call('del', unpack(keys, i, math.min(i+4999, table.getn(keys)))) " + "end; " + "return n;", - Arrays.asList(object.getName(), timeoutSetName)); + Arrays.asList(object.getName(), timeoutSetName), + prefix); } public RFuture expireAsync(long timeToLive, TimeUnit timeUnit) { @@ -79,13 +88,14 @@ public class RedissonMultimapCache { "local entries = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[2] .. v; " + "redis.call('pexpire', name, ARGV[1]); " + "end;" + "end; " + "redis.call('pexpire', KEYS[2], ARGV[1]); " + "return redis.call('pexpire', KEYS[1], ARGV[1]); ", - Arrays.asList(object.getName(), timeoutSetName), timeUnit.toMillis(timeToLive)); + Arrays.asList(object.getName(), timeoutSetName), + timeUnit.toMillis(timeToLive), prefix); } public RFuture expireAtAsync(long timestamp) { @@ -94,13 +104,14 @@ public class RedissonMultimapCache { "local entries = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[2] .. v; " + "redis.call('pexpireat', name, ARGV[1]); " + "end;" + "end; " + "redis.call('pexpireat', KEYS[2], ARGV[1]); " + "return redis.call('pexpireat', KEYS[1], ARGV[1]); ", - Arrays.asList(object.getName(), timeoutSetName), timestamp); + Arrays.asList(object.getName(), timeoutSetName), + timestamp, prefix); } public RFuture clearExpireAsync() { @@ -109,13 +120,14 @@ public class RedissonMultimapCache { "local entries = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(entries) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[1] .. v; " + "redis.call('persist', name); " + "end;" + "end; " + "redis.call('persist', KEYS[2]); " + "return redis.call('persist', KEYS[1]); ", - Arrays.asList(object.getName(), timeoutSetName)); + Arrays.asList(object.getName(), timeoutSetName), + prefix); } diff --git a/redisson/src/main/java/org/redisson/RedissonSetMultimap.java b/redisson/src/main/java/org/redisson/RedissonSetMultimap.java index a813fc811..3b7bb7eba 100644 --- a/redisson/src/main/java/org/redisson/RedissonSetMultimap.java +++ b/redisson/src/main/java/org/redisson/RedissonSetMultimap.java @@ -65,12 +65,13 @@ public class RedissonSetMultimap extends RedissonMultimap implements "local size = 0; " + "for i, v in ipairs(keys) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[1] .. v; " + "size = size + redis.call('scard', name); " + "end;" + "end; " + "return size; ", - Arrays.asList(getName())); + Arrays.asList(getName()), + prefix); } @Override @@ -90,14 +91,15 @@ public class RedissonSetMultimap extends RedissonMultimap implements "local keys = redis.call('hgetall', KEYS[1]); " + "for i, v in ipairs(keys) do " + "if i % 2 == 0 then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[2] .. v; " + "if redis.call('sismember', name, ARGV[1]) == 1 then " + "return 1; " + "end;" + "end;" + "end; " + "return 0; ", - Arrays.asList(getName()), valueState); + Arrays.asList(getName()), + valueState, prefix); } @Override diff --git a/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java b/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java index 39ccd5bbd..63747d65f 100644 --- a/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java +++ b/redisson/src/main/java/org/redisson/RedissonSetMultimapCache.java @@ -43,13 +43,13 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im RedissonSetMultimapCache(UUID id, EvictionScheduler evictionScheduler, CommandAsyncExecutor connectionManager, String name) { super(id, connectionManager, name); evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName()); + baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); } RedissonSetMultimapCache(UUID id, EvictionScheduler evictionScheduler, Codec codec, CommandAsyncExecutor connectionManager, String name) { super(id, codec, connectionManager, name); evictionScheduler.scheduleCleanMultimap(name, getTimeoutSetName()); - baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName()); + baseCache = new RedissonMultimapCache(connectionManager, this, getTimeoutSetName(), prefix); } @Override @@ -73,11 +73,12 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im + "return redis.call('scard', ARGV[3]) > 0 and 1 or 0;" + "end;" + "return 0; ", - Arrays.asList(getName(), getTimeoutSetName()), System.currentTimeMillis(), keyState, setName); + Arrays.asList(getName(), getTimeoutSetName()), + System.currentTimeMillis(), keyState, setName); } String getTimeoutSetName() { - return "redisson_set_multimap_ttl{" + getName() + "}"; + return suffixName(getName(), "redisson_set_multimap_ttl"); } @@ -95,7 +96,7 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im + "expireDate = tonumber(expireDateScore) " + "end; " + "if expireDate > tonumber(ARGV[2]) then " + - "local name = '{' .. KEYS[1] .. '}:' .. v; " + + "local name = ARGV[3] .. v; " + "if redis.call('sismember', name, ARGV[1]) == 1 then " + "return 1; " + "end;" + @@ -103,7 +104,8 @@ public class RedissonSetMultimapCache extends RedissonSetMultimap im "end;" + "end; " + "return 0; ", - Arrays.asList(getName(), getTimeoutSetName()), valueState, System.currentTimeMillis()); + Arrays.asList(getName(), getTimeoutSetName()), + valueState, System.currentTimeMillis(), prefix); } @Override diff --git a/redisson/src/test/java/org/redisson/RedissonBaseMultimapCacheTest.java b/redisson/src/test/java/org/redisson/RedissonBaseMultimapCacheTest.java new file mode 100644 index 000000000..71c6919e5 --- /dev/null +++ b/redisson/src/test/java/org/redisson/RedissonBaseMultimapCacheTest.java @@ -0,0 +1,172 @@ +package org.redisson; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.concurrent.TimeUnit; + +import org.junit.Test; +import org.redisson.api.RMultimapCache; + +public abstract class RedissonBaseMultimapCacheTest extends BaseTest { + + abstract RMultimapCache getMultimapCache(String name); + + @Test + public void testContains() { + RMultimapCache multimap = getMultimapCache("test"); + multimap.put("1", "1"); + multimap.put("1", "2"); + multimap.put("1", "3"); + + assertThat(multimap.containsKey("1")).isTrue(); + assertThat(multimap.containsKey("2")).isFalse(); + + assertThat(multimap.containsValue("1")).isTrue(); + assertThat(multimap.containsValue("3")).isTrue(); + assertThat(multimap.containsValue("4")).isFalse(); + + assertThat(multimap.containsEntry("1", "1")).isTrue(); + assertThat(multimap.containsEntry("1", "3")).isTrue(); + assertThat(multimap.containsEntry("1", "4")).isFalse(); + } + + @Test + public void testContainsExpired() throws InterruptedException { + RMultimapCache multimap = getMultimapCache("test"); + multimap.put("1", "1"); + multimap.put("1", "2"); + multimap.put("1", "3"); + multimap.expireKey("1", 1, TimeUnit.SECONDS); + + Thread.sleep(1000); + + assertThat(multimap.containsKey("1")).isFalse(); + assertThat(multimap.containsKey("2")).isFalse(); + + assertThat(multimap.containsValue("1")).isFalse(); + assertThat(multimap.containsValue("3")).isFalse(); + assertThat(multimap.containsValue("4")).isFalse(); + + assertThat(multimap.containsEntry("1", "1")).isFalse(); + assertThat(multimap.containsEntry("1", "3")).isFalse(); + assertThat(multimap.containsEntry("1", "4")).isFalse(); + } + + @Test + public void testGetAll() throws InterruptedException { + RMultimapCache multimap = getMultimapCache("test"); + multimap.put("1", "1"); + multimap.put("1", "2"); + multimap.put("1", "3"); + + assertThat(multimap.getAll("1")).containsOnlyOnce("1", "2", "3"); + } + + @Test + public void testGetAllExpired() throws InterruptedException { + RMultimapCache multimap = getMultimapCache("test"); + multimap.put("1", "1"); + multimap.put("1", "2"); + multimap.put("1", "3"); + multimap.expireKey("1", 1, TimeUnit.SECONDS); + + Thread.sleep(1000); + + assertThat(multimap.getAll("1")).isEmpty(); + } + + @Test + public void testValuesExpired() throws InterruptedException { + RMultimapCache multimap = getMultimapCache("test"); + multimap.put("1", "1"); + multimap.put("1", "2"); + multimap.put("1", "3"); + multimap.expireKey("1", 1, TimeUnit.SECONDS); + + Thread.sleep(1500); + + assertThat(multimap.get("1").size()).isZero(); + assertThat(multimap.get("1").isEmpty()).isTrue(); + assertThat(multimap.get("1").remove("3")).isFalse(); + assertThat(multimap.get("1").contains("3")).isFalse(); + assertThat(multimap.get("1").retainAll(Arrays.asList("1"))).isFalse(); + assertThat(multimap.get("1").containsAll(Arrays.asList("1"))).isFalse(); + assertThat(multimap.get("1").removeAll(Arrays.asList("1"))).isFalse(); + } + + @Test + public void testScheduler() throws InterruptedException { + RMultimapCache cache = getMultimapCache("simple33"); + assertThat(cache.put("1", "1")).isTrue(); + assertThat(cache.put("1", "2")).isTrue(); + assertThat(cache.put("1", "3")).isTrue(); + assertThat(cache.put("2", "1")).isTrue(); + assertThat(cache.put("2", "2")).isTrue(); + assertThat(cache.put("2", "3")).isTrue(); + + assertThat(cache.expireKey("1", 2, TimeUnit.SECONDS)).isTrue(); + assertThat(cache.expireKey("2", 3, TimeUnit.SECONDS)).isTrue(); + assertThat(cache.expireKey("3", 3, TimeUnit.SECONDS)).isFalse(); + + assertThat(cache.size()).isEqualTo(6); + + Thread.sleep(10000); + + assertThat(cache.size()).isZero(); + + } + + @Test + public void testExpire() throws InterruptedException { + RMultimapCache map = getMultimapCache("simple"); + map.put("1", "2"); + map.put("2", "3"); + + map.expire(100, TimeUnit.MILLISECONDS); + + Thread.sleep(500); + + assertThat(map.size()).isZero(); + } + + @Test + public void testExpireAt() throws InterruptedException { + RMultimapCache map = getMultimapCache("simple"); + map.put("1", "2"); + map.put("2", "3"); + + map.expireAt(System.currentTimeMillis() + 100); + + Thread.sleep(500); + + assertThat(map.size()).isZero(); + } + + @Test + public void testClearExpire() throws InterruptedException { + RMultimapCache map = getMultimapCache("simple"); + map.put("1", "2"); + map.put("2", "3"); + + map.expireAt(System.currentTimeMillis() + 100); + + map.clearExpire(); + + Thread.sleep(500); + + assertThat(map.size()).isEqualTo(2); + } + + @Test + public void testDelete() { + RMultimapCache map = getMultimapCache("simple"); + map.put("1", "2"); + map.put("2", "3"); + assertThat(map.delete()).isTrue(); + + RMultimapCache map2 = getMultimapCache("simple1"); + assertThat(map2.delete()).isFalse(); + } + +} diff --git a/redisson/src/test/java/org/redisson/RedissonListMultimapCacheTest.java b/redisson/src/test/java/org/redisson/RedissonListMultimapCacheTest.java index 35765114b..8b419f5e9 100644 --- a/redisson/src/test/java/org/redisson/RedissonListMultimapCacheTest.java +++ b/redisson/src/test/java/org/redisson/RedissonListMultimapCacheTest.java @@ -3,80 +3,20 @@ package org.redisson; import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; -import java.util.concurrent.TimeUnit; import org.junit.Test; import org.redisson.api.RMultimapCache; -public class RedissonListMultimapCacheTest extends BaseTest { +public class RedissonListMultimapCacheTest extends RedissonBaseMultimapCacheTest { - @Test - public void testContains() { - RMultimapCache multimap = redisson.getListMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - - assertThat(multimap.containsKey("1")).isTrue(); - assertThat(multimap.containsKey("2")).isFalse(); - - assertThat(multimap.containsValue("1")).isTrue(); - assertThat(multimap.containsValue("3")).isTrue(); - assertThat(multimap.containsValue("4")).isFalse(); - - assertThat(multimap.containsEntry("1", "1")).isTrue(); - assertThat(multimap.containsEntry("1", "3")).isTrue(); - assertThat(multimap.containsEntry("1", "4")).isFalse(); - } - - @Test - public void testContainsExpired() throws InterruptedException { - RMultimapCache multimap = redisson.getListMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - multimap.expireKey("1", 1, TimeUnit.SECONDS); - - Thread.sleep(1000); - - assertThat(multimap.containsKey("1")).isFalse(); - assertThat(multimap.containsKey("2")).isFalse(); - - assertThat(multimap.containsValue("1")).isFalse(); - assertThat(multimap.containsValue("3")).isFalse(); - assertThat(multimap.containsValue("4")).isFalse(); - - assertThat(multimap.containsEntry("1", "1")).isFalse(); - assertThat(multimap.containsEntry("1", "3")).isFalse(); - assertThat(multimap.containsEntry("1", "4")).isFalse(); - } - - @Test - public void testGetAll() throws InterruptedException { - RMultimapCache multimap = redisson.getListMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - - assertThat(multimap.getAll("1")).containsOnlyOnce("1", "2", "3"); - } - - @Test - public void testGetAllExpired() throws InterruptedException { - RMultimapCache multimap = redisson.getListMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - multimap.expireKey("1", 1, TimeUnit.SECONDS); - - Thread.sleep(1000); - - assertThat(multimap.getAll("1")).isEmpty(); + @Override + RMultimapCache getMultimapCache(String name) { + return redisson.getListMultimapCache(name); } @Test public void testValues() throws InterruptedException { - RMultimapCache multimap = redisson.getListMultimapCache("test"); + RMultimapCache multimap = getMultimapCache("test"); multimap.put("1", "1"); multimap.put("1", "2"); multimap.put("1", "3"); @@ -86,6 +26,7 @@ public class RedissonListMultimapCacheTest extends BaseTest { assertThat(multimap.get("1")).containsExactly("1", "2", "3", "3"); assertThat(multimap.get("1").remove("3")).isTrue(); assertThat(multimap.get("1").remove("3")).isTrue(); + assertThat(multimap.get("1").remove("3")).isFalse(); assertThat(multimap.get("1").contains("3")).isFalse(); assertThat(multimap.get("1").contains("2")).isTrue(); assertThat(multimap.get("1").containsAll(Arrays.asList("1"))).isTrue(); @@ -94,46 +35,4 @@ public class RedissonListMultimapCacheTest extends BaseTest { assertThat(multimap.get("1").removeAll(Arrays.asList("1"))).isTrue(); } - @Test - public void testValuesExpired() throws InterruptedException { - RMultimapCache multimap = redisson.getListMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - multimap.expireKey("1", 1, TimeUnit.SECONDS); - - Thread.sleep(1000); - - assertThat(multimap.get("1").size()).isZero(); - assertThat(multimap.get("1").isEmpty()).isTrue(); - assertThat(multimap.get("1").remove("3")).isFalse(); - assertThat(multimap.get("1").contains("3")).isFalse(); - assertThat(multimap.get("1").retainAll(Arrays.asList("1"))).isFalse(); - assertThat(multimap.get("1").containsAll(Arrays.asList("1"))).isFalse(); - assertThat(multimap.get("1").removeAll(Arrays.asList("1"))).isFalse(); - } - - @Test - public void testScheduler() throws InterruptedException { - RMultimapCache cache = redisson.getListMultimapCache("simple33"); - assertThat(cache.put("1", "1")).isTrue(); - assertThat(cache.put("1", "2")).isTrue(); - assertThat(cache.put("1", "3")).isTrue(); - assertThat(cache.put("2", "1")).isTrue(); - assertThat(cache.put("2", "2")).isTrue(); - assertThat(cache.put("2", "3")).isTrue(); - - assertThat(cache.expireKey("1", 2, TimeUnit.SECONDS)).isTrue(); - assertThat(cache.expireKey("2", 3, TimeUnit.SECONDS)).isTrue(); - assertThat(cache.expireKey("3", 3, TimeUnit.SECONDS)).isFalse(); - - assertThat(cache.size()).isEqualTo(6); - - Thread.sleep(10000); - - assertThat(cache.size()).isZero(); - - } - - } diff --git a/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java b/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java index 979beca71..0f276cf57 100644 --- a/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java +++ b/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java @@ -161,7 +161,7 @@ public class RedissonListMultimapTest extends BaseTest { @Test public void testPut() { - RListMultimap map = redisson.getListMultimap("test1"); + RListMultimap map = redisson.getListMultimap("{multi.map}.some.key"); map.put(new SimpleKey("0"), new SimpleValue("1")); map.put(new SimpleKey("0"), new SimpleValue("2")); map.put(new SimpleKey("0"), new SimpleValue("3")); @@ -219,7 +219,7 @@ public class RedissonListMultimapTest extends BaseTest { @Test public void testContainsValue() { - RListMultimap map = redisson.getListMultimap("test1"); + RListMultimap map = redisson.getListMultimap("{1}test1"); map.put(new SimpleKey("0"), new SimpleValue("1")); assertThat(map.containsValue(new SimpleValue("1"))).isTrue(); diff --git a/redisson/src/test/java/org/redisson/RedissonSetMultimapCacheTest.java b/redisson/src/test/java/org/redisson/RedissonSetMultimapCacheTest.java index 89c59642a..e3f008412 100644 --- a/redisson/src/test/java/org/redisson/RedissonSetMultimapCacheTest.java +++ b/redisson/src/test/java/org/redisson/RedissonSetMultimapCacheTest.java @@ -3,88 +3,27 @@ package org.redisson; import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; -import java.util.concurrent.TimeUnit; import org.junit.Test; import org.redisson.api.RMultimapCache; -import org.redisson.api.RSetMultimap; -public class RedissonSetMultimapCacheTest extends BaseTest { +public class RedissonSetMultimapCacheTest extends RedissonBaseMultimapCacheTest { - @Test - public void testContains() { - RMultimapCache multimap = redisson.getSetMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - - assertThat(multimap.containsKey("1")).isTrue(); - assertThat(multimap.containsKey("2")).isFalse(); - - assertThat(multimap.containsValue("1")).isTrue(); - assertThat(multimap.containsValue("3")).isTrue(); - assertThat(multimap.containsValue("4")).isFalse(); - - assertThat(multimap.containsEntry("1", "1")).isTrue(); - assertThat(multimap.containsEntry("1", "3")).isTrue(); - assertThat(multimap.containsEntry("1", "4")).isFalse(); - } - - @Test - public void testContainsExpired() throws InterruptedException { - RMultimapCache multimap = redisson.getSetMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - multimap.expireKey("1", 1, TimeUnit.SECONDS); - - Thread.sleep(1000); - - assertThat(multimap.containsKey("1")).isFalse(); - assertThat(multimap.containsKey("2")).isFalse(); - - assertThat(multimap.containsValue("1")).isFalse(); - assertThat(multimap.containsValue("3")).isFalse(); - assertThat(multimap.containsValue("4")).isFalse(); - - assertThat(multimap.containsEntry("1", "1")).isFalse(); - assertThat(multimap.containsEntry("1", "3")).isFalse(); - assertThat(multimap.containsEntry("1", "4")).isFalse(); - } - - @Test - public void testGetAll() throws InterruptedException { - RMultimapCache multimap = redisson.getSetMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - - assertThat(multimap.getAll("1")).containsOnlyOnce("1", "2", "3"); - } - - @Test - public void testGetAllExpired() throws InterruptedException { - RMultimapCache multimap = redisson.getSetMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - multimap.expireKey("1", 1, TimeUnit.SECONDS); - - Thread.sleep(1000); - - assertThat(multimap.getAll("1")).isEmpty(); + @Override + RMultimapCache getMultimapCache(String name) { + return redisson.getSetMultimapCache(name); } @Test public void testValues() throws InterruptedException { - RMultimapCache multimap = redisson.getSetMultimapCache("test"); + RMultimapCache multimap = getMultimapCache("test"); multimap.put("1", "1"); multimap.put("1", "2"); multimap.put("1", "3"); multimap.put("1", "3"); assertThat(multimap.get("1").size()).isEqualTo(3); - assertThat(multimap.get("1")).containsOnlyOnce("1", "2", "3"); + assertThat(multimap.get("1")).containsExactlyInAnyOrder("1", "2", "3"); assertThat(multimap.get("1").remove("3")).isTrue(); assertThat(multimap.get("1").contains("3")).isFalse(); assertThat(multimap.get("1").contains("2")).isTrue(); @@ -94,97 +33,4 @@ public class RedissonSetMultimapCacheTest extends BaseTest { assertThat(multimap.get("1").removeAll(Arrays.asList("1"))).isTrue(); } - @Test - public void testValuesExpired() throws InterruptedException { - RMultimapCache multimap = redisson.getSetMultimapCache("test"); - multimap.put("1", "1"); - multimap.put("1", "2"); - multimap.put("1", "3"); - multimap.expireKey("1", 1, TimeUnit.SECONDS); - - Thread.sleep(1500); - - assertThat(multimap.get("1").size()).isZero(); - assertThat(multimap.get("1").isEmpty()).isTrue(); - assertThat(multimap.get("1").remove("3")).isFalse(); - assertThat(multimap.get("1").contains("3")).isFalse(); - assertThat(multimap.get("1").retainAll(Arrays.asList("1"))).isFalse(); - assertThat(multimap.get("1").containsAll(Arrays.asList("1"))).isFalse(); - assertThat(multimap.get("1").removeAll(Arrays.asList("1"))).isFalse(); - } - - @Test - public void testScheduler() throws InterruptedException { - RMultimapCache cache = redisson.getSetMultimapCache("simple33"); - assertThat(cache.put("1", "1")).isTrue(); - assertThat(cache.put("1", "2")).isTrue(); - assertThat(cache.put("1", "3")).isTrue(); - assertThat(cache.put("2", "1")).isTrue(); - assertThat(cache.put("2", "2")).isTrue(); - assertThat(cache.put("2", "3")).isTrue(); - - assertThat(cache.expireKey("1", 2, TimeUnit.SECONDS)).isTrue(); - assertThat(cache.expireKey("2", 3, TimeUnit.SECONDS)).isTrue(); - assertThat(cache.expireKey("3", 3, TimeUnit.SECONDS)).isFalse(); - - assertThat(cache.size()).isEqualTo(6); - - Thread.sleep(10000); - - assertThat(cache.size()).isZero(); - - } - - @Test - public void testExpire() throws InterruptedException { - RSetMultimap map = redisson.getSetMultimapCache("simple"); - map.put("1", "2"); - map.put("2", "3"); - - map.expire(100, TimeUnit.MILLISECONDS); - - Thread.sleep(500); - - assertThat(map.size()).isZero(); - } - - @Test - public void testExpireAt() throws InterruptedException { - RSetMultimap map = redisson.getSetMultimapCache("simple"); - map.put("1", "2"); - map.put("2", "3"); - - map.expireAt(System.currentTimeMillis() + 100); - - Thread.sleep(500); - - assertThat(map.size()).isZero(); - } - - @Test - public void testClearExpire() throws InterruptedException { - RSetMultimap map = redisson.getSetMultimapCache("simple"); - map.put("1", "2"); - map.put("2", "3"); - - map.expireAt(System.currentTimeMillis() + 100); - - map.clearExpire(); - - Thread.sleep(500); - - assertThat(map.size()).isEqualTo(2); - } - - @Test - public void testDelete() { - RSetMultimap map = redisson.getSetMultimapCache("simple"); - map.put("1", "2"); - map.put("2", "3"); - assertThat(map.delete()).isTrue(); - - RSetMultimap map2 = redisson.getSetMultimapCache("simple1"); - assertThat(map2.delete()).isFalse(); - } - }