StringRedisTemplate 与 RedisTemplate 的区别

本文介绍了StringRedisTemplate和RedisTemplate的区别,主要在于StringRedisTemplate限制了键值对为字符串类型,并预设了字符串序列化规则。当使用RedisTemplate时,如果不设定序列化规则,键值会在redis-cli中显示额外字符,可能导致查找失败。通常,项目中以字符串作为键,便于识别和查询。对于值的序列化,可以采用JSON转换。合理选择和配置序列化方式对Redis的操作效率和数据一致性至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

StringRedisTemplate 就是继承了  RedisTemplate<String,String>  , RedisTemplate 定义为 RedisTemplate<K, V>

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

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

 

public class StringRedisTemplate extends RedisTemplate<String, String> {

	/**
	 * Constructs a new <code>StringRedisTemplate</code> 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 <code>StringRedisTemplate</code> 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 的影响。

 

 

 

 


 

 


 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值