springData-redis缓存中是乱码的,客户端显示没有key

首先查看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,完结,只是自己遇到这个问题了,就去查找,也是为了以后方便

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值