经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
springboot使用redis对单个对象进行自动缓存更新删除的实现
来源:jb51  时间:2021/8/4 17:55:51  对本文有异议

Springboot的项目搭建在此省略,pom文件依赖什么的就不说了

创建一个实体类

  1. @Data
  2. @EqualsAndHashCode(callSuper = true)
  3. @Accessors(chain = true)
  4. @ApiModel(value="ERepository对象", description="题库")
  5. public class ERepository extends BasicModel<ERepository> implements Serializable {
  6.  
  7. private static final long serialVersionUID = 1L;
  8.  
  9. @TableId(value = "id", type = IdType.AUTO)
  10. private Long id;
  11.  
  12. @ApiModelProperty(value = "安全分类id")
  13. private Long safeTypeId;
  14.  
  15. @ApiModelProperty(value = "题型")
  16. private Integer quesType;
  17.  
  18. @ApiModelProperty(value = "题干")
  19. private String quesContent;
  20.  
  21. @ApiModelProperty(value = "选项")
  22. private String options;
  23.  
  24. @ApiModelProperty(value = "答案")
  25. private String answer;
  26.  
  27. @ApiModelProperty(value = "是否审核(0:未审核,1:已审核)")
  28. // @TableField("is_check")
  29. private Boolean isCheck;
  30. @Override
  31. protected Serializable pkVal() {
  32. return this.id;
  33. }
  34. }

创建一个控制器

  1. @RequiredArgsConstructor
  2. @RestController
  3. @Slf4j
  4. @Api(tags = "题库模块")
  5. @RequestMapping("/api/eRepository")
  6. public class ERepositoryController {
  7. private final IERepositoryService eRepositoryService;
  8.  
  9. @ApiOperation("查询所有题目")
  10. @GetMapping(value = "/all")
  11. @ResponseBody
  12. public Result<List<ERepository>> getRespository(ERepositoryQueryCriteria criteria){
  13. return Result.success(eRepositoryService.getRepositoryAll(criteria));
  14. }
  15.  
  16. @ApiOperation(value = "多条件查询题目",notes = "根据各种条件查询,可分页 \n author:LiFang 2021/7/25")
  17. @GetMapping
  18. @ResponseBody
  19. public Result<IPage<ERepositoryDTO>> getRespository(PageVO pageVO,ERepositoryQueryCriteria criteria){
  20. return Result.success(eRepositoryService.getRepository(pageVO.buildPage(),criteria));
  21. }
  22.  
  23. @ApiOperation(value = "按安全分类id查询")
  24. @GetMapping(value = "/getBySafeTypeId")
  25. public Result<List<ERepository>> getRespositoryBySafeTypeId(Long id){
  26. Long start = System.currentTimeMillis();
  27. List<ERepository> list = eRepositoryService.getBySafeTypeId(id);
  28. Long end = System.currentTimeMillis();
  29. System.out.println("耗时:"+(end-start));
  30. return Result.success(list);
  31. }
  32.  
  33. @ApiOperation("新增题目")
  34. @PostMapping
  35. public Result<Void> add(@RequestBody ERepository eRepository){
  36. eRepository.setDeleted(false);
  37. eRepositoryService.addRepository(eRepository);
  38. return Result.success();
  39. }
  40.  
  41. @ApiOperation("修改题目")
  42. @PutMapping
  43. public Result<Object> update(@RequestBody ERepository eRepository){
  44. eRepository.setDeleted(false);
  45. log.info(StrUtil.format("【修改题目 /api/eRepository】操作人id:{},被修改题目id:{}", SecurityUtils.getCurrentUserId(),
  46. eRepository.getId()));
  47. return Result.success(eRepositoryService.updateRepository(eRepository));
  48. }
  49.  
  50. @ApiOperation("删除题目")
  51. @DeleteMapping
  52. public Result<Void> delete(@RequestBody Set<Long> ids){
  53. eRepositoryService.deleteById(ids);
  54. return Result.success();
  55. }
  56. }

建个service

  1. public interface IERepositoryService extends IBasicService<ERepository> {
  2. List<ERepository> getRepositoryAll(ERepositoryQueryCriteria criteria);
  3.  
  4. IPage<ERepositoryDTO> getRepository(IPage<ERepository> page,ERepositoryQueryCriteria criteria);
  5.  
  6. List<ERepository> addRepository(ERepository eRepository);
  7.  
  8. List<ERepository> updateRepository(ERepository eRepository);
  9.  
  10. void deleteById(Set<Long> id);
  11.  
  12. List<ERepository> getBySafeTypeId(Long id);
  13. }
  14.  

新建service实现类

使用注解进行自动缓存、更新、删除主要是在service的实现类里写

  1. @Slf4j
  2. @Service
  3. @EnableCaching
  4. @RequiredArgsConstructor
  5. @CacheConfig(cacheNames = "repository")
  6. public class ERepositoryServiceImpl extends BasicServiceImpl<ERepositoryMapper, ERepository> implements IERepositoryService {
  7. private final ERepositoryMapper eRepositoryMapper;
  8. private final ERepositoryStruct eRepositoryStruct;
  9. // private final ERepositoryServiceImpl eRepositoryService;
  10. private final RedisUtils redisUtils;
  11.  
  12. @Override
  13. public List<ERepository> getRepositoryAll(ERepositoryQueryCriteria criteria) {
  14. List<ERepository> eRepositories = eRepositoryMapper.selectList(buildERepositoryCriteria(criteria));
  15. return eRepositories;
  16. }
  17.  
  18. @Override
  19. public IPage<ERepositoryDTO> getRepository(IPage<ERepository> page,ERepositoryQueryCriteria criteria) {
  20. IPage<ERepository> eRepositoryPage = eRepositoryMapper.selectPage(page,buildERepositoryCriteria(criteria));
  21. List<ERepositoryDTO> eRepositoryDTOList = eRepositoryStruct.toDto(eRepositoryPage.getRecords());
  22. return PageUtil.toMapStructPage(eRepositoryPage,eRepositoryDTOList);
  23. }
  24.  
  25. @Cacheable(key = "'safeTypeId:' + #p0")
  26. @Override
  27. public List<ERepository> getBySafeTypeId(Long id) {
  28. List<ERepository> eRepositoryList = eRepositoryMapper.getBySafeTypeId(id);
  29. return eRepositoryList;
  30. }
  31.  
  32. private LambdaQueryWrapper<ERepository> buildERepositoryCriteria(ERepositoryQueryCriteria criteria){
  33. LambdaQueryWrapper<ERepository> wrapper = new LambdaQueryWrapper<>();
  34. // wrapper.eq(ERepository::getDeleted,false);
  35. if (ObjectUtil.isNotNull(criteria.getId())) {
  36. wrapper.eq(ERepository::getId,criteria.getId());
  37. }
  38. if(StrUtil.isNotBlank(criteria.getQuesContent())){
  39. //默认使用like匹配
  40. wrapper.like(ERepository::getQuesContent, criteria.getQuesContent());
  41. }
  42. if (ObjectUtil.isNotNull(criteria.getSafeTypeId())) {
  43. wrapper.eq(ERepository::getSafeTypeId, criteria.getSafeTypeId());
  44. }
  45. if(ObjectUtil.isNotNull(criteria.getQuesType())){
  46. wrapper.eq(ERepository::getQuesType,criteria.getQuesType());
  47. }
  48. if (ObjectUtil.isNotNull(criteria.getStartTime()) && ObjectUtil.isNotNull(criteria.getEndTime())) {
  49. wrapper.between(ERepository::getCreateTime , criteria.getStartTime(), criteria.getEndTime());
  50. }
  51. return wrapper;
  52. }
  53.  
  54. @CachePut(key = "'safeTypeId:' + #p0.safeTypeId")
  55. @Override
  56. public List<ERepository> addRepository(ERepository eRepository) {
  57. eRepositoryMapper.insert(eRepository);
  58. List<ERepository> list = eRepositoryMapper.getBySafeTypeId(eRepository.getSafeTypeId());
  59. // list.add(eRepository);
  60. return list;
  61. }
  62.  
  63. @CachePut(key = "'safeTypeId:' + #p0.safeTypeId")
  64. @Override
  65. public List<ERepository> updateRepository(ERepository resources) {
  66. ERepository eRepository = getById(resources.getId());
  67. if(ObjectUtil.isEmpty(eRepository)){
  68. log.error(StrUtil.format("【修改题目失败】操作人id:{},修改目标ERepository为空,目标id:{}", SecurityUtils.getCurrentUserId(),
  69. resources.getId()));
  70. throw new BadRequestException("修改失败,当前数据id不存在");
  71. }
  72. eRepositoryMapper.updateById(resources);
  73. log.info(StrUtil.format("【修改题目成功】操作人id:{},修改目标题目:{}", SecurityUtils.getCurrentUserId(),
  74. resources));
  75. List<ERepository> list = eRepositoryMapper.getBySafeTypeId(resources.getSafeTypeId());
  76. // list.removeIf(item -> resources.geMId().equals(item.getId()));
  77. // list.add(resources);
  78. //清理缓存
  79. delCaches(resources.getId());
  80. return list;
  81. }
  82.  
  83. @Override
  84. public void deleteById(Set<Long> ids) {
  85. for (Long id : ids){
  86. eRepositoryMapper.deleteById(id);
  87. //清理缓存
  88. delCaches(id);
  89. }
  90. log.info(StrUtil.format("【删除题目成功】操作人id:{},删除目标repositories:{}", SecurityUtils.getCurrentUserId(),
  91. ids.toString()));
  92. }
  93.  
  94. /**
  95. * 清理缓存
  96. *
  97. * @param id /
  98. */
  99. private void delCaches(Long id) {
  100. Long safeTypeId = eRepositoryMapper.getSafeTypeIdById(id);
  101. //删除属于该安全分类的题库缓存
  102. redisUtils.del(CacheKey.REPOSITORY_SAFETYPEID + safeTypeId);
  103. }
  104. }

新建mapper接口

  1. @Component
  2. public interface ERepositoryMapper extends BasicMapper<ERepository> {
  3. @Select("SELECT * FROM e_repository WHERE safe_type_id = #{safeTypeId} AND is_deleted=0")
  4. List<ERepository> getBySafeTypeId(Long safeTypeId);
  5.  
  6. @Select("SELECT safe_type_id FROM e_repository WHERE id= #{id} AND is_deleted=0")
  7. Long getSafeTypeIdById(Long id);
  8. }
  9.  

 6.启动项目

使用swagger测试根据安全分类id查询题目接口,该分类题目的查询结果成功响应,这时打开redis管理工具,可以看到题目按分类已经被缓存到redis中了。

再次用swagger测试查询该分类id的所有题目,可以看到IDEA控制台并没有sql语句打印,仍然有查询结果成功响应。

@CacheConfig(cacheNames = “repository”)
放在service实现类上,用来配置缓存名称。
@Cacheable(key = “‘safeTypeId:' + #p0”)
放在查询方法上,‘safeTypeId:' + #p0作为键,p0是该方法的第一个参数。
作用:使用这两个注解,会使查询方法首先会根据key从缓存中查询,如果缓存中没有该键,则从使用sql语句到数据库中差查询,查询后,响应结果,并自动将方法的返回结果放入redis缓存中,下一次,如果再查询就直接从redis缓存中查询。

好处:极大提升查询效率,并减轻服务器压力。

@CachePut(key = “‘safeTypeId:' + #p0.safeTypeId”)

通常加到添加和更新方法上

  • 当访问新增题目接口时,数据库新增题目成功,方法返回结果会存入redis中,这次再访问查询属于该分类的题目接口,会发现该分类的题目已经添加成功。
  • 当访问更新题目接口时,数据库更新题目成功,方法返回结果会根据key存入redis中,当再根据该key查询题目时,会发现控制台并没有打印sql语句,直接从redis中查询出结果。

@CacheEvict(key = “#p0”)

用在删除方法上,走该删除方法,会删除数据库中的该条记录,而且会删除key为方法的第一个参数(通常为id)的redis记录。再次查询该条记录,发现查询不到了。
注意:上面的方法不能用来存储集合。

到此这篇关于springboot使用redis对单个对象进行自动缓存更新删除的实现的文章就介绍到这了,更多相关springboot redis自动缓存更新删除内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号