diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java index cd83d47af..a9b1a9dcc 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java @@ -562,17 +562,67 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation @Override public Collection multiGet(Set keys) { - throw new UnsupportedOperationException(); + if (keys.isEmpty()) { + return Collections.emptyList(); + } + + final byte[][] rawKeys = new byte[keys.size()][]; + + int counter = 0; + for (K hashKey : keys) { + rawKeys[counter++] = rawKey(hashKey); + } + + List rawValues = execute(new RedisCallback>() { + @Override + public List doInRedis(RedisConnection connection) { + return connection.mGet(rawKeys); + } + }, true); + + return (List) values(rawValues, List.class); } @Override public void multiSet(Map m) { - throw new UnsupportedOperationException(); + if (m.isEmpty()) { + return; + } + + final Map rawKeys = new LinkedHashMap(m.size()); + + for (Map.Entry entry : m.entrySet()) { + rawKeys.put(rawKey(entry.getKey()), rawValue(entry.getValue())); + } + + execute(new RedisCallback() { + @Override + public Object doInRedis(RedisConnection connection) { + connection.mSet(rawKeys); + return null; + } + }, true); } @Override public void multiSetIfAbsent(Map m) { - throw new UnsupportedOperationException(); + if (m.isEmpty()) { + return; + } + + final Map rawKeys = new LinkedHashMap(m.size()); + + for (Map.Entry entry : m.entrySet()) { + rawKeys.put(rawKey(entry.getKey()), rawValue(entry.getValue())); + } + + execute(new RedisCallback() { + @Override + public Object doInRedis(RedisConnection connection) { + connection.mSetNX(rawKeys); + return null; + } + }, true); } @Override @@ -589,12 +639,30 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation @Override public void set(K key, V value, long timeout, TimeUnit unit) { - throw new UnsupportedOperationException(); + final byte[] rawKey = rawKey(key); + final byte[] rawValue = rawValue(value); + final long rawTimeout = unit.toSeconds(timeout); + + execute(new RedisCallback() { + @Override + public Object doInRedis(RedisConnection connection) throws DataAccessException { + connection.setEx(rawKey, (int) rawTimeout, rawValue); + return null; + } + }, true); } @Override public Boolean setIfAbsent(K key, V value) { - throw new UnsupportedOperationException(); + final byte[] rawKey = rawKey(key); + final byte[] rawValue = rawValue(value); + + return execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) throws DataAccessException { + return connection.setNX(rawKey, rawValue); + } + }, true); } } diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisCollectionTests.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisCollectionTests.java index b58e17318..8ab30cf04 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisCollectionTests.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisCollectionTests.java @@ -22,6 +22,7 @@ import static org.junit.matchers.JUnitMatchers.*; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -101,7 +102,7 @@ public abstract class AbstractRedisCollectionTests { @After public void tearDown() throws Exception { // remove the collection entirely since clear() doesn't always work - collection.getOperations().delete(collection.getKey()); + collection.getOperations().delete(Collections.singleton(collection.getKey())); template.execute(new RedisCallback() { @Override diff --git a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisMapTests.java b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisMapTests.java index ab67e738b..ca50514b0 100644 --- a/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisMapTests.java +++ b/spring-data-redis/src/test/java/org/springframework/data/keyvalue/redis/util/AbstractRedisMapTests.java @@ -21,6 +21,7 @@ import static org.junit.matchers.JUnitMatchers.*; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -101,7 +102,7 @@ public abstract class AbstractRedisMapTests { @After public void tearDown() throws Exception { // remove the collection entirely since clear() doesn't always work - map.getOperations().delete(map.getKey()); + map.getOperations().delete(Collections.singleton(map.getKey())); template.execute(new RedisCallback() { @Override