分析
- 应用场景:查看攻略文章,则此文章阅读数+1


- 若想要数据丢失量低则使用map对象作为redis的value存储,但是操作比较复杂
- 所以此篇文章演示的是vo对象作为redis的value存储操作,毕竟存储的这些阅读量…不是特别重要的数据~
vo类
- 攻略文章的vo类
- 主要通过攻略文章对象数据转化

控制器接口
- 访问文章页面时候 所访问的控制器接口
- 主要看画红线部分,其他部分可忽略
- 通过传入当前文章的id,使此文章阅读量+1

业务层实现方法
- 注入了操作redis的
StringRedisTemplate
对象和操作攻略文章对象数据的IStrategyService
业务层接口 - 先在redis中查看有没有此对应的文章vo数据,有则获取出来
- 若redis不存在该攻略文章id对应的vo数据对象,则直接在mysql数据库中获取攻略文章对象,并通过
BeanUtils.copyProperties
转化成vo对象 - 最后使其vo对象内的viewnum属性值+1(阅读量+1),然后存回redis中即可完成 文章阅读量+1的操作
@Autowired
private StringRedisTemplate template;
@Autowired
private IStrategyService strategyService;
@Override
public void viewnumIncrease(Long sid) {
String key = RedisKeys.STRATEGY_STATIS_VO.join(sid.toString());
StrategyStatisVO vo = null;
if (!template.hasKey(key)) {
Strategy strategy = strategyService.getById(sid);
vo = new StrategyStatisVO();
BeanUtils.copyProperties(strategy,vo);
vo.setStrategyId(strategy.getId());
} else {
String voStr = template.opsForValue().get(key);
vo = JSON.parseObject(voStr, StrategyStatisVO.class);
}
vo.setViewnum(vo.getViewnum() + 1);
template.opsForValue().set(key, JSON.toJSONString(vo));
}
将文章对应vo类返回给前端(即可显示阅读量)
控制器接口
- 获取当前文章对应的vo对象,即可显示出此文章对应的阅读量等数据

业务层实现方法
- 依旧需要注入
private StringRedisTemplate template;
和
private IStrategyService strategyService;
对象操作redis和数据库 - 和以上阅读量+1的方法部分操作类似
- 通过文章id,查询redis是否有对应的vo对象
- 若无则从mysql数据库中查找,并转化成vo对象,存入redis中
- 若有则将vo的json字符串对象 转成实体类对象
- 最后返回vo对象即可!
public StrategyStatisVO getStrategyVO(Long sid) {
String key = RedisKeys.STRATEGY_STATIS_VO.join(sid.toString());
StrategyStatisVO vo = null;
if (!template.hasKey(key)) {
Strategy strategy = strategyService.getById(sid);
vo = new StrategyStatisVO();
BeanUtils.copyProperties(strategy,vo);
vo.setStrategyId(strategy.getId());
template.opsForValue().set(key, JSON.toJSONString(vo));
} else {
String voStr = template.opsForValue().get(key);
vo = JSON.parseObject(voStr, StrategyStatisVO.class);
}
return vo;
}