springboot redis缓存乱码问题

2025-10-15 19:11:23

1、创建一个spring boot应用,添加redis依赖,还有jackson依赖

springboot redis缓存乱码问题

2、启用缓存,添加配置类,附加注解@EnableCaching,并且覆盖父类方法,自定义keyGenerator,代码如下

@Override

    @Bean

    public KeyGenerator keyGenerator() {

        // TODO Auto-generated method stub

        return new KeyGenerator() {

            @Override

            public Object generate(Object object, Method method, Object... objects) {

                // TODO Auto-generated method stub

                StringBuilder sb = new StringBuilder();

                sb.append(object.getClass().getName());

                sb.append(method.getName());

                for (Object obj : objects) {

                    if (obj != null) {

                        sb.append(obj.toString());

                    }

                }

                return sb.toString();

            }

        };

    }

springboot redis缓存乱码问题

3、添加一个业务类,使用缓存注解,用于测试

springboot redis缓存乱码问题

4、在启动类中调用业务类方法,如下图所示

springboot redis缓存乱码问题

5、到redis数据库中查找存入的数据,发现value为一堆乱码

springboot redis缓存乱码问题

6、解决办法,自定义CacheManager,在配置类中添加如下代码

private RedisSerializer<String> keySerializer() {

        return new StringRedisSerializer();

    }

    //使用Jackson序列化器

    private RedisSerializer<Object> valueSerializer() {

        return new GenericJackson2JsonRedisSerializer();

    }

@Bean

    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

        //缓存配置对象

        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();

        redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟

                .disableCachingNullValues()             //如果是空值,不缓存

                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))         //设置key序列化器

                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer())));  //设置value序列化器

        return RedisCacheManager

                .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))

                .cacheDefaults(redisCacheConfiguration).build();

    }

springboot redis缓存乱码问题

7、重新测试,数据正常肉眼可查看,json数据

springboot redis缓存乱码问题

8、整个配置文件如下

package com.zuli;

import org.springframework.cache.CacheManager;

import org.springframework.cache.annotation.CachingConfigurerSupport;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.cache.interceptor.KeyGenerator;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.redis.cache.RedisCacheConfiguration;

import org.springframework.data.redis.cache.RedisCacheManager;

import org.springframework.data.redis.cache.RedisCacheWriter;

import org.springframework.data.redis.connection.RedisConnectionFactory;

import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;

import org.springframework.data.redis.serializer.RedisSerializationContext;

import org.springframework.data.redis.serializer.RedisSerializer;

import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.lang.reflect.Method;

import java.time.Duration;

@Configuration

@EnableCaching

public class CachingConfig extends CachingConfigurerSupport {

    private RedisSerializer<String> keySerializer() {

        return new StringRedisSerializer();

    }

    //使用Jackson序列化器

    private RedisSerializer<Object> valueSerializer() {

        return new GenericJackson2JsonRedisSerializer();

    }

    @Bean

    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

        //缓存配置对象

        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();

        redisCacheConfiguration = redisCacheConfiguration.entryTtl(Duration.ofMinutes(30L)) //设置缓存的默认超时时间:30分钟

                .disableCachingNullValues()             //如果是空值,不缓存

                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))         //设置key序列化器

                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer())));  //设置value序列化器

        return RedisCacheManager

                .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))

                .cacheDefaults(redisCacheConfiguration).build();

    }

    @Override

    @Bean

    public KeyGenerator keyGenerator() {

        // TODO Auto-generated method stub

        return new KeyGenerator() {

            @Override

            public Object generate(Object object, Method method, Object... objects) {

                // TODO Auto-generated method stub

                StringBuilder sb = new StringBuilder();

                sb.append(object.getClass().getName());

                sb.append(method.getName());

                for (Object obj : objects) {

                    if (obj != null) {

                        sb.append(obj.toString());

                    }

                }

                return sb.toString();

            }

        };

    }

}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢