From e36d2097bbb5343cb3e84d7bef2484181a90b49d Mon Sep 17 00:00:00 2001 From: Nikita Koksharov Date: Sat, 5 Sep 2020 08:06:43 +0300 Subject: [PATCH] Fixed - `RMultimap.sizeInMemory()` method doesn't take in account size of all associated objects #3034 --- .../main/java/org/redisson/RedissonMultimap.java | 14 ++++++++++++++ .../org/redisson/RedissonListMultimapTest.java | 11 +++++++++++ .../java/org/redisson/RedissonSetMultimapTest.java | 9 +++++++++ 3 files changed, 34 insertions(+) diff --git a/redisson/src/main/java/org/redisson/RedissonMultimap.java b/redisson/src/main/java/org/redisson/RedissonMultimap.java index 5875c3199..c3a419ac5 100644 --- a/redisson/src/main/java/org/redisson/RedissonMultimap.java +++ b/redisson/src/main/java/org/redisson/RedissonMultimap.java @@ -54,6 +54,20 @@ public abstract class RedissonMultimap extends RedissonExpirable implement prefix = suffixName(getName(), ""); } + @Override + public RFuture sizeInMemoryAsync() { + return commandExecutor.evalWriteAsync(getName(), StringCodec.INSTANCE, RedisCommands.EVAL_LONG, + "local keys = redis.call('hgetall', KEYS[1]); " + + "local size = 0; " + + "for i, v in ipairs(keys) do " + + "if i % 2 == 0 then " + + "local name = ARGV[1] .. v; " + + "size = size + redis.call('memory', 'usage', name); " + + "end;" + + "end; " + + "return size; ", Arrays.asList(getName()), prefix); + } + @Override public RLock getFairLock(K key) { String lockName = getLockByMapKey(key, "fairlock"); diff --git a/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java b/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java index 8ad42198c..db4222a28 100644 --- a/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java +++ b/redisson/src/test/java/org/redisson/RedissonListMultimapTest.java @@ -3,6 +3,7 @@ package org.redisson; import org.junit.Test; import org.redisson.api.RList; import org.redisson.api.RListMultimap; +import org.redisson.api.RSetMultimap; import java.io.Serializable; import java.util.*; @@ -113,6 +114,16 @@ public class RedissonListMultimapTest extends BaseTest { } + @Test + public void testSizeInMemory() { + RListMultimap list = redisson.getListMultimap("test"); + list.put("1", "2"); + assertThat(list.sizeInMemory()).isEqualTo(160); + + list.put("1", "3"); + assertThat(list.sizeInMemory()).isEqualTo(166); + } + @Test public void testDelete() { RListMultimap testList = redisson.getListMultimap( "test" ); diff --git a/redisson/src/test/java/org/redisson/RedissonSetMultimapTest.java b/redisson/src/test/java/org/redisson/RedissonSetMultimapTest.java index 891651cae..ec7586bee 100644 --- a/redisson/src/test/java/org/redisson/RedissonSetMultimapTest.java +++ b/redisson/src/test/java/org/redisson/RedissonSetMultimapTest.java @@ -214,6 +214,15 @@ public class RedissonSetMultimapTest extends BaseTest { assertThat(multimap1.keySize()).isEqualTo(0); } + @Test + public void testSizeInMemory() { + RSetMultimap set = redisson.getSetMultimap("test"); + set.put("1", "2"); + assertThat(set.sizeInMemory()).isEqualTo(229); + + set.put("1", "3"); + assertThat(set.sizeInMemory()).isEqualTo(259); + } @Test public void testSize() {