diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundHashOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundHashOperations.java index a2d5a5f11..951a2f154 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundHashOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundHashOperations.java @@ -36,6 +36,8 @@ public interface BoundHashOperations extends KeyBound { void put(HK key, HV value); + Boolean putIfAbsent(HK key, HV value); + Collection multiGet(Collection keys); void putAll(Map m); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundHashOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundHashOperations.java index d0ef05c01..d7eb1e9ef 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundHashOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundHashOperations.java @@ -89,6 +89,11 @@ class DefaultBoundHashOperations extends DefaultKeyBound implement ops.put(getKey(), key, value); } + @Override + public Boolean putIfAbsent(HK key, HV value) { + return ops.putIfAbsent(getKey(), key, value); + } + @Override public Collection values() { return ops.values(getKey()); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/HashOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/HashOperations.java index fb780fa16..8b17f042e 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/HashOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/HashOperations.java @@ -44,6 +44,8 @@ public interface HashOperations { void put(H key, HK hashKey, HV value); + Boolean putIfAbsent(H key, HK hashKey, HV value); + Collection values(H key); Map entries(H key); 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 bcb089c6e..7b887dd24 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 @@ -1606,6 +1606,21 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation }, true); } + @Override + public Boolean putIfAbsent(K key, HK hashKey, HV value) { + final byte[] rawKey = rawKey(key); + final byte[] rawHashKey = rawHashKey(hashKey); + final byte[] rawHashValue = rawHashValue(value); + + return execute(new RedisCallback() { + @Override + public Boolean doInRedis(RedisConnection connection) { + return connection.hSetNX(rawKey, rawHashKey, rawHashValue); + } + }, true); + } + + @SuppressWarnings("unchecked") @Override public List values(K key) {