php 数组倒序_PHP+Redis有序集合(zset)实现博客园阅读排行榜功能

许多网站都有排行榜的功能,比如球员人气榜单、阅读排行榜,对于一些小网站,通过查数据库就能实现排行榜的功能,但是对于稍微有点用户量而且还是实时排名的网站,使用一些关系型数据库如(MySQL、Oracle)等来实现就有点力不从心了,而且对数据库的压力也很大,体验也不好,更好的选择是使用基于内存的非关系型数据库来做排名,其中Redis就是代表,Redis提供的有序集合(zset)非常适合做实时排行榜这个业务。

示例:今天我们就来使用PHP+Redis的zset来实现博客园网站的阅读排行榜功能,博客园的文章阅读排行榜页面如下

1585dc221a30456a08145be3660cf909.png

假设现在有8篇文章,文章ID分别是1101、1102、1103、1104、1105、1106、1107、1108,我们使用redis的有序集合(zset)的score作为阅读次数来记录每篇文章的阅读量,view_nums作为记录阅读量的key

现在,文章ID为1101、1102、1103、1104、1105、1106、1107、1108的文章分别被读者阅读了12次、245次、6次、99次、1267次、23次,456次,9999次

我们使用PHP代码来实现记录阅读次数,使用的是 zIncrBy() 方法

$redis = new Redis();
if (!$redis->connect('127.0.0.1', 6379)) {
trigger_error('Redis连接出错!!!', E_USER_ERROR);
} else {
echo '连接正常
';
}
//参数1: key(键)
//参数2: score(分数,本示例表示阅读量)
//参数3: member(成员,本示例表示文章ID)
$redis->zIncrBy('view_nums', 12, 1101);
$redis->zIncrBy('view_nums', 245, 1102);
$redis->zIncrBy('view_nums', 6, 1103);
$redis->zIncrBy('view_nums', 99, 1104);
$redis->zIncrBy('view_nums', 1267, 1105);
$redis->zIncrBy('view_nums', 23, 1106);
$redis->zIncrBy('view_nums', 456, 1107);
$redis->zIncrBy('view_nums', 9999, 1108);
$redis->close();

上面的这串代码应该放到文章详情页接口里,正常来说每次点击详情页score都应该加1,这里为了演示,一次就增加了很多数。

我们通过Redis Desktop Manager软件来查看目前的阅读量情况

59bacc1050944853bbe512d9ac46d494.png

可以发现在redis的view_nums有序集合中,已经按照score的大小默认升序排序了。

现在我们要写一个阅读量前五的文章列表,这里需要使用 zRevRange() 方法

//1.初始化Redis连接
$redis = new Redis();
if (!$redis->connect('127.0.0.1', 6379)) {
trigger_error('Redis连接出错!!!', E_USER_ERROR);
} else {
echo '连接正常
';
}
//2.获取倒序的view_nums的前5个,下标从0开始,所以是[0~4],第四个参数表示是否使用score排名
$list = $redis->zRevRange('view_nums', 0, 4, true);
//3.关闭redis连接
$redis->close();
var_dump($list);

8f16192d4d852ebd04d18b56a104b621.png

通过打印的结果可以看到,输出结果是以文章ID为key,值为阅读量的一个数组,并且是按照阅读量降序排序的。

拿到结果之后,我们就可以提取出文章ID,然后从数据库中取出这个几个文章的标题

//获取文章ID
$ids = array_keys($list);
//将文章ID转成字符串,以逗号分隔
$idStr = implode(',', $ids);
//拼接SQL
$sql = "select id, title from article where id in($idStr)";
//使用PDO连接MySQL查询出结果,并将结果返回给客户端

这里写的是伪代码,具体留给你们自己实现吧

原文链接:http://www.cnblogs.com/itbsl/p/13407489.html

d3596d3db7573d1434d9d7f6bad6974a.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值