1. 程式人生 > >SpringBoot 2.X以上集成redis

SpringBoot 2.X以上集成redis

generate ces pro .class inter ali conn code pac

在網上看到的教程和資料大多數都是2.X以下的版本。使用起來會出現各種問題,通過百度,最後終於弄好了。

2.x以上使用的是

spring-boot-starter-data-redis   
2.x一下使用的是
spring-boot-starter-redis
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.1
.3.RELEASE</version> </dependency>


package com.chaoba.webapi.cache;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
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.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; 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; /** * by chaoba * 2019/3/8 */ @EnableCaching @Configuration public class CacheConfig extends CachingConfigurerSupport { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Bean public RedisConnectionFactory redisConnectionFactory() { LettuceConnectionFactory factory = new LettuceConnectionFactory(); factory.setHostName(host); factory.setPort(port); factory.setPassword("123456"); return factory; } @Bean public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate,RedisConnectionFactory factory) { redisTemplate.setConnectionFactory(factory); // 使用Jackson2JsonRedisSerialize 替換默認序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 設置value的序列化規則和 key的序列化規則 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(3600)); // 設置緩存有效期 RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build(); return cacheManager; } // @Bean // public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { // RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); // redisTemplate.setConnectionFactory(redisConnectionFactory); // // // 使用Jackson2JsonRedisSerialize 替換默認序列化 // Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); // // ObjectMapper objectMapper = new ObjectMapper(); // objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // // jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // // // 設置value的序列化規則和 key的序列化規則 // redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // redisTemplate.setKeySerializer(new StringRedisSerializer()); // redisTemplate.afterPropertiesSet(); // return redisTemplate; // } /** * 自定義的緩存key生成器 * @return */ @Bean public KeyGenerator wiselyKeyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } }
java.util.LinkedHashMap cannot be cast to com.chaoba.webapi.entity.User"
期間出過這個錯誤。我也不知道咋回事。把
RedisTemplate裏面的內容寫到
CacheManager 裏面就沒這個錯誤了。頭疼。還有就是實體要實現序列化接口

SpringBoot 2.X以上集成redis