ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

在SpringBoot项目中使用redis简单用法(一)

2021-06-02 15:04:58  阅读:240  来源: 互联网

标签:info 缓存 SpringBoot ResultVO redis 用法 productInfo key productId


基本准备

首先肯定是需要将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。
 

标签:info,缓存,SpringBoot,ResultVO,redis,用法,productInfo,key,productId
来源: https://blog.51cto.com/u_11710338/2845954

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有