From 9b5b7f5ac42b68259bebffc0af784f513148acc7 Mon Sep 17 00:00:00 2001 From: Nikita Date: Sat, 4 Mar 2017 11:41:53 +0300 Subject: [PATCH] LocalCachedMap.putAll optimization --- .../org/redisson/RedissonLocalCachedMap.java | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java b/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java index f1742b304..a9c45fc07 100644 --- a/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java +++ b/redisson/src/main/java/org/redisson/RedissonLocalCachedMap.java @@ -53,7 +53,8 @@ import org.redisson.client.protocol.convertor.NumberConvertor; import org.redisson.client.protocol.decoder.ObjectMapEntryReplayDecoder; import org.redisson.client.protocol.decoder.ObjectSetReplayDecoder; import org.redisson.command.CommandAsyncExecutor; -import org.redisson.misc.*; +import org.redisson.misc.Hash; +import org.redisson.misc.RPromise; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.FutureListener; @@ -73,14 +74,14 @@ public class RedissonLocalCachedMap extends RedissonMap implements R public static class LocalCachedMapInvalidate implements Serializable { private byte[] excludedId; - private byte[] keyHash; + private List keyHashes; public LocalCachedMapInvalidate() { } - public LocalCachedMapInvalidate(byte[] excludedId, byte[] keyHash) { + public LocalCachedMapInvalidate(byte[] excludedId, byte[]... keyHash) { super(); - this.keyHash = keyHash; + this.keyHashes = Arrays.asList(keyHash); this.excludedId = excludedId; } @@ -88,8 +89,8 @@ public class RedissonLocalCachedMap extends RedissonMap implements R return excludedId; } - public byte[] getKeyHash() { - return keyHash; + public Collection getKeyHashes() { + return keyHashes; } } @@ -230,8 +231,10 @@ public class RedissonLocalCachedMap extends RedissonMap implements R if (msg instanceof LocalCachedMapInvalidate) { LocalCachedMapInvalidate invalidateMsg = (LocalCachedMapInvalidate)msg; if (!Arrays.equals(invalidateMsg.getExcludedId(), instanceId)) { - CacheKey key = new CacheKey(invalidateMsg.getKeyHash()); - cache.remove(key); + for (byte[] keyHash : invalidateMsg.getKeyHashes()) { + CacheKey key = new CacheKey(keyHash); + cache.remove(key); + } } } } @@ -725,27 +728,30 @@ public class RedissonLocalCachedMap extends RedissonMap implements R } List params = new ArrayList(map.size()*3); - List msgs = new ArrayList(map.size()); params.add(invalidateEntryOnChange); params.add(map.size()*2); + byte[][] hashes = new byte[map.size()][]; + int i = 0; for (java.util.Map.Entry t : map.entrySet()) { byte[] mapKey = encodeMapKey(t.getKey()); byte[] mapValue = encodeMapValue(t.getValue()); params.add(mapKey); params.add(mapValue); CacheKey cacheKey = toCacheKey(mapKey); - byte[] msgEncoded = encode(new LocalCachedMapInvalidate(instanceId, cacheKey.getKeyHash())); - msgs.add(msgEncoded); + hashes[i] = cacheKey.getKeyHash(); + i++; } - params.addAll(msgs); + + byte[] msgEncoded = encode(new LocalCachedMapInvalidate(instanceId, hashes)); + params.add(msgEncoded); final RPromise result = newPromise(); RFuture future = commandExecutor.evalWriteAsync(getName(), codec, RedisCommands.EVAL_VOID, "redis.call('hmset', KEYS[1], unpack(ARGV, 3, tonumber(ARGV[2]) + 2));" + "if ARGV[1] == '1' then " - + "for i = tonumber(ARGV[2]) + 3, #ARGV, 1 do " - + "redis.call('publish', KEYS[2], ARGV[i]); " - + "end; " +// + "for i = tonumber(ARGV[2]) + 3, #ARGV, 1 do " + + "redis.call('publish', KEYS[2], ARGV[#ARGV]); " +// + "end; " + "end;", Arrays.asList(getName(), invalidationTopic.getChannelNames().get(0)), params.toArray());