广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP+Redis怎么实现点赞效果
  • 610
分享到

PHP+Redis怎么实现点赞效果

2023-06-04 10:06:04 610人浏览 薄情痞子
摘要

这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在php+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP+Redis怎么实现点赞效果”的疑惑有所

这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在php+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP+Redis怎么实现点赞效果”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言

点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql(写了几百行的代码都还没写完,有毒)啦

数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回Mysql等。

我这里所讲的功能都是基于我之前的项目去说的,所以有些地方可以不用管的,我主要是记录这个功能的实现思路,当你理解了,基本想用什么鬼语言写都一样的。

直接写入mysql

直接写入Mysql是最简单的做法。

做三个表即可,

  • comment_info

    记录文章的主要内容,主要有like_count,hate_count,score这三个字段是我们本次功能的主要字段。

  • comment_like

    记录文章被赞的次数,已有多少人赞过这种数据就可以直接从表中查到;

  • user_like_comment

    记录用户赞过了哪些文章, 当打开文章列表时,显示的有没有赞过的数据就在这里面;

缺点

  • 数据库读写压力大

    热门文章会有很多用户点赞,甚至是短时间内被大量点赞, 直接操作数据库从长久来看不是很理想的做法

redis存储随后批量刷回数据库

redis主要的特点就是快, 毕竟主要数据都在内存嘛;

另外为啥我选择redis而不是memcache的主要原因在于redis支持更多的数据类型, 例如hash, set, zset等。

下面具体的会用到这几个类型。

优点

  • 性能高

  • 缓解数据库读写压力

    其实我更多的在于缓解写压力, 真的读压力, 通过mysql主从甚至通过加入redis对热点数据做缓存都可以解决,

    写压力对于前面的方案确实是不大好使。

缺点

  • 开发复杂

    这个比直接写mysql的方案要复杂很多, 需要考虑的地方也很多;

  • 不能保证数据安全

    redis挂掉的时候会丢失数据, 同时不及时同步redis中的数据, 可能会在redis内存置换的时候被淘汰掉;

    不过对于我们点赞而已, 稍微丢失一点数据问题不大;

其实上面第二点缺点是可以避免的,这就涉及到redis 的一些设计模式,不懂没关系,我尽量详细的写,后面我会给出如何解决这个缺点。

设计功能前知识准备

  1.将要用到的redis数据类型(具体的类型说明,请看底部链接,有详细说明):

  • zset  这个类型主要用来做排序或者数字的增减,这里被用作like 和hate的数字记录,以及热度的记录。

  • set  这个是无序集合,主要用来记录今天需不需要更新,将今天被点赞(包括点讨厌)过的文章id记录下来,方便晚上或者有时间对这部分数据更新。

  • hash  这个是散列,主要用来存储数据以及索引。这里被用来记录用户对哪个文章点了什么,方便下次判断(我看过一些网上的介绍使用set来记录,那个也可以,但是本人觉得这样做更省空间,以及方便管理,再有就是hash的速度快)。

  • list  这个是队列大佬,我们的数据能不能 安全 回到mysql就靠它了。

  2.关于热度如何去判断:

  大家都知道,文章获得点赞数越高,文章的热度就越高,那么怎么判断呢?不就直接记录点赞数就行啦,但是对于最新的文章怎么办?例如有一篇文章一年前发布的,获得50个赞,有篇最新文章获得49个赞,但是按照上面所说的一年前的文章热度还比最新的高,这就不合理了,文章都是时效性,谁都想看最新最热的。

  so!我们要换个方法去处理这个时效性,绝大部分语言都有 时间戳 生成的方法,时间戳随着时间越新,数字越大,直接将时间戳初始化赋值给文章的score,这样最新的文章相比以前的文章就会靠前了。接着是点赞对score的影响,我们假设一天得到20个赞算是一天最热,一天60*60*24=86400秒,然后得到一个赞就是得到86400 / 20 = 4320分。具体数字看自己的业务需求定,我只是举例子而已。点hate当然也会减去相应的数字。

  1. <?php


  2. class Good

  3. {

  4.     public $redis = null;


  5.     //60*60*24/20=4320,每个点赞得到的分数,反之即之。

  6.     public $score = 4320;


  7.     //点赞增加数,或者点hate增加数

  8.     public $num = 1;


  9.     //init redis

  10.     public $redis_host = "127.0.0.1";

  11.     public $redis_port = "6379";

  12.     public $redis_pass = "";


  13.     public function __construct()

  14.     {

  15.         $this->redis = new Redis();

  16.         $this->redis->connect($this->redis_host,$this->redis_port);

  17.         $this->reids->auth($this->redis_pass);

  18.     }


  19.     

  20.     public function click($user_id,$type,$comment_id)

  21.     {

  22.         //判断redis是否已经缓存了该文章数据

  23.         //使用:分隔符对redis管理是友好的

  24.         //这里使用redis zset-> zscore()方法

  25.         if($this->redis->zscore("comment:like",$comment_id))

  26.         {

  27.             //已经存在

  28.             //判断点的是什么

  29.             if($type==1)

  30.             {

  31.                 //判断以前是否点过,点的是什么?

  32.                 //redis hash-> hget()

  33.                 $rel = $this->redis->hget("comment:record",$user_id.":".$comment_id);

  34.                 if(!$rel)

  35.                 {

  36.                     //什么都没点过

  37.                     //点赞加1

  38.                     $this->redis->zincrby("comment:like",$this->num,$comment_id);

  39.                     //增加分数

  40.                     $this->redis->zincrby("comment:score",$this->score,$comment_id);

  41.                     //记录上次操作

  42.                     $this->redis->hset("comment:record",$user_id.":".$comment_id,$type);


  43.                     $data = array(

  44.                         "state" => 1,

  45.                         "status" => 200,

  46.                         "msg" => "like+1",

  47.                     );

  48.                 }

  49.                 else if($rel==$type)

  50.                 {

  51.                     //点过赞了

  52.                     //点赞减1

  53.                     $this->redis->zincrby("comment:like",-($this->num),$comment_id);

  54.                     //增加分数

  55.                     $this->redis->zincrby("comment:score",-($this->score),$comment_id);

  56.                     $data = array(

  57.                         "state" => 2,

  58.                         "status" => 200,

  59.                         "msg" => "like-1",

  60.                     );

  61.                 }

  62.                 else if($rel==2)

  63.                 {

  64.                     //点过hate

  65.                     //hate减1

  66.                     $this->redis->zincrby("comment:hate",-($this->num),$comment_id);

  67.                     //增加分数

  68.                     $this->redis->zincrby("comment:score",$this->score+$this->score,$comment_id);

  69.                     //点赞加1

  70.                     $this->redis->zincrby("comment:like",$this->num,$comment_id);

  71.                     //记录上次操作

  72.                     $this->redis->hset("comment:record",$user_id.":".$comment_id,$type);


  73.                     $data = array(

  74.                         "state" => 3,

  75.                         "status" => 200,

  76.                         "msg" => "like+1",

  77.                     );

  78.                 }

  79.             }

  80.             else if($type==2)

  81.             {

  82.                 //点hate和点赞的逻辑是一样的。参看上面的点赞

  83.                 $rel = $this->redis->hget("comment:record",$user_id.":".$comment_id);

  84.                 if(!$rel)

  85.                 {

  86.                     //什么都没点过

  87.                     //点hate加1

  88.                     $this->redis->zincrby("comment:hate",$this->num,$comment_id);

  89.                     //减分数

  90.                     $this->redis->zincrby("comment:score",-($this->score),$comment_id);

  91.                     //记录上次操作

  92.                     $this->redis->hset("comment:record",$user_id.":".$comment_id,$type);


  93.                     $data = array(

  94.                         "state" => 4,

  95.                         "status" => 200,

  96.                         "msg" => "hate+1",

  97.                     );

  98.                 }

  99.                 else if($rel==$type)

  100.                 {

  101.                     //点过hate了

  102.                     //点hate减1

  103.                     $this->redis->zincrby("comment:hate",-($this->num),$comment_id);

  104.                     //增加分数

  105.                     $this->redis->zincrby("comment:score",$this->score,$comment_id);


  106.                     $data = array(

  107.                         "state" => 5,

  108.                         "status" => 200,

  109.                         "msg" => "hate-1",

  110.                     );

  111.                     return $data;

  112.                 }

  113.                 else if($rel==2)

  114.                 {

  115.                     //点过like

  116.                     //like减1

  117.                     $this->redis->zincrby("comment:like",-($this->num),$comment_id);

  118.                     //增加分数

  119.                     $this->redis->zincrby("comment:score",-($this->score+$this->score),$comment_id);

  120.                     //点hate加1

  121.                     $this->redis->zincrby("comment:hate",$this->num,$comment_id);


  122.                     $data = array(

  123.                         "state" => 6,

  124.                         "status" => 200,

  125.                         "msg" => "hate+1",

  126.                     );

  127.                     return $data;

  128.                 }

  129.             }

  130.         }

  131.         else

  132.         {

  133.             //未存在

  134.             if($type==1)

  135.             {

  136.                 //点赞加一

  137.                 $this->redis->zincrby("comment:like",$this->num,$comment_id);

  138.                 //分数增加

  139.                 $this->redis->zincrby("comment:score",$this->score,$comment_id);

  140.                 $data = array(

  141.                     "state" => 7,

  142.                     "status" => 200,

  143.                     "msg" => "like+1",

  144.                 );

  145.             }

  146.             else if($type==2)

  147.             {

  148.                 //点hate加一

  149.                 $this->redis->zincrby("comment:hate",$this->num,$comment_id);

  150.                 //分数减少

  151.                 $this->redis->zincrby("comment:score",-($this->score),$comment_id);


  152.                 $data = array(

  153.                     "state" => 8,

  154.                     "status" => 200,

  155.                     "msg" => "hate+1",

  156.                 );

  157.             }

  158.             //记录

  159.             $this->redis->hset("comment:record",$user_id.":".$comment_id,$type);

  160.         }


  161.         //判断是否需要更新数据

  162.         $this->ifUploadList($comment_id);


  163.         return $data;

  164.     }


  165.     public function ifUploadList($comment_id)

  166.     {

  167.         date_default_timezone_set("Asia/Shanghai");

  168.         $time = strtotime(date('Y-m-d H:i:s'));


  169.         if(!$this->redis->sismember("comment:uploadset",$comment_id))

  170.         {

  171.             //文章不存在集合里,需要更新

  172.             $this->redis->sadd("comment:uploadset",$comment_id);

  173.             //更新到队列

  174.             $data = array(

  175.                 "id" => $comment_id,

  176.                 "time" => $time,

  177.             );

  178.             $JSON = json_encode($data);

  179.             $this->redis->lpush("comment:uploadlist",$json);

  180.         }

  181.     }

  182. }


  183. //调用

  184. $user_id = 100;

  185. $type = 1;

  186. $comment_id= 99;

  187. $good = new Good();

  188. $rel = $good->click($user_id,$type,$comment_id);

  189. var_dump($rel);

到此,关于“PHP+Redis怎么实现点赞效果”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: PHP+Redis怎么实现点赞效果

本文链接: https://www.lsjlt.com/news/237510.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP+Redis怎么实现点赞效果
    这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在PHP+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP+Redis怎么实现点赞效果”的疑惑有所...
    99+
    2023-06-04
  • Redis高效实现点赞、取消点赞的步骤
    本篇内容主要讲解“Redis高效实现点赞、取消点赞的步骤”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis高效实现点赞、取消点赞的步骤”吧!一、Redis...
    99+
    2022-10-18
  • Android怎么实现点赞动画效果
    今天小编给大家分享一下Android怎么实现点赞动画效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言对接下来功能实...
    99+
    2023-06-29
  • Redis中怎么实现点赞、取消点赞功能
    Redis中怎么实现点赞、取消点赞功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Redis 缓存设计及实现1.1 Redis 安装及运...
    99+
    2022-10-18
  • Flutter实现抖音点赞效果
    目录效果图如下:分析效果思路实现1.对外公开的参数2.声明需要的对象3.手势的处理4.动画小红心的布局5.小红心动效使用效果源码效果图如下: 分析效果 1.整个控件可以点击,控件...
    99+
    2022-11-12
  • CSS如何实现点赞效果心形效果
    小编给大家分享一下CSS如何实现点赞效果心形效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! CSS实现点赞效果心形效果 <!DOCTYPE html> <htm...
    99+
    2022-10-19
  • 怎么利用Redis实现点赞功能
    这篇文章主要介绍“怎么利用Redis实现点赞功能”,在日常操作中,相信很多人在怎么利用Redis实现点赞功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用Redis实现点赞功能”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • iOS实现抖音点赞动画效果
    本文实例为大家分享了iOS实现抖音点赞动画的具体代码,供大家参考,具体内容如下 1. 概述 最近看到抖音点赞爱心的动画效果比较好,出于好奇,自己也研究仿照动画效果写了一个,不喜欢的朋...
    99+
    2022-05-31
    iOS 抖音 点赞
  • Spring Cloud中怎么使用Redis实现点赞和取消点赞功能
    Spring Cloud中怎么使用Redis实现点赞和取消点赞功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Redis 缓存设计及实现...
    99+
    2022-10-18
  • 百万用户量redis点赞怎么实现
    要实现百万用户量的Redis点赞功能,可以使用Redis的有序集合(Sorted Set)数据结构来实现。首先,需要为每个被点赞的对...
    99+
    2023-09-04
    redis
  • AndroidFlutter实现点赞效果的示例代码
    目录前言绘制小手完整源码前言 点赞这个动作不得不说在社交、短视频等App中实在是太常见了,当用户手指按下去的那一刻,给用户一个好的反馈效果也是非常重要的,这样用户点起赞来才会有一种强...
    99+
    2022-11-13
  • 使用Vue transition 实现点赞动画效果
    要实现点赞动画效果,你可以使用Vue的过渡(transition)组件。下面是一个简单的示例代码:```html<templa...
    99+
    2023-09-21
    Vue
  • 通过JetpackCompose实现双击点赞动画效果
    目录实现步骤先红色画个爱心点击事件加动画完整代码效果图实现步骤 先红色画个爱心 Icon( Icons.Filled.Favorite, "爱心", Modi...
    99+
    2022-11-13
  • Vue transition实现点赞动画效果的示例
    目录效果一览爱心效果 数字滚动动画 点赞动画 效果一览 爱心效果 材料:爱心图标两个,没有我这种 icon 组件的用 png 图片代替 <transition :nam...
    99+
    2022-11-12
  • Android项目开发 教你实现Periscope点赞效果
    现在视频应用越来越火,Periscope火起来后,国内也出现了不少跟风者,界面几乎跟Periscope一模一样.Periscope确实不错,点赞的效果也让人眼前一亮,很漂亮,于...
    99+
    2022-06-06
    Android
  • Android实现仿今日头条点赞动画效果实例
    目录一、前言二、需求拆分三、实现方案1、点赞控件触摸事件处理2、点赞动画的实现2.1、点赞效果图片的获取和存储管理2.2、点赞表情图标动画实现2.3、点赞次数和点赞文案的绘制3、存放...
    99+
    2022-11-13
  • 如何通过Jetpack Compose实现双击点赞动画效果
    这篇文章主要介绍如何通过Jetpack Compose实现双击点赞动画效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实现步骤先红色画个爱心Icon(    Ico...
    99+
    2023-06-28
  • 利用Android实现一种点赞动画效果的全过程
    目录前言点击后的缩放效果拇指的散开效果示例总结前言 最近有个需求,需要仿照公司的H5实现一个游戏助手,其中一个点赞的按钮有动画效果,如下图: 分析一下这个动画,点击按钮后,拇指首先...
    99+
    2022-12-08
    android 点赞动画 android点赞效果 android点击动画
  • vue怎么实现静态页面点赞和取消点赞功能
    本文小编为大家详细介绍“vue怎么实现静态页面点赞和取消点赞功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现静态页面点赞和取消点赞功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下:点击...
    99+
    2023-06-29
  • Android Jetpack结构运用Compose实现微博长按点赞彩虹效果
    目录原版1. Compose 动画 API 概览2. 长按点赞动画分解3. 彩虹动画3.1 状态管理AnimatedRainbowanimatedRainbows 列表3.2 内容绘...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作