学科分类
目录
Spring Boot开发

基于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依赖。

点击此处
隐藏目录