缓存什么?
缓存数据字典!

使用步骤

1. pom

这里写在工具类中

  1. <!-- redis -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!-- spring2.X集成redis所需common-pool2-->
  7. <dependency>
  8. <groupId>org.apache.commons</groupId>
  9. <artifactId>commons-pool2</artifactId>
  10. <version>2.6.0</version>
  11. </dependency>

2. yml

  1. spring.redis.host=192.168.237.127
  2. spring.redis.port=6379
  3. spring.redis.database= 0
  4. spring.redis.timeout=1800000
  5. spring.redis.lettuce.pool.max-active=20
  6. spring.redis.lettuce.pool.max-wait=-1
  7. #最大阻塞等待时间(负数表示没限制)
  8. spring.redis.lettuce.pool.max-idle=5
  9. spring.redis.lettuce.pool.min-idle=0

3. redis配置类

(固定结构,不用修改。但要求能看懂!)

  • 第一个方法:自定义key规则
  • 第二个方法:设置RedisTemplate规则(不懂!)
  • 第三个方法:设置CacheManager缓存规则(不懂!) ```java import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; 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.connection.RedisConnectionFactory; 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;

@Configuration @EnableCaching public class RedisConfig {

  1. /**
  2. * 自定义key规则
  3. * @return
  4. */
  5. @Bean
  6. public KeyGenerator keyGenerator() {
  7. return new KeyGenerator() {
  8. @Override
  9. public Object generate(Object target, Method method, Object... params) {
  10. StringBuilder sb = new StringBuilder();
  11. sb.append(target.getClass().getName());
  12. sb.append(method.getName());
  13. for (Object obj : params) {
  14. sb.append(obj.toString());
  15. }
  16. return sb.toString();
  17. }
  18. };
  19. }
  20. /**
  21. * 设置RedisTemplate规则
  22. * @param redisConnectionFactory
  23. * @return
  24. */
  25. @Bean
  26. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  27. RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  28. redisTemplate.setConnectionFactory(redisConnectionFactory);
  29. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

//解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om);

//序列号key value redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

  1. redisTemplate.afterPropertiesSet();
  2. return redisTemplate;
  3. }
  4. /**
  5. * 设置CacheManager缓存规则
  6. * @param factory
  7. * @return
  8. */
  9. @Bean
  10. public CacheManager cacheManager(RedisConnectionFactory factory) {
  11. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  12. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

//解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om);

// 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues();

  1. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  2. .cacheDefaults(config)
  3. .build();
  4. return cacheManager;
  5. }

} ```

4. 注解

位置?
在service的实现类上
项目中如何使用的?

  • @Cacheable(value = “dict”,keyGenerator = “keyGenerator”)

public List findChlidData(Long id) {}
这两个参数都是设置key的

  • @CacheEvict(value = “dict”, allEntries=true)

public void importDictData(MultipartFile file) {}

(1)@Cacheable

个人理解:类似代理服务器。。。
image.png
image.png

(2)@CachePut

image.png

(3)@CacheEvict

image.png

测试:

image.png