学习目标
(1)掌握默认缓存实现
(2)掌握redis缓存实现
(3)掌握自定义redis缓存序列化机制
(一)用Repository实现数据库操作
- 引入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- 新建实体类 Comment
- 新增Repository实现数据库操作
public interface CommentRepository extends JpaRepository<Comment,Integer> {
// @Query("SELECT c FROM t_comment c WHERE c.aId = ?1")
// public List<Comment> findById(Integer aid, Pageable pageable);
// 根据评论id修改评论作者评论作者author
@Transactional
@Modifying
@Query("UPDATE t_comment c SET c.author= ?1 WHERE c.id = ?2")
public int updateComment(String author,Integer id);
}
- 编写CommentService 服务类,并且不添加 @Cacheable注解
- 编写Controler类 CommentController
- 编写配置文件
spring.datasource.url=jdbc:mysql://localhost:3306/blog_system?serverTimezone=UTC&useSSL=false
spring.datasource.username=root
spring.datasource.password=root123
spring.jpa.show-sql=true
- 测试
在postman或浏览器多次发起
观察控制台变化
开启缓存:
(1)将@Cacheable缓存在CommentService
的查询方法配置上,
(2)在启动类引入 @EnableCaching //开启缓存。
再测试观察控制台变化
(二)实现默认缓存
- 启动类添加注解:
@EnableCaching //开启缓存。对应的类需要序列化,
在CommentService的方法配置上
课后了解其他操作的注解 @CachePut @CacheEvict @Caching @CaheConfig
- 服务类的方法添加注解 CommentService
@Cacheable(cacheNames = "comment",unless = "#result==null")
- 测试
在postman或浏览器多次发起
观察控制台变化
(三)基于注解实现redis缓存
- 引入依赖
<!-- 引入整合Redis缓存的依赖启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 配置redis服务器信息
spring.redis.host=127.0.0.1
# Redis???????
spring.redis.port=6379
# Redis?????????????
spring.redis.password=
- 验证
实体类Comment 不实现 implements Serializable(使用的还是默认缓存,redis没有数据)
在postman或浏览器多次发起
观察运行结果
实体类Comment 实现 implements Serializable后再运行查看结果(使用redis缓存,redis有数据)
- 查看redis数据(数据看不懂)
通过RedisDesktopManager查看结果
(四)基于API实现redis缓存
- 编写 ApiCommentService服务类 (没有实现Serializable)
- 编写controller 类ApiCommentController
- 测试 http://localhost:8080/api/get/1
(五)实现redis序列化
- 定义redis序列化的配置类 RedisConfig (注意没有程序调用到此类,是因为@Configuration表示项目启动就自动注入容器)
@Configuration
public class RedisConfig {
//注入redis连接工厂服务
@Resource
private RedisConnectionFactory redisConnectionFactory ;
@Bean
public RedisTemplate<String, Object> redisTemplate() {
- 测试。
http://localhost:8080/api/get/1
通过RedisDesktopManager查看结果
项目结构:
yml配置:
server.port= 8081
# MySQL???????
spring.datasource.url=jdbc:mysql://localhost:3306/blog_system?serverTimezone=UTC&useSSL=false
spring.datasource.username=root
spring.datasource.password=root123
# ?????sql??
spring.jpa.show-sql=true
# Redis????
spring.redis.host=127.0.0.1
# Redis???????
spring.redis.port=6379
# Redis?????????????
spring.redis.password=
# ??????Redis????????????1???????
spring.cache.redis.time-to-live=60000
依赖配置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 引入整合Redis缓存的依赖启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- @Data -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>