我是靠谱客的博主 勤劳鸭子,最近开发中收集的这篇文章主要介绍如何使用redis实现(二) 文章收藏量+1和-1分析vo类控制器接口业务层实现方法返回当前用户的收藏文章集合是否包含此文章的接口,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 分析
  • vo类
  • 控制器接口
  • 业务层实现方法
    • 收藏按钮接口使用到的方法(重点)
    • 抽出来的方法--通过此文章id找到对应的vo对象
    • 抽出来的方法--存放vo对象进redis中
  • 返回当前用户的收藏文章集合是否包含此文章的接口
    • 业务实现方法

分析

  • 前提须知:实现文章阅读量+1 讲解了vo类封装,包含了文章阅读量,收藏量,点赞量,评论量等信息
  • 应用场景: 在一篇攻略文章中,点击收藏按钮,实现此文章收藏数+1
  • 使用了redis , key为当前用户id,value为此用户对应的收藏文章id集合
  • 此集合若有传过来的文章id则已收藏,点击按钮则是取消收藏
  • 此集合若无传过来的文章id则未收藏,点击按钮则是添加收藏,此文章收藏数+1
    在这里插入图片描述

vo类

在这里插入图片描述

控制器接口

  • @RequireLogin表明需要登录才能访问此接口,具体至登录拦截注解
  • @UserParam贴在用户参数上表明是当前用户,具体至参数解析器设置当前用户
  • 前端传入2个参数访问此接口,当前攻略文章id,和当前用户(为了获取当前用户id)
  • 接口返回给前端,若是true则是收藏成功,若是false则是取消收藏
 @RequireLogin
    @PostMapping("/favor")
    public Object favor(Long sid,@UserParam UserInfo userInfo){
       boolean b= strategyStatisVORedisService.favor(sid,userInfo.getId());
        return JsonResult.success(b);
    }

业务层实现方法

  • 先注入private StringRedisTemplate template; 即可操作redis
  • 注入private IStrategyService strategyService; 即可操作mysql数据库
  • 因为文章的收藏数,浏览数等等是通过给前端vo对象返回显示的,而vo对象存在于redis中,所以进行收藏操作的时候,也要从redis中拿到vo对象,更新完收藏量再放入进去

收藏按钮接口使用到的方法(重点)

  • 引用了以上2个抽出来的方法(从redis拿vo对象和将vo对象放入redis中),都在同一个业务类中
  • 前端传2个参数,攻略文章id和当前用户id
  • 先判断用户id是否在redis有属于自己的key,若无则进行初始化(此操作未做演示,可忽略),若有的话,则查找自己对应的收藏文章集合
  • 查看当前文章id是否存在于此文章集合中,若不存在,则进行添加收藏操作,使攻略文章对应的vo对象内的收藏量+1,若存在,则进行取消收藏操作,使攻略文章对应的vo对象内的收藏量-1
  • 将此vo对象存回redis中,在前端页面显示收藏量则是用此vo对象的收藏量作为显示
  • 最后返回boolean值,所有业务操作完后,若当前用户的收藏文章集合还是没有此文章id则是false即取消收藏,若当前用户的收藏文章集合有了此文章id则是true,表示收藏成功!
public boolean favor(Long sid, Long uid) {
//        拼接sidList的Key
        String key = RedisKeys.USER_STRATEGY_FAVOR.join(uid.toString());
//        如果key不存在,初始化
        List<Long> sidList = null;
        if (!template.hasKey(key)) {
            sidList = new ArrayList<>();
            
        } else {
            String str = template.opsForValue().get(key);
//    参数1:json格式字符串 参数2:集合元素泛型
            sidList = JSON.parseArray(str, Long.class);
        }
        StrategyStatisVO vo = this.getStrategyVO(sid);

//        判断sid是否在sidList中
        if (sidList.contains(sid)) {
            //        如果在,收藏数-1,将sid移除sidList[取消收藏]
            vo.setFavornum(vo.getFavornum() - 1);
            sidList.remove(sid);
        } else {
//        如果不在,收藏数+1,将sid添加sidList中[收藏]
            vo.setFavornum(vo.getFavornum() + 1);
            sidList.add(sid);
        }
//        更新sidList  vo对象
        template.opsForValue().set(key, JSON.toJSONString(sidList));
        this.setStrategyVo(vo);
        return sidList.contains(sid);
    }

抽出来的方法–通过此文章id找到对应的vo对象

  //    通过攻略文章id获取对应vo
    @Override
    public StrategyStatisVO getStrategyVO(Long sid) {
//       拼接vo的key
        String key = RedisKeys.STRATEGY_STATIS_VO.join(sid.toString());
//        获取vo对象
        StrategyStatisVO vo = null;
        if (!template.hasKey(key)) {
            //        不存在,进行vo对象初始化
            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;
    }

抽出来的方法–存放vo对象进redis中

 //将vo 存进redis
    @Override
    public void setStrategyVo(StrategyStatisVO vo) {
        //       拼接vo的key
        String key = RedisKeys.STRATEGY_STATIS_VO.join(vo.getStrategyId().toString());
//    更新vo
        template.opsForValue().set(key, JSON.toJSONString(vo));
    }

返回当前用户的收藏文章集合是否包含此文章的接口

  • 这里主要是为了给前端进行样式的判断,若此文章id存在当前用户收藏的文章集合里表示已收藏则显示蓝色,若此文章id不在当前用户收藏的文章集合里表示未收藏,则显示白色
    在这里插入图片描述
    在这里插入图片描述
  • 参数1: 当前浏览的文章id, 参数2: 当前用户id
@GetMapping("/strategies/favor")
    public Object favor(Long sid,Long userId){
     List<Long> sidList = strategyStatisVORedisService.getSidList(userId);
        return JsonResult.success(sidList.contains(sid));
    }

业务实现方法

  • 通过当前用户id,从redis中查询对应的收藏文章id集合(redis存的是集合的JSON字符串,需要通过JSON.parseArray(str, Long.class);转化成list集合)
  • 若不存在此用户id为key的数据,则进行初始化,将mysql的数据给到redis(此操作未做演示,可忽略)
 public List<Long> getSidList(Long userId) {
        //        拼接sidList的Key
        String key = RedisKeys.USER_STRATEGY_FAVOR.join(userId.toString());
//        如果key不存在,初始化
        List<Long> sidList = null;
        if (!template.hasKey(key)) {
            sidList = new ArrayList<>();
            template.opsForValue().set(key,JSON.toJSONString(sidList));
        } else {
            String str = template.opsForValue().get(key);
//    参数1:json格式字符串 参数2:集合元素泛型
            sidList = JSON.parseArray(str, Long.class);
        }
        return sidList;
    }

最后

以上就是勤劳鸭子为你收集整理的如何使用redis实现(二) 文章收藏量+1和-1分析vo类控制器接口业务层实现方法返回当前用户的收藏文章集合是否包含此文章的接口的全部内容,希望文章能够帮你解决如何使用redis实现(二) 文章收藏量+1和-1分析vo类控制器接口业务层实现方法返回当前用户的收藏文章集合是否包含此文章的接口所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(68)

评论列表共有 0 条评论

立即
投稿
返回
顶部