当前位置:   article > 正文

spring boot 2.x整合redis作为缓存_springboot2 redis声明式缓存

springboot2 redis声明式缓存

先安装rediswindows下安装redis

添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

配置redis数据库

配置文件application.properties

在1.x中,时间相关的配置参数类型为int,默认单位为毫秒,配置中只需指定具体的数字即可,而在2.x中,时间相关的配置的参数类型都改为了jdk1.8的Duration,因此在配置文件中配置redis的连接超时时间timeout时,需要加入时间单位,如60s;还有,在2.0中配置redis的连接池信息时,不再使用spring.redis.pool的属性,而是直接使用redis的lettuce或jedis客户端来配置:

  1. #缓存
  2. spring.cache.type=redis
  3. #redis数据源配置
  4. spring.redis.host=localhost
  5. spring.redis.port=6379
  6. #数据库索引默认为0
  7. spring.redis.database=0
  8. #密码默认为空
  9. #spring.redis.password=
  10. #连接池最大连接数 负数表示没有限制
  11. spring.redis.jedis.pool.max-active=8
  12. #springboot2.0不再使用spring.redis.pool,与时间有关的要加上时间单位
  13. #连接池最大阻塞等待事件 负数表示没有限制
  14. spring.redis.jedis.pool.max-wait=-1s
  15. #连接池最大空闲连接
  16. spring.redis.jedis.pool.max-idle=8
  17. #连接池最小空闲连接
  18. spring.redis.jedis.pool.min-idle=0
  19. #连接超时事件
  20. spring.redis.timeout=60s

使用redis做缓存的配置类

之前看过很多网上的配置都是1.x的导致配置CacheManager时一直出错,是因为在1.0中使用RedisTemplate即可实例化一个RedisCacheManager:RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);,在2.0中删除了这个构造器,同时也不可以通过之前的setDefaultExpiration方法设置默认的缓存过期时间等,在新版本中可以通过以下的两种方式构造一个RedisCacheManager:

1.静态方法create,此方法产生的CacheManager使用的是Spring提供的默认配置:

  1. public CacheManager cacheManager(RedisConnectionFactory factory) {
  2. RedisCacheManager rcm = RedisCacheManager.create(factory);
  3. return rcm;
  4. }

2.构造一个自己的redis配置类,创建RedisCacheConfiguration类,添加一些配置信息,再利用RedisCacheManager中的builder.build()的方式生成cacheManager:

  1. @Bean
  2. public CacheManager cacheManager(RedisConnectionFactory factory){
  3. //生成一个默认配置,通过config对象即可对缓存进行自定义配置
  4. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
  5. config = config.entryTtl(Duration.ofMinutes(1))//设置缓存默认过期时间
  6. .disableCachingNullValues(); //不缓存空值
  7. //每调用一次配置类的设置方法都会返回一个新的config类,可以自己点进去源码看
  8. //设置一个初始化的缓存空间set集合
  9. Set<String> cacheNames = new HashSet<String>();
  10. cacheNames.add("my-redis-cache-1");
  11. cacheNames.add("my-redis-cache-2");
  12. //对每个缓存空间应用不同的配置
  13. Map<String,RedisCacheConfiguration> configMap = new HashMap<>();
  14. configMap.put("my-redis-cache-1",config);
  15. configMap.put("my-redis-cahce-2",config.entryTtl(Duration.ofHours(1)));
  16. // 使用自定义的缓存配置初始化一个cacheManager
  17. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  18. .initialCacheNames(cacheNames) //此方法参数为Set 一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
  19. .withInitialCacheConfigurations(configMap) //此方法参数为Map
  20. .build();
  21. return cacheManager;
  22. }

注意:若在设置配置信息时没有接收返回的新的配置类,配置信息更改不会生效

附上整个类的代码

 

  1. @Configuration
  2. @EnableCaching
  3. public class RedisConfig extends CachingConfigurerSupport {
  4. /**自定义缓存key生成策略**/
  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. //@Bean
  21. /**通过RedisCacheManager的静态方法create:这样产生的cacheManager只是使用Spring提供的默认配置**/
  22. /*public CacheManager cacheManager(RedisConnectionFactory factory) {
  23. RedisCacheManager rcm = RedisCacheManager.create(factory);
  24. return rcm;
  25. }*/
  26. /**缓存管理器**/
  27. /**通过Spring提供的RedisCacheConfiguration类,构造一个自己的redis配置类,
  28. 从该配置类中可以设置一些初始化的缓存命名空间、及对应的默认过期时间等属性,
  29. 再利用RedisCacheManager中的builder.build()的方式生成cacheManager:
  30. **/
  31. @Bean
  32. public CacheManager cacheManager(RedisConnectionFactory factory){
  33. //生成一个默认配置,通过config对象即可对缓存进行自定义配置
  34. RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
  35. config = config.entryTtl(Duration.ofMinutes(1))//设置缓存默认过期时间
  36. .disableCachingNullValues(); //不缓存空值
  37. //设置一个初始化的缓存空间set集合
  38. Set<String> cacheNames = new HashSet<String>();
  39. cacheNames.add("my-redis-cache-1");
  40. cacheNames.add("my-redis-cache-2");
  41. //对每个缓存空间应用不同的配置
  42. Map<String,RedisCacheConfiguration> configMap = new HashMap<>();
  43. configMap.put("my-redis-cache-1",config);
  44. configMap.put("my-redis-cahce-2",config.entryTtl(Duration.ofHours(1)));
  45. // 使用自定义的缓存配置初始化一个cacheManager
  46. RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
  47. .initialCacheNames(cacheNames) //此方法参数为Set 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
  48. .withInitialCacheConfigurations(configMap) //此方法参数为Map
  49. .build();
  50. return cacheManager;
  51. }
  52. @Bean
  53. public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){
  54. RedisTemplate<Object,Object> template = new RedisTemplate<>();
  55. template.setConnectionFactory(factory);
  56. //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
  57. Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
  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. //使用StringRedisSerializer来序列化和反序列化redis的key值
  63. template.setValueSerializer(jackson2JsonRedisSerializer);
  64. template.afterPropertiesSet();
  65. return template;
  66. }
  67. @Bean
  68. public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
  69. StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
  70. stringRedisTemplate.setConnectionFactory(factory);
  71. return stringRedisTemplate;
  72. }
  73. }

在注解上使用Cacheable

  1. @Service
  2. @CacheConfig(cacheNames="my-cache-redis-1")//使用此处缓存名,若方法上注解有写,则按后者来
  3. public class GirlService {
  4. @SuppressWarnings("all")
  5. @Autowired
  6. private GirlMapper girlMapper;
  7. public int add(String cupSize,Integer age){
  8. return girlMapper.add(cupSize,age);
  9. }
  10. @CachePut(key="#p0") //指定key,将更新的结果同步到redis中
  11. public int update(String cupSize,Integer age,Integer id){
  12. return girlMapper.update(cupSize,age,id);
  13. }
  14. @CacheEvict(key="p0",allEntries=true) //如果指定为 true,则方法调用后将立即清空所有缓存
  15. public int delete(Integer id){
  16. return girlMapper.delete(id);
  17. }
  18. @Cacheable(key="#p0")//将查询结果缓存到redis中,(key="#p0")指定传入的第一个参数作为redis的key
  19. public Girl getGirlById(Integer id){
  20. System.out.println("不使用缓存查找");
  21. return girlMapper.getGirlById(id);
  22. }
  23. @Cacheable
  24. public List<Girl> getGirls(){
  25. System.out.println("不使用缓存查找");
  26. return girlMapper.getGirls();
  27. }
  28. }

若是@Cacheable(key="#p0")不指定key 值,则按照RedisConfig类中的keyGenereator()方法的返回值做为key值

redis中的缓存信息

有关@Cacheable,@CachePut , @CacheEvict的使用可以参考:

Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/531296
推荐阅读
相关标签
  

闽ICP备14008679号