diff --git a/src/main/java/org/redisson/RedissonMap.java b/src/main/java/org/redisson/RedissonMap.java index 478da9b1a..9469babca 100644 --- a/src/main/java/org/redisson/RedissonMap.java +++ b/src/main/java/org/redisson/RedissonMap.java @@ -148,12 +148,23 @@ public class RedissonMap extends RedissonExpirable implements RMap { } @Override - public void putAll(final Map map) { - if (map.size() == 0) { - return; + public void putAll(Map map) { + get(putAllAsync(map)); + } + + public Future putAllAsync(Map map) { + if (map.isEmpty()) { + return newSucceededFuture(null); + } + + List params = new ArrayList(map.size()*2 + 1); + params.add(getName()); + for (java.util.Map.Entry t : map.entrySet()) { + params.add(t.getKey()); + params.add(t.getValue()); } - commandExecutor.write(getName(), codec, RedisCommands.HMSET, getName(), map); + return commandExecutor.writeAsync(getName(), codec, RedisCommands.HMSET, params.toArray()); } @Override diff --git a/src/main/java/org/redisson/RedissonObject.java b/src/main/java/org/redisson/RedissonObject.java index bd661c1e1..0759daacb 100644 --- a/src/main/java/org/redisson/RedissonObject.java +++ b/src/main/java/org/redisson/RedissonObject.java @@ -52,6 +52,10 @@ abstract class RedissonObject implements RObject { return commandExecutor.getConnectionManager().getGroup().next().newPromise(); } + protected Future newSucceededFuture(V result) { + return commandExecutor.getConnectionManager().getGroup().next().newSucceededFuture(result); + } + @Override public String getName() { return name; diff --git a/src/main/java/org/redisson/client/protocol/RedisCommands.java b/src/main/java/org/redisson/client/protocol/RedisCommands.java index eefeb69e5..1e1606a46 100644 --- a/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -150,7 +150,7 @@ public interface RedisCommands { RedisCommand HEXISTS = new RedisCommand("HEXISTS", new BooleanReplayConvertor(), 2, ValueType.MAP_KEY); RedisStrictCommand HLEN = new RedisStrictCommand("HLEN", new IntegerReplayConvertor()); RedisCommand> HKEYS = new RedisCommand>("HKEYS", new ObjectSetReplayDecoder(), ValueType.MAP_KEY); - RedisCommand HMSET = new RedisCommand("HMSET", new StringReplayDecoder(), 1, ValueType.MAP); + RedisCommand HMSET = new RedisCommand("HMSET", new StringReplayDecoder(), 2, ValueType.MAP); RedisCommand> HMGET = new RedisCommand>("HMGET", new ObjectListReplayDecoder(), 2, ValueType.MAP_KEY, ValueType.MAP_VALUE); RedisCommand HGET = new RedisCommand("HGET", 2, ValueType.MAP_KEY, ValueType.MAP_VALUE); RedisCommand HDEL = new RedisStrictCommand("HDEL", 2, ValueType.MAP_KEY); diff --git a/src/main/java/org/redisson/core/RMapAsync.java b/src/main/java/org/redisson/core/RMapAsync.java index d3e224a7f..4aaed8523 100644 --- a/src/main/java/org/redisson/core/RMapAsync.java +++ b/src/main/java/org/redisson/core/RMapAsync.java @@ -16,6 +16,7 @@ package org.redisson.core; import java.util.Collection; +import java.util.Map; import java.util.Set; import io.netty.util.concurrent.Future; @@ -30,6 +31,8 @@ import io.netty.util.concurrent.Future; */ public interface RMapAsync extends RExpirableAsync { + Future putAllAsync(Map map); + Future addAndGetAsync(K key, Number value); Future> valuesAsync(); diff --git a/src/test/java/org/redisson/RedissonMapTest.java b/src/test/java/org/redisson/RedissonMapTest.java index 38e36a4ef..fc4b3aa57 100644 --- a/src/test/java/org/redisson/RedissonMapTest.java +++ b/src/test/java/org/redisson/RedissonMapTest.java @@ -277,6 +277,22 @@ public class RedissonMapTest extends BaseTest { Assert.assertEquals(1, map.size()); } + @Test + public void testPutAll() { + Map map = redisson.getMap("simple"); + map.put(1, "1"); + map.put(2, "2"); + map.put(3, "3"); + + Map joinMap = new HashMap(); + joinMap.put(4, "4"); + joinMap.put(5, "5"); + joinMap.put(6, "6"); + map.putAll(joinMap); + + MatcherAssert.assertThat(map.keySet(), Matchers.containsInAnyOrder(1, 2, 3, 4, 5, 6)); + } + @Test public void testKeySet() { Map map = redisson.getMap("simple");