From cde8082493c23b87b9e82ad802da173834e1520d Mon Sep 17 00:00:00 2001 From: Nikita Date: Wed, 30 Dec 2015 15:28:53 +0300 Subject: [PATCH] RBucket.trySet and RBucket.trySetAsync with TTL support added. --- src/main/java/org/redisson/RedissonBucket.java | 16 ++++++++++++++++ .../redisson/client/protocol/RedisCommands.java | 1 + src/main/java/org/redisson/core/RBucket.java | 2 ++ .../java/org/redisson/core/RBucketAsync.java | 2 ++ .../java/org/redisson/RedissonBucketTest.java | 12 ++++++++++++ 5 files changed, 33 insertions(+) diff --git a/src/main/java/org/redisson/RedissonBucket.java b/src/main/java/org/redisson/RedissonBucket.java index d97122023..676faf2f8 100644 --- a/src/main/java/org/redisson/RedissonBucket.java +++ b/src/main/java/org/redisson/RedissonBucket.java @@ -15,6 +15,7 @@ */ package org.redisson; +import java.io.IOException; import java.util.concurrent.TimeUnit; import org.redisson.client.codec.Codec; @@ -89,6 +90,21 @@ public class RedissonBucket extends RedissonExpirable implements RBucket { return commandExecutor.writeAsync(getName(), codec, RedisCommands.SETNX, getName(), value); } + @Override + public Future trySetAsync(V value, long timeToLive, TimeUnit timeUnit) { + try { + byte[] state = codec.getValueEncoder().encode(value); + return commandExecutor.writeAsync(getName(), codec, RedisCommands.SETPXNX, getName(), state, "PX", timeUnit.toMillis(timeToLive), "NX"); + } catch (IOException e) { + throw new IllegalArgumentException(e); + } + } + + @Override + public boolean trySet(V value, long timeToLive, TimeUnit timeUnit) { + return get(trySetAsync(value, timeToLive, timeUnit)); + } + @Override public boolean trySet(V value) { return get(trySetAsync(value)); diff --git a/src/main/java/org/redisson/client/protocol/RedisCommands.java b/src/main/java/org/redisson/client/protocol/RedisCommands.java index 98ffc33ae..f410b9410 100644 --- a/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -196,6 +196,7 @@ public interface RedisCommands { RedisCommand GET = new RedisCommand("GET"); RedisCommand SET = new RedisCommand("SET", new VoidReplayConvertor(), 2); + RedisCommand SETPXNX = new RedisCommand("SET", new BooleanNotNullReplayConvertor()); RedisCommand SETNX = new RedisCommand("SETNX", new BooleanReplayConvertor(), 2); RedisCommand SETEX = new RedisCommand("SETEX", new VoidReplayConvertor(), 3); RedisStrictCommand EXISTS = new RedisStrictCommand("EXISTS", new BooleanReplayConvertor()); diff --git a/src/main/java/org/redisson/core/RBucket.java b/src/main/java/org/redisson/core/RBucket.java index 28cdf8fe7..a21f9f51a 100644 --- a/src/main/java/org/redisson/core/RBucket.java +++ b/src/main/java/org/redisson/core/RBucket.java @@ -30,6 +30,8 @@ public interface RBucket extends RExpirable, RBucketAsync { boolean trySet(V value); + boolean trySet(V value, long timeToLive, TimeUnit timeUnit); + void set(V value); void set(V value, long timeToLive, TimeUnit timeUnit); diff --git a/src/main/java/org/redisson/core/RBucketAsync.java b/src/main/java/org/redisson/core/RBucketAsync.java index 7b009a47c..9dd6073db 100644 --- a/src/main/java/org/redisson/core/RBucketAsync.java +++ b/src/main/java/org/redisson/core/RBucketAsync.java @@ -32,6 +32,8 @@ public interface RBucketAsync extends RExpirableAsync { Future trySetAsync(V value); + Future trySetAsync(V value, long timeToLive, TimeUnit timeUnit); + Future setAsync(V value); Future setAsync(V value, long timeToLive, TimeUnit timeUnit); diff --git a/src/test/java/org/redisson/RedissonBucketTest.java b/src/test/java/org/redisson/RedissonBucketTest.java index 9c5d596f6..2d02df591 100755 --- a/src/test/java/org/redisson/RedissonBucketTest.java +++ b/src/test/java/org/redisson/RedissonBucketTest.java @@ -22,6 +22,18 @@ public class RedissonBucketTest extends BaseTest { assertThat(r1.get()).isEqualTo("3"); } + @Test + public void testTrySetTTL() throws InterruptedException { + RBucket r1 = redisson.getBucket("12"); + assertThat(r1.trySet("3", 500, TimeUnit.MILLISECONDS)).isTrue(); + assertThat(r1.trySet("4", 500, TimeUnit.MILLISECONDS)).isFalse(); + assertThat(r1.get()).isEqualTo("3"); + + Thread.sleep(500); + + assertThat(r1.get()).isNull(); + } + @Test public void testSaveBuckets() { Map buckets = new HashMap();