From c4a320cc3c855885fed3250f620cb0b672c402b6 Mon Sep 17 00:00:00 2001 From: Andre Prata Date: Thu, 30 Jul 2020 15:59:19 +0100 Subject: [PATCH] DATAREDIS-1195 - Make putIfAbsent atomic when TTL is set. Original pull request: #553. --- .../data/redis/cache/DefaultRedisCacheWriter.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java index 698f14778..6567d3157 100644 --- a/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java +++ b/src/main/java/org/springframework/data/redis/cache/DefaultRedisCacheWriter.java @@ -45,6 +45,7 @@ import org.springframework.util.Assert; * * @author Christoph Strobl * @author Mark Paluch + * @author André Prata * @since 2.0 */ class DefaultRedisCacheWriter implements RedisCacheWriter { @@ -127,11 +128,15 @@ class DefaultRedisCacheWriter implements RedisCacheWriter { } try { - if (connection.setNX(key, value)) { - if (shouldExpireWithin(ttl)) { - connection.pExpire(key, ttl.toMillis()); - } + boolean put; + if (shouldExpireWithin(ttl)) { + put = connection.set(key, value, Expiration.milliseconds(ttl.toMillis()), SetOption.ifAbsent()); + } else { + put = connection.setNX(key, value); + } + + if (put) { return null; }