当前位置:   article > 正文

Spring Cache + Redis 缓存数据_spring cache redis

spring cache redis

Spring Cache 是一个非常优秀的缓存组件。自Spring 3.1起,提供了类似于@Transactional注解事务的注解Cache支持,且提供了Cache抽象,方便切换各种底层Cache(如:redis)

使用Spring Cache的好处:

    1,提供基本的Cache抽象,方便切换各种底层Cache;

    2,通过注解Cache可以实现类似于事务一样,缓存逻辑透明的应用到我们的业务代码上,且只需要更少的代码就可以完成;

    3,提供事务回滚时也自动回滚缓存;

    4,支持比较复杂的缓存逻辑;

1、项目集成Spring Cache + Redis

1.1 添加依赖

  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>

1.2 添加配置类

  1. @Configuration
  2. @EnableCaching
  3. public class RedisConfig {
  4. /**
  5. * 自定义key规则
  6. * @return
  7. */
  8. @Bean
  9. public KeyGenerator keyGenerator() {
  10. return new KeyGenerator() {
  11. @Override
  12. public Object generate(Object target, Method method, Object... params) {
  13. StringBuilder sb = new StringBuilder();
  14. sb.append(target.getClass().getName());
  15. sb.append(method.getName());
  16. for (Object obj : params) {
  17. sb.append(obj.toString());
  18. }
  19. return sb.toString();
  20. }
  21. };
  22. }
  23. /**
  24. * 设置RedisTemplate规则
  25. * @param redisConnectionFactory
  26. * @return
  27. */
  28. @Bean
  29. public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  30. RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  31. redisTemplate.setConnectionFactory(redisConnectionFactory);
  32. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  33. //解决查询缓存转换异常的问题
  34. ObjectMapper om = new ObjectMapper();
  35. // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
  36. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  37. // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
  38. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  39. jackson2JsonRedisSerializer.setObjectMapper(om);
  40. //序列号key value
  41. redisTemplate.setKeySerializer(new StringRedisSerializer());
  42. redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
  43. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  44. redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
  45. redisTemplate.afterPropertiesSet();
  46. return redisTemplate;
  47. }
  48. /**
  49. * 设置CacheManager缓存规则
  50. * @param factory
  51. * @return
  52. */
  53. @Bean
  54. public CacheManager cacheManager(RedisConnectionFactory factory) {
  55. RedisSerializer<String> redisSerializer = new StringRedisSerializer();
  56. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  57. //解决查询缓存转换异常的问题
  58. ObjectMapper om = new ObjectMapper();
  59. om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  60. om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
  61. jackson2JsonRedisSerializer.setObjectMapper(om);
  62. // 配置序列化(解决乱码的问题),过期时间600秒
  63. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
  64. .entryTtl(Duration.ofSeconds(600))
  65. .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
  66. .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
  67. .disableCachingNullValues();
  68. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  69. .cacheDefaults(config)
  70. .build();
  71. return cacheManager;
  72. }
  73. }

PS:@EnableCaching:标记注解 @EnableCaching,开启缓存,并配置Redis缓存管理器。@EnableCaching 注释触发后置处理器, 检查每一个Spring bean 的 public 方法是否存在缓存注解。如果找到这样的一个注释, 自动创建一个代理拦截方法调用和处理相应的缓存行为。

1.3 添加redis配置

  1. spring.redis.host=192.168.44.165
  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

2、使用Spring Cache

2.1常用缓存标签

2.1.1@Cacheable

根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

属性/方法名

解释

value

缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames

与 value 差不多,二选一即可

key

可选属性,可以使用 SpEL 标签自定义缓存的key

2.1.2@CachePut

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。

查看源码,属性值如下:

属性/方法名

解释

value

缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames

与 value 差不多,二选一即可

key

可选属性,可以使用 SpEL 标签自定义缓存的key

2.1.3@CacheEvict

使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上

查看源码,属性值如下:

属性/方法名

解释

value

缓存名,必填,它指定了你的缓存存放在哪块命名空间

cacheNames

与 value 差不多,二选一即可

key

可选属性,可以使用 SpEL 标签自定义缓存的key

allEntries

是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存

beforeInvocation

是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存        

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/917322
推荐阅读
相关标签
  

闽ICP备14008679号