@Override public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) { String realCacheKey=cache_pre+pageSize+pageNum+name; try { Boolean aBoolean=redisTemplate.opsForValue().setIfAbsent(realCacheKey, UUID.randomUUID().toString()); if(aBoolean){ redisTemplate.expire(realCacheKey,10,TimeUnit.MINUTES); String cacheValue= (String) redisTemplate.opsForValue().get(realCacheKey); if(cacheValue!=null) { return JSON.parseObject(cacheValue, PageResult.class); } Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize); IPage<ActivityDetailVo> list = baseMapper.getByNamePage(page, name); PageResult activityDetailVoPageResult = PageResult.iPageHandle(list.getTotal(), list.getCurrent(), list.getSize(), list.getRecords()); redisTemplate.opsForValue().set(realCacheKey, JSON.toJSONString(activityDetailVoPageResult), 10, TimeUnit.MINUTES);

        }else{

            return null;

        }

    } catch (Exception e) {

        log.info("redis异常", e);

    }finally {

        redisTemplate.delete(realCacheKey);

    }

}所以和我的差别在哪里?

@Override

public PageResult<ActivityDetailVo> getByNamePage(Integer pageNum, Integer pageSize, String name) {

    String realCacheKey = cache_pre + pageSize + pageNum + name;

    try {

        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(realCacheKey, UUID.randomUUID().toString());

        if (aBoolean) {

            redisTemplate.expire(realCacheKey, 10, TimeUnit.MINUTES);

            String cacheValue = (String) redisTemplate.opsForValue().get(realCacheKey);

            if (cacheValue != null) {

                return JSON.parseObject(cacheValue, PageResult.class);

            }

            Page<ActivityDetailVo> page = new Page<>(pageNum, pageSize);

            IPage<ActivityDetailVo> list = baseMapper.getByNamePage(page, name);

            PageResult activityDetailVoPageResult = PageResult.iPageHandle(list.getTotal(), list.getCurrent(), list.getSize(), list.getRecords());

            redisTemplate.opsForValue().set(realCacheKey, JSON.toJSONString(activityDetailVoPageResult), 10, TimeUnit.MINUTES);

            return activityDetailVoPageResult;

        } else {

            // 等待一段时间后重新尝试获取结果

            Thread.sleep(100);

            String cacheValue = (String) redisTemplate.opsForValue().get(realCacheKey);

            if (cacheValue != null) {

                return JSON.parseObject(cacheValue, PageResult.class);

            }

            return null;

        }

    } catch (Exception e) {

        log.info("redis异常", e);

        return null;

    } finally {

        // 注意:这里删除key可能会导致并发问题,建议谨慎使用

        // redisTemplate.delete(realCacheKey);

    }

}

对比你提供的两个版本的 [getByNamePage](file://D:\BaiduNetdiskDownload\idea创建项目\demo23\demo23\src\main\java\com\example\demo23\service\ActivityService.java#L33-L33) 方法,主要差别如下:

## 主要差异点

1. **缺少返回语句**

   - 你的原始代码在 `if(aBoolean)` 分支中执行完缓存设置后**没有返回值**

   - 正确的版本在设置缓存后添加了 `return activityDetailVoPageResult;`

2. **else分支处理不同**

   - 你的原始代码:`else` 分支直接 `return null;`

   - 正确的版本:在 `else` 分支中增加了重试机制,先等待100ms,再次尝试从缓存获取数据

3. **异常处理返回值**

   - 你的原始代码:`catch` 块中只记录日志,没有返回值

   - 正确的版本:`catch` 块中添加了 `return null;`

4. **finally块处理**

   - 你的原始代码:在 `finally` 中删除缓存键

   - 正确的版本:注释掉了这行代码,避免并发问题

## 核心问题

你的原始代码主要问题是**方法没有在所有执行路径上都返回值**,Java要求所有可能的执行路径都要有返回语句,否则编译会报"Missing return statement"错误。

正确的版本确保了每个分支都有相应的返回值。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐