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);
}
}
测试
- 使用缓存前
- 使用缓存后
可以看到使用缓存后,请求延时减低的很明显。
完整的工程代码链接:https://github.com/youzhihua/springboot-training