StringRedisTemplate 与 RedisTemplate 的区别

之前在项目中一直都是使用 RedisTemplate ,后面发现了一个  StringRedisTemplate ,  。。。孤陋寡闻了

StringRedisTemplate 就是继承了  RedisTemplate  , RedisTemplate 定义为 RedisTemplate

StringRedisTemplate无非就是限定了 K,V 为 String类型的RedisTemplate , 在它的构造函数中 设置了序列化规则

,key value 以及 hashKey hashValue 的序列化规则 都为 RedisSerializer.string()

 

public class StringRedisTemplate extends RedisTemplate {

	/**
	 * Constructs a new StringRedisTemplate instance. {@link #setConnectionFactory(RedisConnectionFactory)}
	 * and {@link #afterPropertiesSet()} still need to be called.
	 */
	public StringRedisTemplate() {
		setKeySerializer(RedisSerializer.string());
		setValueSerializer(RedisSerializer.string());
		setHashKeySerializer(RedisSerializer.string());
		setHashValueSerializer(RedisSerializer.string());
	}

	/**
	 * Constructs a new StringRedisTemplate instance ready to be used.
	 *
	 * @param connectionFactory connection factory for creating new connections
	 */
	public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
		this();
		setConnectionFactory(connectionFactory);
		afterPropertiesSet();
	}

	protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
		return new DefaultStringRedisConnection(connection);
	}
}
 

如果 key, value, hashKey, hashValue 都是 String类型直接使用  StringRedisTemplate 就好。

而 RedisTemplate 默认序列化为  defaultSerializer =  JdkSerializationRedisSerializer

              if (enableDefaultSerializer) {

			if (keySerializer == null) {
				keySerializer = defaultSerializer;
				defaultUsed = true;
			}
			if (valueSerializer == null) {
				valueSerializer = defaultSerializer;
				defaultUsed = true;
			}
			if (hashKeySerializer == null) {
				hashKeySerializer = defaultSerializer;
				defaultUsed = true;
			}
			if (hashValueSerializer == null) {
				hashValueSerializer = defaultSerializer;
				defaultUsed = true;
			}
		}

没有设置 key, value, hashKey, hashValue 序列化规则时 默认都是 JdkSerializationRedisSerializer, 在redis-cli 下查看时

发现 key 前面会多一些字符   例如这样 \xac\xed\x00\x05t\x00\key ,所以

如果 RedisTemplate 的key 序列化规则和  StringRedisTemplate  不同, 就会找不到key 。

通常项目中都是 String 类型作为key,主要是开发人员方便自己识别,而key 的序列化也会使用 string 序列化,

这样在命令行环境下 get 查询的时候 直接使用定义的key 字符串就能查询到值。

 

对于value ,hashValue 的序列化 可以使用自带的 JdkSerializationRedisSerializer 或者 自己先序列化成json 字符串 然后保存

不过这样 在get 或者set 的时候需要进行相应转换操作。之前碰到过有人使用 RedisTemplate 先序列化对象成json 然后再set

到redis 然而value 的序列化方式是默认的 JdkSerializationRedisSerializer ,其实这种情况 使用 StringRedisTemplate  会更

。 另外 项目中 RedisTemplate 通常作为单例注入其它类中,在定义RedisTemplate 时就需要想好key value 的序列化方案,

后再改变序列化方式就会导致key 查不到 或者 value 转换出错。如果value 为 实体对象如果字段修改了要考虑对redis 的影响。

 

 

 

 

 

 

 
 

你可能感兴趣的:(springboot)