From ea20533a370763488c16ab72422b69a5ad7a0050 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Wed, 8 Dec 2010 23:23:59 +0200 Subject: [PATCH] + add append and substract operations --- .../redis/connection/RedisStringCommands.java | 2 +- .../connection/jedis/JedisConnection.java | 2 +- .../connection/jredis/JredisConnection.java | 2 +- .../redis/core/BoundValueOperations.java | 4 ++ .../core/DefaultBoundValueOperations.java | 10 ++++ .../keyvalue/redis/core/RedisTemplate.java | 49 +++++++++++++++++++ .../keyvalue/redis/core/ValueOperations.java | 4 ++ 7 files changed, 70 insertions(+), 3 deletions(-) diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisStringCommands.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisStringCommands.java index 757dd1ba9..1f70a8210 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisStringCommands.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisStringCommands.java @@ -52,5 +52,5 @@ public interface RedisStringCommands { Long append(byte[] key, byte[] value); - byte[] substr(byte[] key, long start, long end); + byte[] substr(byte[] key, int start, int end); } diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java index b50bf7e67..bff80afef 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java @@ -499,7 +499,7 @@ public class JedisConnection implements RedisConnection { } @Override - public byte[] substr(byte[] key, long start, long end) { + public byte[] substr(byte[] key, int start, int end) { try { if (isQueueing()) { transaction.substr(key, (int) start, (int) end); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java index 1fa82e638..1d598bd7d 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java @@ -330,7 +330,7 @@ public class JredisConnection implements RedisConnection { } @Override - public byte[] substr(byte[] key, long start, long end) { + public byte[] substr(byte[] key, int start, int end) { try { return jredis.substr(JredisUtils.decode(key), start, end); } catch (RedisException ex) { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundValueOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundValueOperations.java index e751e3d91..42e5866ba 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundValueOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundValueOperations.java @@ -38,4 +38,8 @@ public interface BoundValueOperations extends KeyBound { Long increment(long delta); + Integer append(String value); + + String substract(int start, int end); + } diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundValueOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundValueOperations.java index 67fb2eba1..8d8256ab3 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundValueOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundValueOperations.java @@ -50,6 +50,16 @@ class DefaultBoundValueOperations extends DefaultKeyBound implements Bo return ops.increment(getKey(), delta); } + @Override + public Integer append(String value) { + return ops.append(getKey(), value); + } + + @Override + public String substract(int start, int end) { + return ops.substract(getKey(), start, end); + } + @Override public void set(V value, long timeout, TimeUnit unit) { ops.set(getKey(), value, timeout, unit); 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 2c3f600e5..314dfdc65 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 @@ -71,6 +71,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation private RedisSerializer valueSerializer = new SimpleRedisSerializer(); private RedisSerializer hashKeySerializer = new SimpleRedisSerializer(); private RedisSerializer hashValueSerializer = new SimpleRedisSerializer(); + private RedisSerializer stringSerializer = new StringRedisSerializer(); // cache singleton objects (where possible) private final ValueOperations valueOps = new DefaultValueOperations(); @@ -205,6 +206,16 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation this.hashValueSerializer = hashValueSerializer; } + /** + * Sets the string value serializer to be used by this template (when the arguments or return types + * are always strings). Defaults to {@link StringRedisSerializer}. + * + * @see ValueOperations#substract(Object, int, int) + * @param stringSerializer The stringValueSerializer to set. + */ + public void setStringSerializer(RedisSerializer stringSerializer) { + this.stringSerializer = stringSerializer; + } /** * Invocation handler that suppresses close calls on JDO PersistenceManagers. @@ -250,6 +261,11 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return (key != null ? keySerializer.serialize(key) : null); } + @SuppressWarnings("unchecked") + private byte[] rawString(String key) { + return (key != null ? stringSerializer.serialize(key) : null); + } + @SuppressWarnings("unchecked") private byte[] rawValue(T value) { return (value != null ? valueSerializer.serialize(value) : null); @@ -339,6 +355,11 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return (V) deserialize(value, valueSerializer); } + @SuppressWarnings("unchecked") + private String deserializeString(byte[] value) { + return (String) deserialize(value, stringSerializer); + } + @SuppressWarnings( { "unchecked", "unused" }) private HK deserializeHashKey(byte[] value) { return (HK) deserialize(value, hashKeySerializer); @@ -356,6 +377,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return serializer.deserialize(value); } + private static boolean isEmpty(byte[] data) { return (data == null || data.length == 0); } @@ -676,6 +698,33 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation }, true); } + @Override + public Integer append(K key, String value) { + final byte[] rawKey = rawKey(key); + final byte[] rawString = rawString(value); + + return execute(new RedisCallback() { + @Override + public Integer doInRedis(RedisConnection connection) { + return connection.append(rawKey, rawString).intValue(); + } + }, true); + } + + @Override + public String substract(K key, final int start, final int end) { + final byte[] rawKey = rawKey(key); + + byte[] rawReturn = execute(new RedisCallback() { + @Override + public byte[] doInRedis(RedisConnection connection) { + return connection.substr(rawKey, start, end); + } + }, true); + + return deserializeString(rawReturn); + } + @Override public Collection multiGet(Collection keys) { if (keys.isEmpty()) { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ValueOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ValueOperations.java index a56ed96ce..6882019e3 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ValueOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ValueOperations.java @@ -44,5 +44,9 @@ public interface ValueOperations { Long increment(K key, long delta); + Integer append(K key, String value); + + String substract(K key, int start, int end); + RedisOperations getOperations(); }