基于API的Redis缓存实现
在Spring Boot整合Redis缓存实现中,除了基于注解形式的Redis缓存实现外,还有一种开发中常用的方式——基于API的Redis缓存实现。这种基于API的Redis缓存实现,需要在某种业务需求下通过Redis提供的API调用相关方法实现数据缓存管理;同时,这种方法还可以手动管理缓存的有效期。下面,通过Redis API的方式讲解Spring Boot整合Redis缓存的具体实现。
(1)使用Redis API进行业务数据缓存管理。在chapter06项目的基础上,在com.itheima.service包下编写一个进行业务处理的类ApiCommentService,内容如文件1所示。
文件1 ApiCommentService.java
1 import com.itheima.domain.Comment;
2 import com.itheima.repository.CommentRepository;
3 import org.springframework.beans.factory.annotation.Autowired;
4 import org.springframework.data.redis.core.RedisTemplate;
5 import org.springframework.stereotype.Service;
6 import java.util.Optional;
7 import java.util.concurrent.TimeUnit;
8 @Service
9 public class ApiCommentService {
10 @Autowired
11 private CommentRepository commentRepository;
12 @Autowired
13 private RedisTemplate redisTemplate;
14 public Comment findById(int comment_id){
15 // 先从Redis缓存中查询数据
16 Object object = redisTemplate.opsForValue().get("comment_"+comment_id);
17 if (object!=null){
18 return (Comment)object;
19 }else {
20 // 缓存中没有,就进入数据库查询
21 Optional<Comment> optional = commentRepository.findById(comment_id);
22 if(optional.isPresent()){
23 Comment comment= optional.get();
24 // 将查询结果进行缓存,并设置有效期为1天
25 redisTemplate.opsForValue().set("comment_"+comment_id,
26 comment,1,TimeUnit.DAYS);
27 return comment;
28 }else {
29 return null;
30 }
31 }
32 }
33 public Comment updateComment(Comment comment){
34 commentRepository.updateComment(comment.getAuthor(), comment.getaId());
35 // 更新数据后进行缓存更新
36 redisTemplate.opsForValue().set("comment_"+comment.getId(),comment);
37 return comment;
38 }
39 public void deleteComment(int comment_id){
40 commentRepository.deleteById(comment_id);
41 // 删除数据后进行缓存删除
42 redisTemplate.delete("comment_"+comment_id);
43 }
44 }
文件1中,先使用@Autowired注解注入Redis API中常用的RedisTemplate(类似于Java基础API中的JdbcTemplate);然后在数据查询、修改和删除三个方法中,根据业务需求分别进行数据缓存查询、缓存存储、缓存更新和缓存删除。同时,Comment数据对应缓存管理的key值都手动设置了一个前缀“comment_”,这是针对不同业务数据进行缓存管理设置的唯一key,避免与其他业务缓存数据的key重复。关于上述示例中引入的Redis API中的RedisTemplate及使用,具体说明如下。
● RedisTemplate是Spring Data Redis提供的直接进行Redis操作的Java API,可以直接注入使用,相对于传统的Jedis更加简便;
● RedisTemplate可以操作<Object,Object >对象类型数据,而其子类StringRedisTemplate则是专门针对<String, String>字符串类型的数据进行操作;
● RedisTemplate类中提供了很多进行数据缓存操作的方法,可以进行数据缓存查询、缓存更新、缓存修改、缓存删除以及设置缓存有效期等,本节示例中只是对其部分方法进行了演示说明。
● 上述示例中,redisTemplate.opsForValue().set("comment_"+comment_id,comment,1,TimeUnit.DAYS)在设置缓存数据的同时,设置了缓存有效期为1天(倒数第一个参数还可以设置其他时间单位,例如天、小时、分钟、秒等);除了这种设置缓存有效期的方法外,还可以先进行数据缓存,然后进行缓存有效期设置,示例代码如下。
redisTemplate.opsForValue().set("comment_"+comment_id,comment);
redisTemplate.expire("comment_"+comment_id,90,TimeUnit.SECONDS);
(2)编写Web访问层Controller文件。在chapter06项目的com.itheima.controller包下创建Controller实体类,内容如文件2所示。
文件2 ApiCommentController.java
1 import com.itheima.domain.Comment;
1 import com.itheima.service.ApiCommentService;
2 import org.springframework.beans.factory.annotation.Autowired;
3 import org.springframework.web.bind.annotation.*;
4 @RestController
5 @RequestMapping("/api") // 窄化请求路径
6 public class ApiCommentController {
7 @Autowired
8 private ApiCommentService apiCommentService;
9 @GetMapping("/get/{id}")
10 public Comment findById(@PathVariable("id") int comment_id){
11 Comment comment = apiCommentService.findById(comment_id);
12 return comment;
13 }
14 @GetMapping("/update/{id}/{author}")
15 public Comment updateComment(@PathVariable("id") int comment_id,
16 @PathVariable("author") String author){
17 Comment comment = apiCommentService.findById(comment_id);
18 comment.setAuthor(author);
19 Comment updateComment = apiCommentService.updateComment(comment);
20 return updateComment;
21 }
22 @GetMapping("/delete/{id}")
23 public void deleteComment(@PathVariable("id") int comment_id){
24 apiCommentService.deleteComment(comment_id);
25 }
26 }
文件2,在类上加入了@RequestMapping("/api")注解用于窄化请求,并通过@Autowired注解注入了新编写的ApiCommentService实例对象,然后调用ApiCommentService中的相关方法进行数据查询、修改和删除。
(3)基于API的Redis缓存实现的相关配置。基于API的Redis缓存实现不需要@EnableCaching注解开启基于注解的缓存支持,所以这里可以选择将添加在项目启动类上的@EnableCaching进行删除或者注释(也可以不用管,不会影响基于API的Redis缓存实现演示效果)。
另外,基于API的Redis缓存实现需要在Spring Boot项目的pom.xml文件中引入Redis依赖启动器,并在配置文件中进行Redis服务连接配置,同时将进行数据存储的Comment实体类实现序列化接口,这些配置与基于注解的Redis缓存实现操作步骤相同,并且已经实现,这里不再重复。
在Spring Boot项目中,完成基于API的Redis缓存配置后,下面可以进行缓存查询、缓存更新和缓存删除的效果测试了。这里的缓存测试与6.3.2小节中基于注解的Redis缓存实现的测试完全一样,读者可以自行演示查看,这里不再重复说明。
相对使用注解的方式,使用Redis API进行数据缓存管理更加灵活,并且可以手动管控缓存有效期,这在实际开发中是不错的功能(例如进行手机验证码验证,可以在缓存中设置验证时间),当然这种方式也需要根据具体的业务编写更多的实现代码。
小提示:
Spring Boot整合Redis缓存中间件实现数据的缓存管理时,只需要加入Redis的依赖启动器spring-boot-starter-data-redis即可,不需要其他依赖。如果使用Spring Boot整合Jcache、EhCache 2.x或者Guava组件进行缓存管理,除了要添加对应组件的依赖外,还必须加入Spring Boot提供的缓存依赖spring-boot-starter-cache,其本质是提供一个spring-context-support依赖。