Springboot2整合Redis以及jackson序列化

pom.xml

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yml:

redis:
      #数据库索引
      database: 0
      host: 47.101.172.217
      port: 6379
      password:
      lettuce:
        pool:
          #最大连接数
          max-active: 8
          #最大阻塞等待时间(负数表示没限制)
          max-wait: -1
          #最大空闲
          max-idle: 8
          #最小空闲
          min-idle: 0
      #连接超时时间
      timeout: 10000

RedisConfig.java:

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {



    /**
     * json序列化
     * @return
     */
    @Bean
    public RedisSerializer<Object> jackson2JsonRedisSerializer() {
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        return serializer;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        //StringRedisTemplate的构造方法中默认设置了stringSerializer
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //set key serializer
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);


        //set value serializer
        template.setDefaultSerializer(jackson2JsonRedisSerializer());

        template.setConnectionFactory(lettuceConnectionFactory);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(lettuceConnectionFactory);
        return template;
    }
    /**
     * 在使用@Cacheable时,如果不指定key,则使用找个默认的key生成器生成的key
     *
     */
    @Override
    @Bean
    public SimpleKeyGenerator keyGenerator() {
        return new SimpleKeyGenerator() {

            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(".").append(method.getName());

                StringBuilder paramsSb = new StringBuilder();
                for (Object param : params) {
                    // 如果不指定,默认生成包含到键值中
                    if (param != null) {
                        paramsSb.append(param.toString());
                    }
                }

                if (paramsSb.length() > 0) {
                    sb.append("_").append(paramsSb);
                }
                return sb.toString();
            }

        };

    }

    /**
     * 管理缓存
     *
     * @param lettuceConnectionFactory
     * @return
     */
    //缓存管理器
    @Bean
    public CacheManager cacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
        // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();

        // 设置缓存的默认过期时间,也是使用Duration设置
        config = config.entryTtl(Duration.ofMinutes(1))
                // 设置 key为string序列化
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                // 设置value为json序列化
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer() ))
                // 不缓存空值
                .disableCachingNullValues();

        // 设置一个初始化的缓存空间set集合
        Set<String> cacheNames = new HashSet<>();
        cacheNames.add("company_goods_info");

        // 对每个缓存空间应用不同的配置
        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
        configMap.put("company_goods_info", config);

        // 使用自定义的缓存配置初始化一个cacheManager
        RedisCacheManager cacheManager = RedisCacheManager.builder(lettuceConnectionFactory)
                // 一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
                .initialCacheNames(cacheNames)
                .withInitialCacheConfigurations(configMap)
                .build();
        return cacheManager;
    }
}

 

### Spring Boot 整合 Redis 序列化问题解决方案 当遇到 Spring BootRedis序列化失败问题时,可以考虑采用高效的序列化库来优化性能并解决问题。以下是几种可能的方案: #### 1. 使用 FlatBuffers 进行高效序列化 FlatBuffers 是一种内存效率高的序列化库,允许访问已序列化的数据而无需解包和解析[^1]。对于需要频繁读取的数据结构尤其有用。 ```java // 定义 FlatBuffer 构建器 FlatBufferBuilder builder = new FlatBufferBuilder(); // 创建对象实例并写入到缓冲区 int offset = MySchema.CreateMyObject(builder, ...); builder.finish(offset); // 获取字节数组用于存储或传输 byte[] bytes = builder.sizedByteArray(); ``` #### 2. 利用 Kryo 实现快速对象图序列化 Kryo 提供了一种快速且有效的对象图序列化框架,适用于复杂对象之间的转换需求。可以通过配置 `RedisTemplate` 来指定使用 KryoSerializer 处理键值对。 ```xml <!-- application.yml --> spring: redis: template: value-serializer: org.nustaq.serialization.FSTSerializer ``` ```java @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); // 设置序列化工具为 Kryo template.setValueSerializer(new GenericFastJsonRedisSerializer()); return template; } } ``` #### 3. MessagePack 编码提高网络传输效率 MessagePack 是一种紧凑二进制编码格式,在保持良好兼容性的同时减少了通信中的冗余信息量。适合于分布式系统的远程过程调用场景下应用。 ```json { "key": "value", "array": [1, 2, 3], "nested_object": {"foo": "bar"} } ``` ```java @Bean public RedisTemplate<String, byte[]> messagePackRedisTemplate(LettuceConnectionFactory connectionFactory) throws Exception { RedisTemplate<String, byte[]> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 使用 MsgpackJackson2Module 解析 JSON 数据 ObjectMapper objectMapper = new ObjectMapper() .registerModule(new MsgpackJackson2Module()); template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(objectMapper)); return template; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值