実際のプロジェクト開発では、Redisを使用して、繰り返すことができない記事やコメントを実装します。

実際のプロジェクト開発では、Redisを使用して、繰り返すことができない記事やコメントを実装します。

ビジネスシーン

いいねは私たちの生活のいたるところにあると言えます。QQスペースのように、友達の輪のように、見栄えの良い記事を見て、彼にいいねを与えるための承認を示し、誤ってクリックしたり、いいねをキャンセルしたりすることもできます。

ここに画像の説明を挿入

ここに画像の説明を挿入

実装コード

実装ロジック

記事はデータテーブルに保存されます。記事には対応するIDが必要であり、ユーザーにも対応するIDが必要です。記事IDとユーザーIDはキーを形成し、変更キーに値を保存してから、 redis。ユーザーがフロントエンドをクリックしたとき「いいね」ボタンがクリックされたとき、redisにキーと値のペアがあるかどうかをチェックして、ユーザーがそれを気に入ったかどうかを判断します。redisで照会された情報が見つかった場合は、ユーザーは以前にそれを高く評価しています。もう一度クリックすると、「いいね」をキャンセルします。つまり、redisで対応するキーと値のペアを削除し、変更された記事の「いいね」の数を1つ減らします。

コード

コントローラーレイヤーコード

 /*防止重复点赞*/
    /*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,"已经取消点赞");
        }
    }

サービスレイヤーのコードとは異なり、

Likesにはスレッドセーフの問題も含まれます。mongodbはスレッドセーフであるため、ここではmongodbのincメソッドを使用してスレッドセーフの問題を解決します。

 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