中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot中怎么使用redis對單個對象進行自動緩存更新刪除

發布時間:2021-08-05 14:20:45 來源:億速云 閱讀:162 作者:Leah 欄目:開發技術

springboot中怎么使用redis對單個對象進行自動緩存更新刪除,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創建一個實體類

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@ApiModel(value="ERepository對象", description="題庫")
public class ERepository extends BasicModel<ERepository> implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty(value = "安全分類id")
    private Long safeTypeId;

    @ApiModelProperty(value = "題型")
    private Integer quesType;

    @ApiModelProperty(value = "題干")
    private String quesContent;

    @ApiModelProperty(value = "選項")
    private String options;

    @ApiModelProperty(value = "答案")
    private String answer;

    @ApiModelProperty(value = "是否審核(0:未審核,1:已審核)")
//    @TableField("is_check")
    private Boolean isCheck;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}

創建一個控制器

@RequiredArgsConstructor
@RestController
@Slf4j
@Api(tags = "題庫模塊")
@RequestMapping("/api/eRepository")
public class ERepositoryController {
    private final IERepositoryService eRepositoryService;

    @ApiOperation("查詢所有題目")
    @GetMapping(value = "/all")
    @ResponseBody
    public Result<List<ERepository>> getRespository(ERepositoryQueryCriteria criteria){
        return Result.success(eRepositoryService.getRepositoryAll(criteria));
    }

    @ApiOperation(value = "多條件查詢題目",notes = "根據各種條件查詢,可分頁 \n author:LiFang 2021/7/25")
    @GetMapping
    @ResponseBody
    public Result<IPage<ERepositoryDTO>> getRespository(PageVO pageVO,ERepositoryQueryCriteria criteria){
        return Result.success(eRepositoryService.getRepository(pageVO.buildPage(),criteria));
    }

    @ApiOperation(value = "按安全分類id查詢")
    @GetMapping(value = "/getBySafeTypeId")
    public Result<List<ERepository>> getRespositoryBySafeTypeId(Long id){
        Long start = System.currentTimeMillis();
        List<ERepository> list = eRepositoryService.getBySafeTypeId(id);
        Long end = System.currentTimeMillis();
        System.out.println("耗時:"+(end-start));
        return Result.success(list);
    }

    @ApiOperation("新增題目")
    @PostMapping
    public Result<Void> add(@RequestBody ERepository eRepository){
        eRepository.setDeleted(false);
        eRepositoryService.addRepository(eRepository);
        return Result.success();
    }

    @ApiOperation("修改題目")
    @PutMapping
    public Result<Object> update(@RequestBody ERepository eRepository){
        eRepository.setDeleted(false);
        log.info(StrUtil.format("【修改題目 /api/eRepository】操作人id:{},被修改題目id:{}", SecurityUtils.getCurrentUserId(),
                eRepository.getId()));
        return Result.success(eRepositoryService.updateRepository(eRepository));
    }

    @ApiOperation("刪除題目")
    @DeleteMapping
    public Result<Void> delete(@RequestBody Set<Long> ids){
        eRepositoryService.deleteById(ids);
        return Result.success();
    }
}

建個service

public interface IERepositoryService extends IBasicService<ERepository> {
    List<ERepository> getRepositoryAll(ERepositoryQueryCriteria criteria);

    IPage<ERepositoryDTO> getRepository(IPage<ERepository> page,ERepositoryQueryCriteria criteria);

    List<ERepository> addRepository(ERepository eRepository);

    List<ERepository> updateRepository(ERepository eRepository);

    void deleteById(Set<Long> id);

    List<ERepository> getBySafeTypeId(Long id);
}

新建service實現類

使用注解進行自動緩存、更新、刪除主要是在service的實現類里寫

@Slf4j
@Service
@EnableCaching
@RequiredArgsConstructor
@CacheConfig(cacheNames = "repository")
public class ERepositoryServiceImpl extends BasicServiceImpl<ERepositoryMapper, ERepository> implements IERepositoryService {
    private final ERepositoryMapper eRepositoryMapper;
    private final ERepositoryStruct eRepositoryStruct;
//    private final ERepositoryServiceImpl eRepositoryService;
    private final RedisUtils redisUtils;

    @Override
    public List<ERepository> getRepositoryAll(ERepositoryQueryCriteria criteria) {
        List<ERepository> eRepositories = eRepositoryMapper.selectList(buildERepositoryCriteria(criteria));
        return eRepositories;
    }

    @Override
    public IPage<ERepositoryDTO> getRepository(IPage<ERepository> page,ERepositoryQueryCriteria criteria) {
        IPage<ERepository> eRepositoryPage = eRepositoryMapper.selectPage(page,buildERepositoryCriteria(criteria));
        List<ERepositoryDTO> eRepositoryDTOList = eRepositoryStruct.toDto(eRepositoryPage.getRecords());
        return PageUtil.toMapStructPage(eRepositoryPage,eRepositoryDTOList);
    }

    @Cacheable(key = "'safeTypeId:' + #p0")
    @Override
    public List<ERepository> getBySafeTypeId(Long id) {
        List<ERepository> eRepositoryList = eRepositoryMapper.getBySafeTypeId(id);
        return eRepositoryList;
    }

    private LambdaQueryWrapper<ERepository> buildERepositoryCriteria(ERepositoryQueryCriteria criteria){
        LambdaQueryWrapper<ERepository> wrapper = new LambdaQueryWrapper<>();
//        wrapper.eq(ERepository::getDeleted,false);
        if (ObjectUtil.isNotNull(criteria.getId())) {
            wrapper.eq(ERepository::getId,criteria.getId());
        }
        if(StrUtil.isNotBlank(criteria.getQuesContent())){
            //默認使用like匹配
            wrapper.like(ERepository::getQuesContent, criteria.getQuesContent());
        }
        if (ObjectUtil.isNotNull(criteria.getSafeTypeId())) {
            wrapper.eq(ERepository::getSafeTypeId, criteria.getSafeTypeId());
        }
        if(ObjectUtil.isNotNull(criteria.getQuesType())){
            wrapper.eq(ERepository::getQuesType,criteria.getQuesType());
        }
        if (ObjectUtil.isNotNull(criteria.getStartTime()) && ObjectUtil.isNotNull(criteria.getEndTime())) {
            wrapper.between(ERepository::getCreateTime , criteria.getStartTime(), criteria.getEndTime());
        }
        return wrapper;
    }

    @CachePut(key = "'safeTypeId:' + #p0.safeTypeId")
    @Override
    public List<ERepository> addRepository(ERepository eRepository) {
        eRepositoryMapper.insert(eRepository);
        List<ERepository> list = eRepositoryMapper.getBySafeTypeId(eRepository.getSafeTypeId());
//        list.add(eRepository);
        return list;
    }

    @CachePut(key = "'safeTypeId:' + #p0.safeTypeId")
    @Override
    public List<ERepository> updateRepository(ERepository resources) {
        ERepository eRepository = getById(resources.getId());
        if(ObjectUtil.isEmpty(eRepository)){
            log.error(StrUtil.format("【修改題目失敗】操作人id:{},修改目標ERepository為空,目標id:{}", SecurityUtils.getCurrentUserId(),
                    resources.getId()));
            throw new BadRequestException("修改失敗,當前數據id不存在");
        }
        eRepositoryMapper.updateById(resources);
        log.info(StrUtil.format("【修改題目成功】操作人id:{},修改目標題目:{}", SecurityUtils.getCurrentUserId(),
                resources));
        List<ERepository> list = eRepositoryMapper.getBySafeTypeId(resources.getSafeTypeId());
//        list.removeIf(item -> resources.geMId().equals(item.getId()));
//        list.add(resources);
        //清理緩存
        delCaches(resources.getId());
        return list;
    }

    @Override
    public void deleteById(Set<Long> ids) {
        for (Long id : ids){
            eRepositoryMapper.deleteById(id);
            //清理緩存
            delCaches(id);
        }
        log.info(StrUtil.format("【刪除題目成功】操作人id:{},刪除目標repositories:{}", SecurityUtils.getCurrentUserId(),
                ids.toString()));
    }

    /**
     * 清理緩存
     *
     * @param id /
     */
    private void delCaches(Long id) {
        Long safeTypeId = eRepositoryMapper.getSafeTypeIdById(id);
        //刪除屬于該安全分類的題庫緩存
        redisUtils.del(CacheKey.REPOSITORY_SAFETYPEID + safeTypeId);
    }
}

新建mapper接口

@Component
public interface ERepositoryMapper extends BasicMapper<ERepository> {
    @Select("SELECT * FROM e_repository WHERE safe_type_id = #{safeTypeId} AND is_deleted=0")
    List<ERepository> getBySafeTypeId(Long safeTypeId);

     @Select("SELECT safe_type_id FROM e_repository WHERE id= #{id} AND is_deleted=0")
     Long getSafeTypeIdById(Long id);
}

 6.啟動項目

使用swagger測試根據安全分類id查詢題目接口,該分類題目的查詢結果成功響應,這時打開redis管理工具,可以看到題目按分類已經被緩存到redis中了。

springboot中怎么使用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對單個對象進行自動緩存更新刪除問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

横峰县| 新宾| 广昌县| 六盘水市| 德庆县| 武隆县| 法库县| 白城市| 安化县| 汾阳市| 喀喇沁旗| 昂仁县| 河池市| 常熟市| 吴旗县| 黄冈市| 阜平县| 德阳市| 林西县| 寿光市| 双鸭山市| 阆中市| 澜沧| 墨江| 高碑店市| 龙山县| 自贡市| 晋宁县| 阿克陶县| 孝义市| 秦皇岛市| 依安县| 大宁县| 隆林| 且末县| 和静县| 永宁县| 迁安市| 江达县| 宣汉县| 鸡东县|