在SpringBoot项目中使用redis简单用法(一)
基本准备
首先肯定是需要将Redis的包和Redis链接配置好
这里以maven作为项目构建工具,所以直接在POM文件中引入的Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
接下来就是Redis链接的配置
spring:
redis:
host: 127.0.0.1
port: 6379
简单使用
@EnableCaching
想要使用注解的方式来使用Redis缓存,那么首先就是得使能缓存,在Application.java上添加该注解
@SpringBootApplication
@EnableCaching
public class SellApplication {
public static void main(String[] args) {
SpringApplication.run(SellApplication.class, args);
}
}
@Cacheable
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。
对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。
@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "123")
public ResultVO findOne(@Param("productId") String productId) {
log.info("Get from database ...");
// 从数据库获取数据, ProductInfo必须实现Serializable
ProductInfo productInfo = productService.findOne(productId);
return ResultVOUtil.success(productInfo);
}
cacheNames: 缓存的名称,不能为空
key: 缓存的 key,可以为空
key可以使用SpEL 表达式编写,实现动态key。
@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "#productId")
public ResultVO findOne(@Param("productId") String productId) {
log.info("Get from database ...");
ProductInfo productInfo = productService.findOne(productId);
return ResultVOUtil.success(productInfo);
}
这里只有当productId被缓存过,才会调用缓存中的数据。如果没有被访问过,那么还是会先从数据库中获取再缓存的。
condition:缓存的条件,可以为空,使用 SpEL 编写
@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "#productId", condition="#productId >= 3 ")
public ResultVO findOne(@Param("productId") Integer productId) {
log.info("Get from database ... " + productId);
ProductInfo productInfo = productService.findOne(String.valueOf(productId));
return ResultVOUtil.success(productInfo);
}
这里设置了condition="#productId >= 3 ",所以只有当接口参数productId>=3的时候才会进行缓存
unless: 排除条件,除非…
因为我们返回的ResultVO 是经过封装的,如果一切正常的话,那么ResultVO 中的code值应该是0,所以可以利用unless来进行判断
@GetMapping("/info")
@Cacheable(cacheNames = "product", key = "#productId", unless="#result.getCode() != 0 ")
public ResultVO findOne(@Param("productId") Integer productId) {
log.info("Get from database ... " + productId);
ProductInfo productInfo = productService.findOne(String.valueOf(productId));
if(productInfo == null) {
return ResultVOUtil.error(-1, "Null Product");
}
return ResultVOUtil.success(productInfo);
}
unless="#result.getCode() != 0 "表示,只有当ResultVO 中的code值等于0的时候才缓存。
与condition不同的是,unless表达式是在方法调用之后进行评估的。如果返回false,才放入缓存(与condition相反)。
@CachePut
如果缓存需要更新,则可以使用@CachePut
@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
@PostMapping("/update")
@CachePut(cacheNames = "product", key = "#productForm.productId")
public ResultVO update(@RequestBody ProductForm productForm) {
ProductInfo productInfo = new ProductInfo();
BeanUtils.copyProperties(productForm, productInfo);
productService.save(productInfo);
return ResultVOUtil.success(productInfo);
}
@CacheEvict
@CacheEvict要求指定一个或多个缓存,使之都受影响。此外,还提供了一个额外的参数allEntries 。表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,将忽略指定的key。有的时候我们需要Cache一下清除所有的元素。
@CacheConfig
@CacheConfig是一个类级别的注解,允许共享缓存的名称(CacheName)、KeyGenerator、CacheManager 和CacheResolver。