首先查看RedisTemplate源码
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
private boolean enableTransactionSupport = false;
private boolean exposeConnection = false;
private boolean initialized = false;
*****private boolean enableDefaultSerializer = true;
@Nullable
private RedisSerializer<?> defaultSerializer;
@Nullable
private ClassLoader classLoader;
@Nullable
private RedisSerializer keySerializer = null;
@Nullable
private RedisSerializer valueSerializer = null;
@Nullable
private RedisSerializer hashKeySerializer = null;
@Nullable
private RedisSerializer hashValueSerializer = null;*****
private RedisSerializer<String> stringSerializer = RedisSerializer.string();
可以看到keySerailzer,valueSerializer,hashkeySerializer,hashvalueSerializer初始化都为null
我们 在java代码中是这样写的,用来存储数据到redis中:
if(article==null){
article = articleMapper.findArticleById(id);
redisTemplate.opsForValue().set("article_"+id,article);
redisTemplate.opsForValue().set("article_"+id,article,1, TimeUnit.DAYS);
}
redisTemplate.opsForValue().set("article_"+id,article);
调用opsForValue() ,继续看源码:
public ValueOperations<K, V> opsForValue() {
return this.valueOps;
}
*valueOps *
private final ValueOperations<K, V> valueOps = new DefaultValueOperations(this);
*然后valueOps调用set方法设值
*`而ValueOperations是一个接口,他的实现类是defaultValueOperations ,并首先set方法
public void set(K key, V value) {
final byte[] rawValue = this.rawValue(value);
this.execute(new AbstractOperations<K, V>.ValueDeserializingRedisCallback(key) {
protected byte[] inRedis(byte[] rawKey, RedisConnection connection) {
connection.set(rawKey, rawValue);
return null;
}
}, true);
}
可以一直往下看,最后进行属性赋值
public 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;
}
}
keySerializer ,valueSerializer,hashKeySerializer,hashValueSerializer 都是defaultSeriallizer,所以使用注解方式,修改RedisTemplate 的那几个属性,通过@Bean添加到容器中
代码如下:
@Configuration
public class RedisConfig {
/**这个是xml配置
* <!-- 定义redis中key序列化方式 -->
* <bean id="keySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
* <!-- 定义redis中value序列化方式 -->
* <bean id="valueSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"></bean>
*
*
* <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
* <!-- 直接属性注入,初始化自定义方式即可,这样就不会再使用默认的序列化方式了 -->
* <property name="connectionFactory" ref="JedisConnectionFactory" />
* <property name="keySerializer" ref="keySerializer"></property>
* <property name="valueSerializer" ref="valueSerializer"></property>
* <property name="hashKeySerializer" ref="keySerializer"></property>
* <property name="hashValueSerializer" ref="valueSerializer"></property>
* </bean>
* @return
*/
//springboot注解方式
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
redis 文件中 的数据如下(懒得开启redis了)
{"@class":"com.tensquare.article.entity.Article",
"id":"1004","columnId":"1","userId":"1","title":"java",
"content":"system.out.println","image":null,
"createTime":["java.sql.Date",1573747200000],
"updateTime:["java.sql.Date",1574524800000],
"ispublic":"1","istop":"1","visits":1233,
"thumbup":23272,"comment":null,"state":"0",
"channelId":1,"url":"www.baidu.com","type":null}
ok,完结,只是自己遇到这个问题了,就去查找,也是为了以后方便