所以和我的差别在哪里?
@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"错误。
正确的版本确保了每个分支都有相应的返回值。
更多推荐



所有评论(0)