项目开发实际之用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");
}
标签:comment,thumbup,Redis,之用,redis,点赞,commentid,id 来源: https://blog.csdn.net/pjh88/article/details/115270990