SpringBoot 使用内置缓存代码详解(数据从缓存中存、取代码讲解)@Cacheable、@CachePut注解讲解

SpringBoot 使用内置缓存代码详解(数据从缓存中存、取代码讲解)@Cacheable、@CachePut注解讲解
- 项目目录结构如下:

在这里插入图片描述

- 引入相关依赖:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<!--springboot cache-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
- yml配置:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC
    username: user
    password: 123456

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- 实体类Book.java
import lombok.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Book {

    private String id;
    private String name;
    private String description;
    private Float price;

}
- 数据层BookDao.java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.springboot.entity.Book;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface BookDao extends BaseMapper<Book> {
}
- 业务层BookService.java和BookServiceImpl.java
  • BookService.java
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.springboot.entity.Book;

public interface BookService extends IService<Book> {

    Book getCacheById(String id);

}
  • BookServiceImpl.java
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springboot.dao.BookDao;
import com.example.springboot.entity.Book;
import com.example.springboot.service.BookService;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book> implements BookService {

    @Override
    @Cacheable(value="cacheSpace", key="#id")
    // 备注:value是缓存存放的缓存空间,也可以称为命名空间;key是此缓存对应的具体的key
    //@Cacheput
    public Book getCacheById(String id) {
        return getById(id);
    }
}
- 表现层BookController.java
import com.example.springboot.entity.Book;
import com.example.springboot.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private BookService bookService;

    @GetMapping("{id}")
    public Book getById(@PathVariable String id){
        return bookService.getCacheById(id);
    }

}
- 启动项目后通过 Postman 测试

在这里插入图片描述

在这里插入图片描述

  • 将控制台的日志清空,再次通过Postman 请求数据:
    在这里插入图片描述
  • 由此可见,已缓存的数据不会再次请求数据库,直接从缓存中取。
- @Cacheable和@CachePut注解的区别:
  • @Cacheable:标记在一个方法上时表示该方法是支持缓存的,Spring会在方法被调用后将其返回值缓存起来,下次用同样的参数来执行该方法时可以直接从缓存中获取结果。
    @CachePut:标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将该方法的返回值放到缓存中。
数据从缓存中存、取代码讲解:
- 缓存中存、取数据:
@Cacheable(value="cacheSpace", key="#id")
public Book getCacheById(String id) {
    return getById(id);
}
  • 在上述代码中,@Cacheable注解和 return 一起使用可以将返回值存储到缓存中(注意:return 不能返回 null )。同时,下次用同样的参数来执行该方法时可以直接从缓存中获取结果。
- 缓存中存数据
@CachePut(value="cacheSpace", key="#id")
public Book getCacheById(String id) {
    return getById(id);
}
  • 在上述代码中,@CachePut 注解用于将返回值存储到缓存中,这个注解不会从缓存中取数据,只能存储数据。
- 缓存中取数据
@Cacheable(value="cacheSpace", key="#id")
public Book getCacheData(String id) {
    return null;
}
  • 在上述代码中,@Cacheable 注解和 return null 一起使用,用于在缓存中读取数据。
  • 注意 getCacheData() 要以 Bean 的形式去调用,不能放到实现类的方法中,即如下图展示的,不会去走注解,直接是方法调用,从而引发空指针异常。
    在这里插入图片描述
  • 以 Bean 的形式去调用 getCacheData()
import com.example.springboot.entity.Book;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component;

@Component
public class CacheUtil {

    @Cacheable(value="cacheSpace", key="#id")
    public Book getCacheData(String id){
        return null;
    }
}

在这里插入图片描述

- 使用Postman测试结果如下:
  • 先执行 GET 请求,将相关数据放到缓存中:
    在这里插入图片描述

  • 在执行 POST 请求做校验:
    在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring框架通过Spring Cache提供了一套强大的缓存体系,可以轻松地实现缓存数据,提高应用程序的性能。Spring框架提供了三个主要的注解来实现缓存:@Cacheable、@CachePut和@CacheEvict。 @Cacheable注解用于将方法的结果缓存起来,以便在下次请求时,如果参数相同,则可以直接从缓存中获结果,而不需要重新计算。该注解适用于如果计算结果比较耗时,或者需要从数据库或其他外部资源中提数据的情况。 @CachePut注解用于更新缓存中的数据。它与@Cacheable注解类似,但不同的是,它总是更新缓存数据,而不管缓存中是否已经在该key的值。所以,可以使用这个注解来更新缓存中的数据。 @CacheEvict注解用于从缓存中删除数据。它在需要删除缓存数据的情况下使用。它可以删除指定的key对应的缓存,也可以清空所有缓存数据。 这三个注解都有一个可选参数Named:如果指定了该参数,则缓存使用指定的名称使用。如果未指定,则使用默认的名称。可以使用不同名称的缓存储不同类型的数据,并使用不同的缓存策略来控制它们的储方式。 除了Spring自带的缓存提供者之外,还可以使用其他的缓存提供者,如Ehcache、Redis、Memcached等等。在使用缓存时,需要注意的是,不同的缓存提供者之间可能会有不同的限制和性能差异。因此,必须根据实际情况选择最适合的缓存提供者和缓存策略,以获最好的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值