本文是基于redis实现的热搜榜的解决方案,数据库方案可自行设计。不多说,直接上代码吧,仅供参考。若大家还有其他的方案,欢迎在评论区留言交流
。
下面列举一个使用有序集合实现的简单热搜榜示例:
# zIncrBy keywords 1 key 集合keywords中成员'key'搜索次数+1redis 127.0.0.1:6379> zIncrBy keywords 1 php"1"redis 127.0.0.1:6379> zIncrBy keywords 1 mysql"1"redis 127.0.0.1:6379> zIncrBy keywords 1 python"1"redis 127.0.0.1:6379> zIncrBy keywords 1 golang"1"redis 127.0.0.1:6379> zIncrBy keywords 1 php"2"redis 127.0.0.1:6379> zIncrBy keywords 1 php"3"#从高到底返回集合内全部成员redis 127.0.0.1:6379> zRevRange keywords 0 -11) "php"2) "python"3) "mysql"4) "golang"#从高到底返回集合内全部成员并显示搜索次数`score`redis 127.0.0.1:6379> zRevRange keywords 0 -1 withscores1) "php"2) "3"3) "python"4) "1"5) "mysql"6) "1"7) "golang"8) "1"
看了上面的例子是不是觉得很简单,一个简单的热搜榜就完成了。
php中基于redis的有序集合SortedSet实现热搜榜方法
下面列举了排行榜中几个可能用到的有序集合方法,注释仅供参考,可能描述不太准确。
<?php/*** php redis SortedSet部分方法介绍* @author codehui admin@codehui.net* @link http://www.codehui.net* @data 2018-04-27*/class Redisdemo{var $redis;public function __construct($host, $port, $auth = ''){$obj = new Redis();$connect = $obj->connect($host, $port);if($connect){if($auth){$obj->auth($auth);}$this->redis = $obj;}else{exit("redis connect fail:" . $connect);}}/** 向有序集合添加一个或多个成员,或者更新已存在成员的score* @param string $key 集合名称* @param string $member 成员名称* @param int $score 值* return 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。*/public function zAdd($key, $score, $member){return $this->redis->zAdd($key, $score, $member);}/*** 返回有序集 key 中,指定区间内的成员。* @name zRange 递增排列* @name zRevRange 递减排列* @param string $key 集合名称* @param int $start 开始位置* @param int $end 结束位置 全部-1* @param boolean $withscores 返回成员score* @return array 集合列表*/public function zRange($key, $start, $end, $withscores = null ) {return $this->redis->zRange( $key, $start, $end, $withscores);}public function zRevRange($key, $start, $end, $withscores = null ) {return $this->redis->zRevRange( $key, $start, $end, $withscores);}/*** 获取集合中成员的score* @param string $key 集合名称* @param string $member 成员名称* @return string key成员 member 的 score 值*/public function zScore($key, $member) {return $this->redis->zScore( $key, $member );}/*** 关键词次数增量increment key不存在则自定ZADD* @param string $key 集合名称* @param int 增量* @param string $member 成员名称* @return string key成员 member 的新 score 值*/public function zIncrBy($key, $increment, $member) {return $this->redis->zIncrBy($key, $increment, $member);}/*** 返回有序集合的key的基数* @param string $key 集合名称* @return int 有序集合的基数*/public function zCard($key){return $this->redis->zCard($key);}}
使用方法
// 初始化redis$redis = new Redisdemo('127.0.0.1', 6379);// 接收搜索关键词$keywords = $_REQUEST['k'];// 定义集合键名称$key = 'keywords';// 集合中添加关键词,指定score值为1 若关键词存在则更新score$redis->zAdd($key, 1, $keywords);// 集合中关键词搜索次数+1 若关键词不存在则自动ZADD$redis->zIncrBy($key, 1, $keywords);// 从低到高显示集合中的全部成员$redis->zRange($key, 0, -1);// 从高到底显示前三名并显示score值$redis->zRevRange($key, 0, 2, true);// 获取集合中成员'php'的score值$redis->zScore($key, 'php');// 获取集合中全部成员的数量$redis->zCard($key);
