Spring Boot中,Redis缓存还能这么用!

存储 存储软件 Redis
经过Spring Boot的整合封装与自动化配置,在Spring Boot中整合Redis已经变得非常容易了,开发者只需要引入Spring Data Redis依赖,然后简单配下redis的基本信息,系统就会提供一个RedisTemplate供开发者使用,但是今天松哥想和大伙聊的不是这种用法,而是结合Cache的用法。

经过Spring Boot的整合封装与自动化配置,在Spring Boot中整合Redis已经变得非常容易了,开发者只需要引入Spring Data Redis依赖,然后简单配下redis的基本信息,系统就会提供一个RedisTemplate供开发者使用,但是今天松哥想和大伙聊的不是这种用法,而是结合Cache的用法。Spring3.1中开始引入了令人激动的Cache,在Spring Boot中,可以非常方便的使用Redis来作为Cache的实现,进而实现数据的缓存。

[[260815]]

工程创建

首先创建一个Spring Boot工程,注意创建的时候需要引入三个依赖,web、cache以及redis,如下图:

对应的依赖内容如下:

  1. <dependency> 
  2.    <groupId>org.springframework.boot</groupId> 
  3.    <artifactId>spring-boot-starter-cache</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.    <groupId>org.springframework.boot</groupId> 
  7.    <artifactId>spring-boot-starter-data-redis</artifactId> 
  8. </dependency> 
  9. <dependency> 
  10.    <groupId>org.springframework.boot</groupId> 
  11.    <artifactId>spring-boot-starter-web</artifactId> 
  12. </dependency> 
  13.  

基本配置

工程创建好之后,首先需要简单配置一下Redis,Redis的基本信息,另外,这里要用到Cache,因此还需要稍微配置一下Cache,如下:

  1. spring.redis.port=6380 
  2. spring.redis.host=192.168.66.128 
  3.  
  4. spring.cache.cache-names=c1 
  5. ​ 

简单起见,这里我只是配置了Redis的端口和地址,然后给缓存取了一个名字,这个名字在后文会用到。

另外,还需要在配置类上添加如下代码,表示开启缓存:

  1. @SpringBootApplication 
  2. @EnableCaching 
  3. public class RediscacheApplication { 
  4.  
  5. public static void main(String[] args) { 
  6. SpringApplication.run(RediscacheApplication.class, args); 
  7.  
  8. ​ 

完成了这些配置之后,Spring Boot就会自动帮我们在后台配置一个RedisCacheManager,相关的配置是在org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration类中完成的。部分源码如下:

  1. @Configuration 
  2. @ConditionalOnClass(RedisConnectionFactory.class) 
  3. @AutoConfigureAfter(RedisAutoConfiguration.class) 
  4. @ConditionalOnBean(RedisConnectionFactory.class) 
  5. @ConditionalOnMissingBean(CacheManager.class) 
  6. @Conditional(CacheCondition.class) 
  7. class RedisCacheConfiguration { 
  8.  
  9. @Bean 
  10. public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, 
  11. ResourceLoader resourceLoader) { 
  12. RedisCacheManagerBuilder builder = RedisCacheManager 
  13. .builder(redisConnectionFactory) 
  14. .cacheDefaults(determineConfiguration(resourceLoader.getClassLoader())); 
  15. List<String> cacheNames = this.cacheProperties.getCacheNames(); 
  16. if (!cacheNames.isEmpty()) { 
  17. builder.initialCacheNames(new LinkedHashSet<>(cacheNames)); 
  18. return this.customizerInvoker.customize(builder.build()); 

看类上的注解,发现在万事俱备的情况下,系统会自动提供一个RedisCacheManager的Bean,这个RedisCacheManager间接实现了Spring中的Cache接口,有了这个Bean,我们就可以直接使用Spring中的缓存注解和接口了,而缓存数据则会被自动存储到Redis上。在单机的Redis中,这个Bean系统会自动提供,如果是Redis集群,这个Bean需要开发者来提供(后面的文章会讲到)。

缓存使用

这里主要向小伙伴们介绍缓存中几个核心的注解使用。

@CacheConfig

这个注解在类上使用,用来描述该类中所有方法使用的缓存名称,当然也可以不使用该注解,直接在具体的缓存注解上配置名称,示例代码如下:

  1. @Service 
  2. @CacheConfig(cacheNames = "c1"
  3. public class UserService { 
  4. ​ 

@Cacheable

这个注解一般加在查询方法上,表示将一个方法的返回值缓存起来,默认情况下,缓存的key就是方法的参数,缓存的value就是方法的返回值。示例代码如下:

  1. @Cacheable(key = "#id"
  2. public User getUserById(Integer id,String username) { 
  3. System.out.println("getUserById"); 
  4. return getUserFromDBById(id); 
  5. ​ 

当有多个参数时,默认就使用多个参数来做key,如果只需要其中某一个参数做key,则可以在@Cacheable注解中,通过key属性来指定key,如上代码就表示只使用id作为缓存的key,如果对key有复杂的要求,可以自定义keyGenerator。当然,Spring Cache中提供了root对象,可以在不定义keyGenerator的情况下实现一些复杂的效果:

@CachePut

这个注解一般加在更新方法上,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的key上,示例代码如下:

  1. @CachePut(key = "#user.id"
  2. public User updateUserById(User user) { 
  3. return user
  4. ​ 

@CacheEvict

这个注解一般加在删除方法上,当数据库中的数据删除后,相关的缓存数据也要自动清除,该注解在使用的时候也可以配置按照某种条件删除(condition属性)或者或者配置清除所有缓存(allEntries属性),示例代码如下:

  1. @CacheEvict() 
  2. public void deleteUserById(Integer id) { 
  3. //在这里执行删除操作, 删除是去数据库中删除 
  4. ​ 

总结

在Spring Boot中,使用Redis缓存,既可以使用RedisTemplate自己来实现,也可以使用使用这种方式,这种方式是Spring Cache提供的统一接口,实现既可以是Redis,也可以是Ehcache或者其他支持这种规范的缓存框架。从这个角度来说,Spring Cache和Redis、Ehcache的关系就像JDBC与各种数据库驱动的关系。

本文授权转载自公众号「牧码小子」。公众号牧码小子分享大量Java 微服务干货,欢迎关注!

责任编辑:武晓燕 来源: 牧码小子
相关推荐

2017-04-17 10:35:40

Spring BooRedis 操作

2020-10-09 10:45:22

语言代码数组

2022-10-28 19:19:11

ChromeNetwork网络

2021-08-29 18:13:03

缓存失效数据

2021-11-22 11:05:20

Vue 3setup前端

2023-12-08 17:24:14

Redis缓存服务器

2013-03-26 13:26:41

婚礼微信微信公众账号

2022-02-14 21:58:58

netstatLinuxWindows

2020-08-19 08:55:47

Redis缓存数据库

2020-08-19 17:56:46

缓存Redis集中式

2022-10-31 08:47:21

人脸识别按键键盘

2021-04-20 18:10:22

缓存服务缓存数据缓存

2021-03-02 10:50:23

SpringMVC 参数JavaWeb

2010-01-20 10:37:48

Chrome浏览器

2019-12-30 09:51:35

Word设计模式软件

2017-03-17 13:40:48

思科视频

2020-05-09 16:45:56

ping命令Linux

2018-11-02 15:45:41

Spring BootRedis数据库

2020-07-14 11:00:12

Spring BootRedisJava

2023-12-29 08:17:20

接口类SpringAOP
点赞
收藏

51CTO技术栈公众号