当前位置:   article > 正文

thinkphp redis实现文章点赞功能并异步入mysql_php 点赞异步更新数据库

php 点赞异步更新数据库

mysql 和redis实现点赞功能

点赞是非常常见的功能,普通mysql也可以实现,但遇到高并发性能不是很好,目前好的方式是利用redis缓存来实现,从而减轻数据库压力。

news_user_like_set_{$news_id} 集合用来存放该文章下点赞用户的`id`。

news_user_like_{$news_id}_{$user_id}  HASH用来存放点赞记录,如点赞状态,点赞时间,更新点赞时间,用户ID,文章ID等。

news_{$counts}_counts  用来记录redis中文章的点赞数量,点赞加1,取消点赞减1。

list_news  列表用来存放news_id队列数据。

流程:

1.当客户端触发点赞是user_id news_id zan_type 发送服务器。(说明:我的需求里面有文章点赞,评论点赞,词条点赞,所以要有一个类型标注下

2.服务器拿到参数去redis 查询是否有news_user_like_{$news_id}_{$user_id} 

redis 有,则得到的状态取反 没有则去mysql查 ,mysql 有,得到状态取反,没有则redis新增一个news_user_like_{$news_id}_{$user_id} ,点赞状态设置1

3.根据点赞状态给news_{$counts}_counts  加一或减一

4.把user_id 加入news_user_like_set_{$news_id}

5.把news_id加入 list_news  队列 返回文章点赞数和当前点赞状态

 

看不懂上面的就看贴的代码,不懂可以评论区提问,看到会解答

 

  1. <?php
  2. namespace app\news\controller;
  3. use app\login\model\News;
  4. use think\facade\Cache;
  5. use think\facade\Db;
  6. /**
  7. * Class LikeCount
  8. * @package app\news\controller
  9. * 点赞类
  10. */
  11. class LikeCount extends News
  12. {
  13. private $redis = null;
  14. private $user_id;//用户id
  15. private $news_id;//文章id
  16. private $status;//点赞状态
  17. private $news_set;//集合存放所有点赞的文章ID
  18. private $news_user_like;//hash存放用户点赞记录
  19. private $news_user_like_set;//集合存放该文章下点赞用户ID
  20. private $list_news;//队列存放news_id
  21. private $news_counts;//文章点赞数
  22. private $time;
  23. private $zan_type;
  24. public function __construct()
  25. {
  26. $this->redis = Cache::store('redis');
  27. $this->news_set = 'news_set';
  28. $this->list_news = 'list_news';
  29. }
  30. /**
  31. * 点赞操作
  32. *
  33. * 点赞数据存在hash中,每个用户点赞信息存一个hash
  34. * 集合set存储当前文章下的点赞用户,news_user_like_set_{news_id}
  35. * news_{news_id}_counts 存储的点赞数
  36. * 队列 list_news 存储的是文章id
  37. *
  38. * 1.redis获取点赞信息news_user_like_{news_id}_{user_id},得到点赞状态
  39. * 2.如上面没获取到,mysql查询获取点赞信息,得到点赞状态,都没有说明当前用户未点赞过,设置状态为1
  40. * 3.存储点赞信息,如redis有点赞信息,则更新hash的update_time和status字段,没有新增hash信息,news_id,user_id,zan_type,create_time,update_time,status
  41. * 4.存储文章下的点赞用户id到集合set
  42. * 5.更新点赞数,根据点赞状态判断,0 取消点赞-1 1点赞+1
  43. * 6.存储news_id到队列
  44. * 7.返回点赞数 redis+mysql
  45. *
  46. * @param string $user_id 用户id
  47. * @param string $news_id 文章id
  48. * @param int $zan_type 点赞类型
  49. * @return bool
  50. */
  51. public function giveFavour($user_id = '', $news_id = '', $zan_type = 0)
  52. {
  53. $user_id = 1;
  54. $news_id = 754395;
  55. $zan_type = 1;
  56. if (empty($user_id) ||
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/285060
推荐阅读
相关标签
  

闽ICP备14008679号