+ improve serialization of hash items in RedisTemplate

+ add missing method on HashOperations
This commit is contained in:
Costin Leau
2010-11-29 19:05:14 +02:00
parent 14022e602e
commit 6d8d345583
4 changed files with 89 additions and 19 deletions

View File

@@ -27,7 +27,6 @@ import java.util.Set;
class DefaultBoundHashOperations<H, HK, HV> extends DefaultKeyBound<H> implements BoundHashOperations<H, HK, HV> {
private final HashOperations<H, HK, HV> ops;
private RedisOperations<H, ?> template;
/**
* Constructs a new <code>DefaultBoundHashOperations</code> instance.
@@ -52,7 +51,7 @@ class DefaultBoundHashOperations<H, HK, HV> extends DefaultKeyBound<H> implement
@Override
public RedisOperations<H, ?> getOperations() {
return template;
return ops.getOperations();
}
@Override

View File

@@ -43,4 +43,6 @@ public interface HashOperations<H, HK, HV> {
void set(H key, HK hashKey, HV value);
Collection<HV> values(H key);
RedisOperations<H, ?> getOperations();
}

View File

@@ -56,7 +56,8 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
private boolean exposeConnection = false;
private RedisSerializer keySerializer = new StringRedisSerializer();
private RedisSerializer valueSerializer = new SimpleRedisSerializer();
private RedisSerializer defaultSerializer = new SimpleRedisSerializer();
private RedisSerializer hashKeySerializer = new SimpleRedisSerializer();
private RedisSerializer hashValueSerializer = new SimpleRedisSerializer();
public RedisTemplate() {
}
@@ -82,7 +83,7 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
}
public <T> T execute(RedisCallback<T> action, boolean exposeConnection) {
return execute(action, isExposeConnection(), defaultSerializer);
return execute(action, isExposeConnection(), valueSerializer);
}
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, RedisSerializer returnSerializer) {
@@ -133,18 +134,43 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
this.exposeConnection = exposeConnection;
}
/**
* Sets the key serializer to be used by this template. Defaults to {@link SimpleRedisSerializer}.
*
* @param serializer
*/
public void setKeySerializer(RedisSerializer serializer) {
this.keySerializer = serializer;
}
/**
* Sets the value serializer to be used by this template. Defaults to {@link SimpleRedisSerializer}.
*
* @param serializer
*/
public void setValueSerializer(RedisSerializer serializer) {
this.valueSerializer = serializer;
}
public void setDefaultSerializer(RedisSerializer serializer) {
this.defaultSerializer = serializer;
/**
* Sets the hash key (or field) serializer to be used by this template. Defaults to {@link SimpleRedisSerializer}.
*
* @param hashKeySerializer The hashKeySerializer to set.
*/
public void setHashKeySerializer(RedisSerializer hashKeySerializer) {
this.hashKeySerializer = hashKeySerializer;
}
/**
* Sets the hash value serializer to be used by this template. Defaults to {@link SimpleRedisSerializer}.
*
* @param hashValueSerializer The hashValueSerializer to set.
*/
public void setHashValueSerializer(RedisSerializer hashValueSerializer) {
this.hashValueSerializer = hashValueSerializer;
}
/**
* Invocation handler that suppresses close calls on JDO PersistenceManagers.
* Also prepares returned Query objects.
@@ -207,7 +233,9 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
Collection<V> values = (List.class.isAssignableFrom(type) ? new ArrayList<V>(rawValues.size())
: new LinkedHashSet<V>(rawValues.size()));
for (byte[] bs : rawValues) {
values.add((V) valueSerializer.deserialize(bs));
if (bs != null) {
values.add((V) valueSerializer.deserialize(bs));
}
}
return (T) values;
@@ -218,21 +246,49 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
Collection<H> values = (List.class.isAssignableFrom(type) ? new ArrayList<H>(rawValues.size())
: new LinkedHashSet<H>(rawValues.size()));
for (byte[] bs : rawValues) {
values.add((H) valueSerializer.deserialize(bs));
if (bs != null) {
values.add((H) valueSerializer.deserialize(bs));
}
}
return values;
}
@SuppressWarnings("unchecked")
private K deserializeKey(byte[] value) {
return (K) deserialize(value, keySerializer);
}
@SuppressWarnings("unchecked")
private V deserializeValue(byte[] value) {
return (V) deserialize(value, valueSerializer);
}
@SuppressWarnings("unchecked")
private <HK> HK deserializeHashKey(byte[] value) {
return (HK) deserialize(value, hashKeySerializer);
}
@SuppressWarnings("unchecked")
private <HV> HV deserializeHashValue(byte[] value) {
return (HV) deserialize(value, hashValueSerializer);
}
private <T> T deserialize(byte[] value, RedisSerializer<T> serializer) {
if (isEmpty(value)) {
return null;
}
return (T) serializer.deserialize(value);
}
private static boolean isEmpty(byte[] data) {
return (data == null || data.length == 0);
}
// utility methods for the template internal methods
private abstract class ValueDeserializingRedisCallback implements RedisCallback<V> {
private K key;
public ValueDeserializingRedisCallback() {
this(null);
}
public ValueDeserializingRedisCallback(K key) {
this.key = key;
}
@@ -241,10 +297,7 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
@Override
public final V doInRedis(RedisConnection connection) {
byte[] result = inRedis(rawKey(key), connection);
if (result != null) {
return (V) valueSerializer.deserialize(result);
}
return null;
return deserializeValue(result);
}
protected abstract byte[] inRedis(byte[] rawKey, RedisConnection connection);
@@ -558,7 +611,7 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
public void diffAndStore(final K key, K destKey, final K... keys) {
final byte[][] rawKeys = rawKeys(aggregateKeys(key, keys));
final byte[] rawDestKey = rawKey(destKey);
Object rawValues = execute(new RedisCallback<Object>() {
execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) {
connection.sDiffStore(rawDestKey, rawKeys);
@@ -881,6 +934,11 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
private class DefaultHashOperations<HK, HV> implements HashOperations<K, HK, HV> {
@Override
public RedisOperations<K, ?> getOperations() {
return RedisTemplate.this;
}
@Override
public HV get(K key, Object hashKey) {
final byte[] rawKey = rawKey(key);
@@ -893,7 +951,7 @@ public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperation
}
}, true);
return (HV) valueSerializer.deserialize(rawHashValue);
return deserializeHashValue(rawHashValue);
}
@Override

View File

@@ -31,10 +31,21 @@ public class DefaultRedisMap<K, V> implements RedisMap<K, V> {
private final BoundHashOperations<String, K, V> hashOps;
/**
* Constructs a new <code>DefaultRedisMap</code> instance.
*
* @param key
* @param operations
*/
public DefaultRedisMap(String key, RedisOperations<String, ?> operations) {
this.hashOps = operations.forHash(key);
}
/**
* Constructs a new <code>DefaultRedisMap</code> instance.
*
* @param boundOps
*/
public DefaultRedisMap(BoundHashOperations<String, K, V> boundOps) {
this.hashOps = boundOps;
}