From 2db93e969ee235fb0fc036029138f376dd183152 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 | 12 ++++++++---- 1 file changed, 8 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 3839f336b..300853925 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 { @@ -153,12 +154,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) { statistics.incPuts(name); return null; }