当前位置: 首页>后端>正文

SpringBoot基础教程(八) - Cache篇

SpringCache介绍

SpringCache是Spring3.1开始提供注解支持的,自身非常灵活,不仅能够使用 SpEL(Spring Expression Language)来定义缓存的 key 和各种 condition,还支持与redis, EHCache等主流缓存进行集成。

Spring集成redis的运行原理

Spring缓存抽象模块通过CacheManager来创建、管理实际缓存组件,当SpringBoot应用程序引入spring-boot-starter-data-redis依赖后,容器中将注册的是CacheManager实例RedisCacheManager对象,RedisCacheManager来负责创建RedisCache作为缓存管理组件,由RedisCache操作redis服务器实现缓存数据操作。

添加Maven依赖

        <!--mybatis场景启动器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!--mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.2</version>
        </dependency>

        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--spring boot 2.x redis 底层使用 Lettuce 依赖这个包-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

编写配置文件

##### mysql相关配置 #####
spring.datasource.username=root
spring.datasource.password=yzhroot
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=CTT
##### mybatis相关配置 #####
mybatis.configuration.map-underscore-to-camel-case=true
##### redis相关配置 #####
# redis-server的主机
spring.redis.host=yourhost
# redis的端口
spring.redis.port=6379
# redis的密码
spring.redis.password=yzhroot
# redis的数据库索引  默认是0
spring.redis.database=0
# redis连接池的最大连接数 默认为8
spring.redis.lettuce.pool.max-active=8
# redis连接池的最大等待时间 默认-1 无限制
spring.redis.lettuce.pool.max-wait=-1
##### 设置spring.cache的第三方缓存,若不设置Spring Cache会根据依赖的包自行装配
spring.cache.type=redis
# 设置自定义mapper
mapper.identity=MYSQL
mapper.mappers=training.springboot.cache.dao.CustomeDao

编写实体类

/**
 * 书籍实体类
 */
@Table(name = "book")
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String bookName;

    private String bookAuthor;

    public Book() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookAuthor() {
        return bookAuthor;
    }

    public void setBookAuthor(String bookAuthor) {
        this.bookAuthor = bookAuthor;
    }
}

编写持久层

/**
 * 自定义的mapper模板
 * @param <T>
 */
public interface CustomeDao<T> extends MySqlMapper<T>, Mapper<T> {
}
@Mapper
public interface BookDao extends CustomeDao<Book>{
}

编写业务层(重点)

@Service
public class BookService {

    @Autowired
    private BookDao bookDao;

    //获取所有书的信息
    public List<Book> queryAllBookInfo(){
        return bookDao.selectAll();
    }

    //根据主键获取书的信息
    @Cacheable(cacheNames = "book",key = "'book'+#id")
    public Book queryBookById(Integer id){
        return bookDao.selectByPrimaryKey(id);
    }

    //更新书的信息
    @CachePut(cacheNames = "book",key = "'book'+#book.id",condition = "#result != null")
    public Book updateBookInfo(Book book){
        if(bookDao.updateByPrimaryKey(book)>0){
            return book;
        }
        return null;
    }

    //删除书的信息
    @CacheEvict(cacheNames = "book",key = "'book'+#id",condition = "#result>0")
    public Integer deleteBookInfo(Integer id){
        return bookDao.deleteByPrimaryKey(id);
    }

    //增加一本书的信息
    @CachePut(cacheNames = "book",key = "'book'+#result",condition = "#result != null")
    public Book insertBook(Book book){
        bookDao.insertUseGeneratedKeys(book);
        return book;
    }
}
  • SpringCache常用注解介绍
注解名称 注解用途
@Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@CachePut 保证方法被调用,又希望结果被缓存,主要用于更新方法
@CacheEvict 清空缓存,主要用于删除方法
@EnableCaching 开启缓存,主要设置在启动类上
  • SpringCache常用注解的参数介绍
名称 解释 示例
value 缓存的名称,必须指定 至少一个,或者通过@CacheConfig在类上设置 @Cacheable(value=”cacheValue”)
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达 式编写,如果不指定,则缺省按照方法的所有参数 进行组合 @Cacheable(value=”cacheValue”,key=”#bookName”
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存/清除缓存,在 调用方法之前之后都能判断 @CacheEvict(cacheNames = "book",key = "'book'+#id",condition = "#result>0")

编写控制类

@RestController
public class BookController {

    @Autowired
    private BookService bookService;

    //获取所有书的信息
    @RequestMapping("/queryAllBookInfo")
    public List<Book> queryAllBookInfo(){
        return bookService.queryAllBookInfo();
    }

    //根据主键获取书的信息
    @RequestMapping("/queryBookById")
    public Book queryBookById(Integer id){
        return bookService.queryBookById(id);
    }

    //更新书的信息
    @RequestMapping("/updateBookInfo")
    public Book updateBookInfo(Book book){
        return bookService.updateBookInfo(book);
    }

    //删除书的信息
    @RequestMapping("/deleteBookInfo")
    public Integer deleteBookInfo(Integer id){
        return bookService.deleteBookInfo(id);
    }

    //增加一本书的信息
    @RequestMapping("/insertBook")
    public Book insertBook(Book book){
        return bookService.insertBook(book);
    }

}

测试

  • 使用缓存前
SpringBoot基础教程(八) - Cache篇,第1张
使用缓存前.png
  • 使用缓存后
SpringBoot基础教程(八) - Cache篇,第2张
使用缓存后.png

可以看到使用缓存后,请求延时减低的很明显。

完整的工程代码链接:https://github.com/youzhihua/springboot-training


https://www.xamrdz.com/backend/3va1936512.html

相关文章: