本文主要介绍“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当然也会减去相应的数字。
-
<?php
-
-
class Good
-
{
-
public $redis = null; -
-
//60*60*24/20=4320,每个点赞得到的分数,反之即之。 -
public $score = 4320; -
-
//点赞增加数,或者点hate增加数 -
public $num = 1; -
-
//init redis -
public $redis_host = "127.0.0.1"; -
public $redis_port = "6379"; -
public $redis_pass = ""; -
-
public function __construct() -
{ -
$this->redis = new Redis(); -
$this->redis->connect($this->redis_host,$this->redis_port); -
$this->reids->auth($this->redis_pass); -
} -
-
/** -
* @param int $user_id 用户id -
* @param int $type 点击的类型 1.点like,2.点hate -
* @param int $comment_id 文章id -
* @return string json; -
*/ -
public function click($user_id,$type,$comment_id) -
{ -
//判断redis是否已经缓存了该文章数据 -
//使用:分隔符对redis管理是友好的 -
//这里使用redis zset-> zscore()方法 -
if($this->redis->zscore("comment:like",$comment_id)) -
{ -
//已经存在 -
//判断点的是什么 -
if($type==1) -
{ -
//判断以前是否点过,点的是什么? -
//redis hash-> hget() -
$rel = $this->redis->hget("comment:record",$user_id.":".$comment_id); -
if(!$rel) -
{ -
//什么都没点过 -
//点赞加1 -
$this->redis->zincrby("comment:like",$this->num,$comment_id); -
//增加分数 -
$this->redis->zincrby("comment:score",$this->score,$comment_id); -
//记录上次操作 -
$this->redis->hset("comment:record",$user_id.":".$comment_id,$type); -
-
$data = array( -
"state" => 1, -
"status" => 200, -
"msg" => "like+1", -
); -
} -
else if($rel==$type) -
{ -
//点过赞了 -
//点赞减1 -
$this->redis->zincrby("comment:like",-($this->num),$comment_id); -
//增加分数 -
$this->redis->zincrby("comment:score",-($this->score),$comment_id); -
$data = array( -
"state" => 2, -
"status" => 200, -
"msg" => "like-1", -
); -
} -
else if($rel==2) -
{ -
//点过hate -
//hate减1 -
$this->redis->zincrby("comment:hate",-($this->num),$comment_id); -
//增加分数 -
$this->redis->zincrby("comment:score",$this->score+$this->score,$comment_id); -
//点赞加1 -
$this->redis->zincrby("comment:like",$this->num,$comment_id); -
//记录上次操作 -
$this->redis->hset("comment:record",$user_id.":".$comment_id,$type); -
-
$data = array( -
"state" => 3, -
"status" => 200, -
"msg" => "like+1", -
); -
} -
} -
else if($type==2) -
{ -
//点hate和点赞的逻辑是一样的。参看上面的点赞 -
$rel = $this->redis->hget("comment:record",$user_id.":".$comment_id); -
if(!$rel) -
{ -
//什么都没点过 -
//点hate加1 -
$this->redis->zincrby("comment:hate",$this->num,$comment_id); -
//减分数 -
$this->redis->zincrby("comment:score",-($this->score),$comment_id); -
//记录上次操作 -
$this->redis->hset("comment:record",$user_id.":".$comment_id,$type); -
-
$data = array( -
"state" => 4, -
"status" => 200, -
"msg" => "hate+1", -
); -
} -
else if($rel==$type) -
{ -
//点过hate了 -
//点hate减1 -
$this->redis->zincrby("comment:hate",-($this->num),$comment_id); -
//增加分数 -
$this->redis->zincrby("comment:score",$this->score,$comment_id); -
-
$data = array( -
"state" => 5, -
"status" => 200, -
"msg" => "hate-1", -
); -
return $data; -
} -
else if($rel==2) -
{ -
//点过like -
//like减1 -
$this->redis->zincrby("comment:like",-($this->num),$comment_id); -
//增加分数 -
$this->redis->zincrby("comment:score",-($this->score+$this->score),$comment_id); -
//点hate加1 -
$this->redis->zincrby("comment:hate",$this->num,$comment_id); -
-
$data = array( -
"state" => 6, -
"status" => 200, -
"msg" => "hate+1", -
); -
return $data; -
} -
} -
} -
else -
{ -
//未存在 -
if($type==1) -
{ -
//点赞加一 -
$this->redis->zincrby("comment:like",$this->num,$comment_id); -
//分数增加 -
$this->redis->zincrby("comment:score",$this->score,$comment_id); -
$data = array( -
"state" => 7, -
"status" => 200, -
"msg" => "like+1", -
); -
} -
else if($type==2) -
{ -
//点hate加一 -
$this->redis->zincrby("comment:hate",$this->num,$comment_id); -
//分数减少 -
$this->redis->zincrby("comment:score",-($this->score),$comment_id); -
-
$data = array( -
"state" => 8, -
"status" => 200, -
"msg" => "hate+1", -
); -
} -
//记录 -
$this->redis->hset("comment:record",$user_id.":".$comment_id,$type); -
} -
-
//判断是否需要更新数据 -
$this->ifUploadList($comment_id); -
-
return $data; -
} -
-
public function ifUploadList($comment_id) -
{ -
date_default_timezone_set("Asia/Shanghai"); -
$time = strtotime(date('Y-m-d H:i:s')); -
-
if(!$this->redis->sismember("comment:uploadset",$comment_id)) -
{ -
//文章不存在集合里,需要更新 -
$this->redis->sadd("comment:uploadset",$comment_id); -
//更新到队列 -
$data = array( -
"id" => $comment_id, -
"time" => $time, -
); -
$json = json_encode($data); -
$this->redis->lpush("comment:uploadlist",$json); -
} -
} -
}
-
-
//调用
-
$user_id = 100;
-
$type = 1;
-
$comment_id= 99;
-
$good = new Good();
-
$rel = $good->click($user_id,$type,$comment_id);
-
var_dump($rel);
到此,关于“PHP+Redis怎么实现点赞效果”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/127528.html