当前位置: 首页 > 科技观察

在SpringBoot中,Redis缓存还能这么用!

时间:2023-03-15 00:08:44 科技观察

经过SpringBoot的集成打包和自动配置,在SpringBoot中集成Redis变得非常容易。开发者只需要引入SpringDataRedis的依赖,然后简单配置redis的基本信息,系统就会提供一个RedisTemplate供开发者使用,不过松哥今天要跟大家聊的不是这个用法,而是用法结合Cache。令人兴奋的缓存是在Spring3.1中引入的。在SpringBoot中,使用Redis作为Cache的实现来实现数据缓存是非常方便的。项目创建首先创建一个SpringBoot项目。注意创建时需要引入三个依赖,web、cache、redis,如下图所示:对应的依赖如下:org.springframework.bootspring-boot-starter-cacheorg.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-web?基础配置工程创建完成后,首先需要对Redis进行简单的配置。Redis的基本信息,另外,这里用到了Cache,所以需要稍微配置一下Cache,如下:spring.redis.port=6380spring.redis.host=192.168.66.128spring.cache.cache-names=c1为了简单起见,这里我只是配置了Redis的端口和地址,然后给缓存起了个名字,后面会用到。另外需要在配置类中加入如下代码,表示开启缓存:@SpringBootApplication@EnableCachingpublicclassRediscacheApplication{publicstaticvoidmain(String[]args){SpringApplication.run(RediscacheApplication.class,args);}}完成后这些配置,SpringBoot会在后台自动帮我们配置一个RedisCacheManager,相关的配置是在org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration类中完成的。部分源码如下:@Configuration@ConditionalOnClass(RedisConnectionFactory.class)@AutoConfigureAfter(RedisAutoConfiguration.class)@ConditionalOnBean(RedisConnectionFactory.class)@ConditionalOnMissingBean(CacheManager.class)@Conditional(CacheCondition.class)classRedisCacheConfiguration{@BeanpublicRedisCacheManagercacheManager(RedisConnectionLosourceRedis){RedisCacheManagerBuilderbuilder=RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(determineConfiguration(resourceLoader.getClassLoader()));ListcacheNames=this.cacheProperties.getCacheNames();if(!cacheNames.isEmpty()){builder.initialCacheNames(newLinkedHashSet<>(cacheNames));}returnthis.customizerInvoker.customize(builder.build());}}查看类上的注解,发现当一切准备就绪后,系统会自动提供一个RedisCacheManager的Bean,这个RedisCacheManager间接实现了Spring中的Cache接口。有了这个bean,我们就可以直接使用Spring中的缓存注解和接口,缓存的数据会自动存储到Redis中。在单机Redis中,这个Bean系统会自动提供。如果是Redis集群,这个Bean需要开发者提供(后面的文章会讲到)。缓存的使用这里主要介绍缓存中几个核心注解的使用。@CacheConfig注解用在一个类上,用来描述类中所有方法使用的缓存名称。当然你也可以不使用这个注解,直接在具体的缓存注解上配置名称。示例代码如下:@Service@CacheConfig(cacheNames="c1")publicclassUserService{}@Cacheable这个注解一般加在查询方法上,表示缓存某个方法的返回值。默认情况下,缓存的键是方法的参数,缓存的值是方法的返回值。示例代码如下:@Cacheable(key="#id")publicUsergetUserById(Integerid,Stringusername){System.out.println("getUserById");returngetUserFromDBById(id);}当有多个参数时,多个参数默认使用如果只需要其中一个参数作为key,可以通过@Cacheable注解中的key属性指定key。上面代码的意思是只用id作为缓存键。如果您对密钥的要求比较复杂,可以自定义keyGenerator。当然,SpringCache中提供了root对象,不需要定义keyGenerator就可以实现一些复杂的效果:@CachePut一般会加在update方法中。当数据库中的数据更新时,缓存中的数据必须跟随Update,使用这个注解,可以自动将方法的返回值更新为已有的key。示例代码如下:@CachePut(key="#user.id")publicUserupdateUserById(Useruser){returnuser;}@CacheEvict这个注解一般加在delete方法中。当数据库中的数据被删除时,相关的缓存数据也会自动清除。使用该注解时,也可以配置为根据一定条件删除(condition属性)或者清空所有缓存(allEntries属性),示例代码如下:@CacheEvict()publicvoiddeleteUserById(Integerid){//这里执行删除操作,删除就是在数据库中删除}总结在SpringBoot中,使用Redis缓存,可以使用RedisTemplate自己实现,也可以使用这个方法,是SpringCache提供的统一接口,实现可以是Redis、Ehcache或者其他支持该规范的缓存框架。从这个角度看,SpringCache和Redis、Ehcache的关系就像JDBC和各种数据库驱动的关系。本文经授权转载自公众号《牧童》。公众号Mamaboy分享了很多Java微服务干货,欢迎关注!