项目开发实际之用Redis实现文章或者评论不能重复点赞

项目开发实际之用Redis实现文章或者评论不能重复点赞

业务场景

点赞在我们的生活中可谓无处不在,朋友圈点个赞,qq空间点个赞,看到好看的文章表示认可给他点个赞,不小心点到了,也可以取消点赞

在这里插入图片描述

在这里插入图片描述

实现代码

实现逻辑

文章存储在数据表中文章必然会有一个对应的id,用户也有一个对应的id,将文章id与用户id组成一个key存储一个值在改键中,然后存储到redis中,当用户在前端点击点赞按钮的时候,我们通过查询redis中存在不存在改键值对来判断用户是否点过赞,如果redis中查询的到信息则说明用户之前已经点过赞了,再次点击就是取消点赞,即要删除redis中的对应键值对,并将改文章的点赞数减一

代码

Controller层代码

 /*防止重复点赞*/
    /*PUT /comment/thumb/{id}*/
    @RequestMapping(value = "/thumbup/{commentid}",method = RequestMethod.PUT)
    public Result thumbup2(@PathVariable String commentid){
        //把用户点赞信息保存到Redis中
        //每次点赞之前,先查询用户点赞信息
        //如果没有点赞信息,用户可以点赞
        //如果有点赞信息,用户不能重复点赞
        /*模拟获取到了的用户id*/
        String userid="123";
       /* 通过redis查询数据如果redis中查询的到数据则说明已经点赞过了*/
        Object result= redisTemplate.opsForValue().get("thumbup_" + userid + "_" + commentid);
        /*如果result为null则调用commentservice方法来进行点赞*/
        if (result==null){
            commentService.thumbup(commentid);
           /* 保存对应的点赞信息*/
            redisTemplate.opsForValue().set("thumbup_" + userid + "_" + commentid,1);
            return new Result(true, StatusCode.OK,"点赞成功");
        } else {
            /*设置点赞数为0*/
            commentService.canclethumbup(commentid);
          /*如果不为空则则设置为取消点赞,从redis中删除该条记录即可*/
            redisTemplate.delete("thumbup_" + userid + "_" + commentid);
            return new Result(true,StatusCode.OK,"已经取消点赞");
        }
    }

Service层的点赞与取消点赞代码

点赞也涉及到线程安全的问题这里我们使用mongodb的inc方法来解决线程安全的问题,因为mongodb是线程的安全的

 public void canclethumbup(String id){
       /*修改条件*/
        Query query = new Query();
        /*即修改_id值为id的文档*/
        query.addCriteria(Criteria.where("_id").is(id));
        /*修改数据*/
        Update update = new Update();
        /*key为对应的文档名称,后者为对应的加减值*/
        update.inc("thumbup",-1);
        /*执行操作*/
        mongoTemplate.updateFirst(query,update,"comment");
    }

    public void thumbup(String id) {
      /*  *//*方法1:缺点不可以解决并发的问题*//*
        Comment comment = commentRepository.findById(id).get();
        *//*修改点赞数*//*
        comment.setThumbup(comment.getThumbup()+1);
        *//*执行操作*//*
        commentRepository.save(comment)*/

        /*方法二执行并发操作*/
        /*修改条件*/
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        /*修改的数据*/
        Update update = new Update();
        /*mongodb支持线程安全所以调用其原装的方法,就不会导致线程不安全的问题*/
        /*使用列值增长*/
        update.inc("thumbup",1);

        //直接修改数据
        //第一个参数是修改的条件
        //第二个参数是修改的数值
        //第三个参数是MongoDB的集合名称
        mongoTemplate.updateFirst(query,update,"comment");

    }

猜你喜欢

转载自blog.csdn.net/pjh88/article/details/115270990
今日推荐