国外做文化的网站,北京网站优化什么价格,广州网站开发就业培训课程,wordpress页面大小调节两者的关系是 StringRedisTemplate 继承 RedisTemplate 。
两者的数据是不共通的#xff1a;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据#xff0c;RedisTemplate 只能管理 RedisTemplate 中的数据。
RedisTemplate 看这个类的名字后缀是 Temp…两者的关系是 StringRedisTemplate 继承 RedisTemplate 。
两者的数据是不共通的也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据RedisTemplate 只能管理 RedisTemplate 中的数据。
RedisTemplate 看这个类的名字后缀是 Template 如果了解过 Spring 如何连接关系型数据库的大概不会难猜出这个类是做什么的 它跟 JdbcTemplate 一样封装了对Redis的一些常用的操作当然 StringRedisTemplate 跟 RedisTemplate 功能类似那么肯定就会有人问为什么会需要两个Template呢一个不就够了吗其实他们两者之间的区别主要在于他们使用的序列化类是不同的。
StringRedisTemplate 的API假定所有的数据类型化都是字符类型即key和value都是字符串类型。默认采用的是 String 的序列化策略即 StringRedisSerializer 保存的key和value都是采用此策略序列化保存的。RedisTemplate 默认采用的是JDK的序列化策略即 JdkSerializationRedisSerializer 保存的key和value都是采用此策略序列化保存的。 RedisTemplate 默认使用的序列类在在操作数据的时候比如说存入数据会将数据先序列化成字节数组然后在存入 Redis 数据库这个时候打开 Redis 查看的时候你会看到你的数据不是以可读的形式展现的而是以字节数组显示类似下面 StringRedisTemplate 默认存入的数据就是原文因为 StringRedisTemplate 默认使用的是 String 序列化策略使用 StringRedisTemplate 默认存入数据长这个样 造成两者差异的原因是因为在初始化时两者使用的序列化策略不同导致的翻开源码可以看到如下
public class RedisTemplateK, V extends RedisAccessor implements RedisOperationsK, V, BeanClassLoaderAware {private boolean enableTransactionSupport false;private boolean exposeConnection false;private boolean initialized false;private boolean enableDefaultSerializer true;Nullableprivate RedisSerializer? defaultSerializer;Nullableprivate RedisSerializer keySerializer null;Nullableprivate RedisSerializer valueSerializer null;Nullableprivate RedisSerializer hashKeySerializer null;Nullableprivate RedisSerializer hashValueSerializer null;// 其它字段略...public RedisTemplate() {}// 该方法是重写RedisAccessor的方法 RedisAccessor实现了spring的InitializingBean 也就是在启动时会执行该方法 可以看到该方法默认的序列化为JdkSerializationRedisSerializerpublic void afterPropertiesSet() {super.afterPropertiesSet();boolean defaultUsed false;if (this.defaultSerializer null) {this.defaultSerializer new JdkSerializationRedisSerializer(this.classLoader ! null ? this.classLoader : this.getClass().getClassLoader());}if (this.enableDefaultSerializer) {if (this.keySerializer null) {this.keySerializer this.defaultSerializer;defaultUsed true;}if (this.valueSerializer null) {this.valueSerializer this.defaultSerializer;defaultUsed true;}if (this.hashKeySerializer null) {this.hashKeySerializer this.defaultSerializer;defaultUsed true;}if (this.hashValueSerializer null) {this.hashValueSerializer this.defaultSerializer;defaultUsed true;}}if (this.enableDefaultSerializer defaultUsed) {Assert.notNull(this.defaultSerializer, default serializer null and not all serializers initialized);}if (this.scriptExecutor null) {this.scriptExecutor new DefaultScriptExecutor(this);}this.initialized true;}// 其余方法略...
}
可以看到 RedisTemplate 在初始化时是无参构造通过 Spring 的 Bean 加载机制在项目启动时执行afterPropertiesSet来完成序列化设置如果需要自定义序列化配置可以自己写一个 RedisTemplate 的Bean来完成配置。
Configuration
public class RedisConfig {Beanpublic RedisTemplateString,Object redisTemplate(Autowired RedisConnectionFactory redisConnectionFactory) {// 创建RedisTemplateRedisTemplateString,Object redisTemplate new RedisTemplateString,Object();// 字符串和JDK序列化器RedisSerializerString strSerializer RedisSerializer.string();RedisSerializerObject jdkSerializer RedisSerializer.java();// 设置键值序列化器redisTemplate.setKeySerializer(strSerializer);redisTemplate.setValueSerializer(jdkSerializer);// 设置哈希字段和值序列化器redisTemplate.setHashKeySerializer(strSerializer);redisTemplate.setHashValueSerializer(jdkSerializer);// 给redisTemplate设置连接工厂redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}
}
StringRedisTemplate 就比较简单了直接继承了 RedisTemplate在初始化时默认使用了 String 序列化源码如下
public class StringRedisTemplate extends RedisTemplateString, String {public StringRedisTemplate() {this.setKeySerializer(RedisSerializer.string());this.setValueSerializer(RedisSerializer.string());this.setHashKeySerializer(RedisSerializer.string());this.setHashValueSerializer(RedisSerializer.string());}// 其他方法略...
}
那么就可以得出一个结论如果你想使用默认的配置来操作 Redis则如果操作的数据是字节数组就是用RedisTemplate如果操作的数据是明文使用 StringRedisTemplate。
当然在项目中真实使用时一般是自定义 RedisTemplate 的 Bean 实例来设置具体的序列化策略说白了就是 RedisTemplate 通过自定义 Bean 可以实现和 StringRedisTemplate 一样的序列化使用起来更加灵活。