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); } }
测试
- 使用缓存前
- 使用缓存后
可以看到使用缓存后,请求延时减低的很明显。