欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈Spring Boot中Redis缓存还能这么用

程序员文章站 2023-08-16 14:49:47
经过spring boot的整合封装与自动化配置,在spring boot中整合redis已经变得非常容易了,开发者只需要引入spring data redis依赖,然后简...

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

工程创建

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

浅谈Spring Boot中Redis缓存还能这么用

对应的依赖内容如下:

<dependency> 
  <groupid>org.springframework.boot</groupid> 
  <artifactid>spring-boot-starter-cache</artifactid> 
</dependency> 
<dependency> 
  <groupid>org.springframework.boot</groupid> 
  <artifactid>spring-boot-starter-data-redis</artifactid> 
</dependency> 
<dependency> 
  <groupid>org.springframework.boot</groupid> 
  <artifactid>spring-boot-starter-web</artifactid> 
</dependency> 

基本配置

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

spring.redis.port=6380 
spring.redis.host=192.168.66.128 
 
spring.cache.cache-names=c1 

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

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

@springbootapplication 
@enablecaching 
public class rediscacheapplication { 
 
public static void main(string[] args) { 
springapplication.run(rediscacheapplication.class, args); 
} 
 
} 

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

@configuration 
@conditionalonclass(redisconnectionfactory.class) 
@autoconfigureafter(redisautoconfiguration.class) 
@conditionalonbean(redisconnectionfactory.class) 
@conditionalonmissingbean(cachemanager.class) 
@conditional(cachecondition.class) 
class rediscacheconfiguration { 
 
@bean 
public rediscachemanager cachemanager(redisconnectionfactory redisconnectionfactory, 
resourceloader resourceloader) { 
rediscachemanagerbuilder builder = rediscachemanager 
.builder(redisconnectionfactory) 
.cachedefaults(determineconfiguration(resourceloader.getclassloader())); 
list<string> cachenames = this.cacheproperties.getcachenames(); 
if (!cachenames.isempty()) { 
builder.initialcachenames(new linkedhashset<>(cachenames)); 
} 
return this.customizerinvoker.customize(builder.build()); 
} 
} 

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

缓存使用

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

@cacheconfig

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

@service 
@cacheconfig(cachenames = "c1") 
public class userservice { 
} 

@cacheable

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

@cacheable(key = "#id") 
public user getuserbyid(integer id,string username) { 
system.out.println("getuserbyid"); 
return getuserfromdbbyid(id); 
} 

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

浅谈Spring Boot中Redis缓存还能这么用

@cacheput

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

@cacheput(key = "#user.id") 
public user updateuserbyid(user user) { 
return user; 
} 

@cacheevict

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

@cacheevict() 
public void deleteuserbyid(integer id) { 
//在这里执行删除操作, 删除是去数据库中删除 
} 

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。