実際のプロジェクト開発では、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");
}