本文是基于redis
实现的热搜榜
的解决方案,数据库方案可自行设计。不多说,直接上代码吧,仅供参考。若大家还有其他的方案,欢迎在评论区留言交流。
下面列举一个使用有序集合
实现的简单热搜榜
示例:
# zIncrBy keywords 1 key 集合keywords中成员'key'搜索次数+1
redis 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 -1
1) "php"
2) "python"
3) "mysql"
4) "golang"
#从高到底返回集合内全部成员并显示搜索次数`score`
redis 127.0.0.1:6379> zRevRange keywords 0 -1 withscores
1) "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);