@Cacheable和redis集成使用


1.接口每次查询耗费时间很长,考虑该接口数据是不经常变数据,故新增缓存处理。

1.1maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
    <version>1.4.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

1.2 配置文件yml添加redis配置文件

  redis:
    database: 0
    host: xxxxx
    port: 8101
    password: xxxx
    timeout: 20000

1.3 把redis数据源加载到spring容器中

 1 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 2 import com.fasterxml.jackson.annotation.JsonInclude;
 3 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 4 import com.fasterxml.jackson.annotation.PropertyAccessor;
 5 import com.fasterxml.jackson.databind.DeserializationFeature;
 6 import com.fasterxml.jackson.databind.MapperFeature;
 7 import com.fasterxml.jackson.databind.ObjectMapper;
 8 import com.fasterxml.jackson.databind.SerializationFeature;
 9 import org.springframework.cache.annotation.EnableCaching;
10 import org.springframework.context.annotation.Configuration;
11 import org.springframework.cache.CacheManager;
12 import org.springframework.context.annotation.Bean;
13 import org.springframework.data.redis.cache.RedisCacheConfiguration;
14 import org.springframework.data.redis.cache.RedisCacheManager;
15 import org.springframework.data.redis.cache.RedisCacheWriter;
16 import org.springframework.data.redis.connection.RedisConnectionFactory;
17 import org.springframework.data.redis.core.RedisTemplate;
18 import org.springframework.data.redis.core.StringRedisTemplate;
19 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
20 import org.springframework.data.redis.serializer.RedisSerializationContext;
21 
22 
23 @Configuration
24 public class RedisConfig {
25     
26     @Bean
27     public RedisCacheManager redisCacheManager(RedisConnectionFactory connectionFactory){
28         //初始化一个RedisCacheWriter输出流
29         RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
30         //采用Jackson2JsonRedisSerializer序列化机制
31 
32 //        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
33 
34         //创建一个RedisSerializationContext.SerializationPair给定的适配器pair
35         RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer());
36         //创建CacheConfig
37         RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
38 
39         return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
40     }
41 
42 
43 
44 
45     @Bean
46     public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
47         RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
48         redisTemplate.setConnectionFactory(factory);
49 
50         Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
51         ObjectMapper om = new ObjectMapper();
52         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
53         jacksonSeial.setObjectMapper(om);
54 
55         //设置默认缓存序列器为json序列化器
56         redisTemplate.setDefaultSerializer(jacksonSeial);
57         return redisTemplate;
58     }
59     @Bean
60     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
61         StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
62         stringRedisTemplate.setConnectionFactory(factory);
63         return stringRedisTemplate;
64     }
65 
66     private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
67         Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer =
68                 new Jackson2JsonRedisSerializer<>(Object.class);
69         ObjectMapper objectMapper = new ObjectMapper();
70         objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
71         objectMapper.configure(MapperFeature.USE_ANNOTATIONS, false);
72         objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
73         objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
74         // 此项必须配置,否则会报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to XXX
75         objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
76         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
77         jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
78         return jackson2JsonRedisSerializer;
79     }
80 }
View Code

 

1.4 实现 

 
 
@Cacheable(cacheNames = "xxxx",key = "#name")
public Result queryEnterpriseIcInfo(String id, String name){
//查询数据库操作,cacheable先去缓存查找,如果没有则查询数据库,查询结果会存入缓存。下次查询会自动从缓存加载。

}
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM