SpringBoot之redis缓存的基本配置及使用

SpringBoot在缓存方面对多种缓存均提供了支持,以下是他支持的缓存类型:

折叠复制代码
  1. Generic
  2. JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
  3. EhCache 2.x
  4. Hazelcast
  5. Infinispan
  6. Couchbase
  7. Redis
  8. Caffeine
  9. Simple

本文将主要介绍SpringBoot和redis的整合配置及使用。注:SpringBoot 1.x版本和SpringBoot 2.x版本在配置上存在些许不同,这里采用的2.x版本。

引入SpringBoot的缓存及redis缓存的jar包依赖

折叠复制代码
  1. <!--cache-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-cache</artifactId>
  5. </dependency>
  6. <!--redis-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-redis</artifactId>
  10. </dependency>

在application.yml文件中配置缓存类型为redis并配置redis的地址、端口、密码等。

折叠复制代码
  1. spring:
  2. cache:
  3. type: REDIS
  4. redis:
  5. host: localhost
  6. port: 6379
  7. password: 123456
  8. database: 0

启动类上增加@EnableCaching注解,没有增加这个注解的话,缓存将不会生效。

至此你已经可以在你的项目中进行redis缓存相关的操作了,但是因为SpringBoot默认使用JdkSerializationRedisSerializer作为redis缓存中value的序列化类,所以当你使用第三方工具去redis中查看value值的时候你看到的将会是一堆乱码,不利于开发调试。为了解决这个问题我们可以增加一个RedisConfig类来对redis进行自定义的配置。

折叠复制代码
  1. @Configuration
  2. public class RedisConfig {
  3. /**
  4. * 默认超时时间
  5. */
  6. private static final long DEFAULT_TTL = 999999L;
  7. @Bean
  8. public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
  9. //初始化一个RedisCacheWriter
  10. RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
  11. //自定义key前缀
  12. CacheKeyPrefix cacheKeyPrefix = new CacheKeyPrefix() {
  13. @Override
  14. public String compute(String cacheName) {
  15. return cacheName+":";
  16. }
  17. };
  18. //设置CacheManager的值序列化方式为json序列化
  19. RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
  20. RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
  21. .fromSerializer(jsonSerializer);
  22. //生成RedisCacheConfiguration配置
  23. RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
  24. .computePrefixWith(cacheKeyPrefix)
  25. .serializeValuesWith(pair);
  26. //设置默认过期时间
  27. defaultCacheConfig.entryTtl(Duration.ofSeconds(DEFAULT_TTL));
  28. //初始化RedisCacheManager
  29. return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
  30. }
  31. }

新建一个RedisConfig类。类的内容如上,这里我配置了默认过期时间为999999秒,并设置redis的key为cacheName:xxx的形式,更改value值的序列化为json格式。

现在我们可以愉快的在项目中使用redis了。SpringBoot帮我们针对缓存的操作做了封装,我们可以直接使用注解来快速方便的使用redis。

常用的有如下3个注解

  1. @Cacheable 使用缓存
  2. @CachePut 更新缓存
  3. @CacheEvict 清理缓存

他们的参数基本都是一样的,只是功能有所不同,这里不多展开,只拿@Cacheable进行举例讲解。他的参数及功能解释如下表:

参数 介绍 样例
value或cacheNames 缓存名,用于区分不同的模块;在redis中的区别就是key前缀会增加缓存名: @Cacheable(value="mycache")
key 缓存的key,可以为空;需要指定key可以使用SpEL表达式编写;不指定则默认按照方法的所有参数进行组合 @Cacheable(value="testcache",key="#userName") @Cacheable(value="testcache",key="#root.methodName")
condition 缓存的条件,可以为空;使用SpEL编写,返回true则缓存数据 @Cacheable(value="testcache",condition="#userName.length()>2")

为了方便获取入参中的数据,在参数key中的SpEL表达式中,SpringBoot默认提供了一个root对象。使用及解释见下表:

样例 解释
#root.methodName 当前被调用的方法名
#root.method 当前被调用的方法
#root.target 当前被调用的目标对象
#root.targetClass 当前被调用的目标对象类

虽然SpringBoot提供了非常方便的注解供我们使用,但是请注意,由于注解的实现原理是通过代理对象来实现的,所以在同一个类中自己的方法A调用带缓存注解的方法B,此时注解是不会生效的,也就是缓存不会生效。那么有时候我们实际业务确实有这种需求怎么办?我们可以直接在类中注入SpringBoot提供的模板类来对redis进行操作。

  1. @Autowired
  2. private RedisTemplate redisTemplate;

具体的操作非常简单易懂,网上资料也很多,这里就不过多赘述。

代码:https://gitee.com/lqccan/blog-demo/tree/master/SpringBoot/redis
测试方法见:DemoApplicationTest单元测试


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍