PHP+Redis怎么实现点赞效果

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

本文主要介绍“PHP Redis如何达到好评效果”。在日常操作中,相信很多人对PHP Redis是如何达到点赞效果有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮助大家解答“PHP Redis如何达到好评效果”的疑惑!接下来,请和边肖一起学习!

前言

其实赞美是一个很有趣的功能。基本设计思路有两个,一个是mysql(几百行代码还没写,有毒)。

数据库直接存储在地面上,另一种是利用受到好评的业务特性扔进redis(或者memcache),然后离线刷回mysql。

这里说的功能都是基于我之前的项目,所以有些地方可以忽略。我主要记录这个功能的实现思路。当你理解它的时候,无论你想写什么语言,它基本上都是一样的。

直接写入Mysql

直接写Mysql是最简单的方法。

做三张桌子,

注释信息

记录文章的主要内容是like _ count、仇恨_ count和score,这是我们函数的主要字段。

类似评论

记录一篇文章被点赞的次数,有多少人点赞这个数据可以直接从表格中找到;

用户喜欢的评论

记录用户点赞了哪些文章,当你打开文章列表时,你点赞与否的数据都会显示在里面;

缺点

数据库读写压力大。

热门文章会受到很多用户的好评,即使是短时间内。从长远来看,直接操作数据库并不理想。

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

redis的主要特点是速度快。毕竟主要数据在内存中。

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

下面将详细介绍这些类型。

优点

高性能

缓解数据库读写压力

其实我更关心的是缓解写压力和真正的读压力,这个问题可以通过mysql主从甚至增加redis来缓存热数据来解决。

写作压力对之前的方案真的不好。

缺点

复杂开发

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

数据安全无法保证。

redis挂机时,数据会丢失,redis中的数据不会及时同步,更换redis内存时可能会被淘汰。

但是,对于我们的赞美,丢失一点数据并不是什么大问题;

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

设计功能前知识准备

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

这种类型的zset主要用于排序或增加或减少数字。它在这里被用作喜欢和讨厌的数字记录,以及热度记录。

这个set是一个无序的集合,主要用来记录今天是否有必要更新,记录今天被赞的文章(包括一些讨厌的)的id,以便在晚上或者及时更新这部分数据。

这个hash是一个散列,主要用于存储数据和索引。这是用来记录用户对哪篇文章点了什么,方便下一步判断(我在网上看到过一些用set来记录的介绍,那是可以的,但是我觉得这样节省了更多的空间,管理起来也方便,哈希也快)。

list是排队的老大。我们的数据

rong>安全 回到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.     * @param int $user_id 用户id


  21.     * @param int $type 点击的类型 1.点like,2.点hate


  22.     * @param int $comment_id 文章id


  23.     * @return string json;


  24.     */


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


  26.     {


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


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


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


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


  31.         {


  32.             //已经存在


  33.             //判断点的是什么


  34.             if($type==1)


  35.             {


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


  37.                 //redis hash-> hget()


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


  39.                 if(!$rel)


  40.                 {


  41.                     //什么都没点过


  42.                     //点赞加1


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


  44.                     //增加分数


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


  46.                     //记录上次操作


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



  48.                     $data = array(


  49.                         "state" => 1,


  50.                         "status" => 200,


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


  52.                     );


  53.                 }


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


  55.                 {


  56.                     //点过赞了


  57.                     //点赞减1


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


  59.                     //增加分数


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


  61.                     $data = array(


  62.                         "state" => 2,


  63.                         "status" => 200,


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


  65.                     );


  66.                 }


  67.                 else if($rel==2)


  68.                 {


  69.                     //点过hate


  70.                     //hate减1


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


  72.                     //增加分数


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


  74.                     //点赞加1


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


  76.                     //记录上次操作


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



  78.                     $data = array(


  79.                         "state" => 3,


  80.                         "status" => 200,


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


  82.                     );


  83.                 }


  84.             }


  85.             else if($type==2)


  86.             {


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


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


  89.                 if(!$rel)


  90.                 {


  91.                     //什么都没点过


  92.                     //点hate加1


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


  94.                     //减分数


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


  96.                     //记录上次操作


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



  98.                     $data = array(


  99.                         "state" => 4,


  100.                         "status" => 200,


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


  102.                     );


  103.                 }


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


  105.                 {


  106.                     //点过hate了


  107.                     //点hate减1


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


  109.                     //增加分数


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



  111.                     $data = array(


  112.                         "state" => 5,


  113.                         "status" => 200,


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


  115.                     );


  116.                     return $data;


  117.                 }


  118.                 else if($rel==2)


  119.                 {


  120.                     //点过like


  121.                     //like减1


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


  123.                     //增加分数


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


  125.                     //点hate加1


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



  127.                     $data = array(


  128.                         "state" => 6,


  129.                         "status" => 200,


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


  131.                     );


  132.                     return $data;


  133.                 }


  134.             }


  135.         }


  136.         else


  137.         {


  138.             //未存在


  139.             if($type==1)


  140.             {


  141.                 //点赞加一


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


  143.                 //分数增加


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


  145.                 $data = array(


  146.                     "state" => 7,


  147.                     "status" => 200,


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


  149.                 );


  150.             }


  151.             else if($type==2)


  152.             {


  153.                 //点hate加一


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


  155.                 //分数减少


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



  157.                 $data = array(


  158.                     "state" => 8,


  159.                     "status" => 200,


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


  161.                 );


  162.             }


  163.             //记录


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


  165.         }



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


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



  168.         return $data;


  169.     }



  170.     public function ifUploadList($comment_id)


  171.     {


  172.         date_default_timezone_set("Asia/Shanghai");


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



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


  175.         {


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


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


  178.             //更新到队列


  179.             $data = array(


  180.                 "id" => $comment_id,


  181.                 "time" => $time,


  182.             );


  183.             $json = json_encode($data);


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


  185.         }


  186.     }

  187. }


  188. //调用

  189. $user_id = 100;

  190. $type = 1;

  191. $comment_id= 99;

  192. $good = new Good();

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

  194. var_dump($rel);

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

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/127528.html

(0)

相关推荐

  • Sentinel动态数据源架构设计理念与改造实践是怎么样的

    技术Sentinel动态数据源架构设计理念与改造实践是怎么样的今天就跟大家聊聊有关Sentinel动态数据源架构设计理念与改造实践是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根

    攻略 2021年10月21日
  • 文与可,文财神和武财神可以一起供奉吗

    技术文与可,文财神和武财神可以一起供奉吗文武财神是绝对不可以放在一起供奉的。民间供奉文财神的讲究:一文与可、文财神一定要供奉在吉位供奉文财神,一定要选择家中的吉位。自己无法确定的话,最好请专家老师实地勘察,或者根据户型图

    生活 2021年10月26日
  • 冬天来了写一段话,冬天的早晨真冷呀写一段话

    技术冬天来了写一段话,冬天的早晨真冷呀写一段话早上,冬天的风啊,真讨厌,我只开着一扇窗户,它就拼命的往我房间里钻,惊醒了我这个小懒虫冬天来了写一段话。我伸了伸懒腰,打了个哈欠,说:冬天啊真冷,恨不得整天睡大觉。虽然我已经

    生活 2021年10月27日
  • 租用香港服务器从事游戏相关业务有什么好处

    技术租用香港服务器从事游戏相关业务有什么好处香港服务器提供了部署所需游戏的灵活性和能力。它可以多方面提升游戏体验,并通过丰富的资源为您的服务器提供更好的安全性,因为您是独享硬件配置的。这可能解释了为什么现代游戏玩家和主播

    礼包 2021年12月21日
  • Mysql索引失效的解决方法

    技术Mysql索引失效的解决方法小编给大家分享一下Mysql索引失效的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!背景6千万数据量的

    攻略 2021年11月2日
  • JBuilder下调试java程序的示例分析

    技术JBuilder下调试java程序的示例分析JBuilder下调试java程序的示例分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。初学者总问如何

    攻略 2021年12月2日