使用Redis完成排行榜系统

redis里有一种很特殊的数据类型——有序集合。之前我们学过的集合的概念是,集合里所有元素都是唯一的、无序的。但这里怎么出现了有序集合,他是怎么来实现有序的呢?

有序集合里元素还是唯一的,但会给每个元素设置一个socre(分值),通过这个分值来实现有序的。如下图所示:

QQ截图20200514082750.png

有序集合API

下面介绍几个有序集合的API,实现排行榜功能需要知道这些API的用法。

zAdd

我们想设置一个球员2k能力值的有序列表,使用球员名为元素,能力值为scores。

库里的投射能力为100,詹姆斯为92,哈登为96,保罗为97

sadd一次可以添加1个或多个元素

127.0.0.1:6379[1]> zadd 2kplayer:shoot 100 curry(integer) 1127.0.0.1:6379[1]> zadd 2kplayer:shoot 92 james 96 harden 97 paul(integer) 3

登录后复制

zIncrBy

这一个月来,哈登连续爆种,疯狂连续砍高分,那么,2k决定将他的投射能力值提高2点

127.0.0.1:6379[1]> zincrby 2kplayer:shoot 2 harden"98"

登录后复制

zRange、zRevRange

现在我们想知道能力值前3名的球员是哪3个。

127.0.0.1:6379[1]> zrange 2kplayer:shoot 0 2 withscores1) "james"2) "92"3) "paul"4) "97"5) "harden"6) "98"

登录后复制

redis默认采用正序,分值从小到大排序。所以我们需要使用zRevRange

127.0.0.1:6379[1]> zrevrange 2kplayer:shoot 0 2 withscores1) "curry"2) "100"3) "harden"4) "98"5) "paul"6) "97"

登录后复制

zUnionStore

2k能力值是有多方面的,投射只是其中一项,速度、上篮等都是能力值的一部分。

127.0.0.1:6379[1]> zadd 2kplayer:speed 99 james 90 paul 90 curry 93 harden (integer) 4

登录后复制

这时候,想知道球员综合能力值的话,就需要将每一项的得分都加起来

127.0.0.1:6379[1]> zunionstore 2kplayer 2 2kplayer:shoot 2kplayer:speed(integer) 4127.0.0.1:6379[1]> zrange 2kplayer 0 -1 withscores1) "paul"2) "187"3) "curry"4) "190"5) "harden"6) "191"7) "james"8) "191"

登录后复制

实现排行榜系统

场景如下:一个视频点播系统,每天观看的人很多。该系统有个榜单功能,展示观看量最多的视频。分为今日榜单、三日榜单、一周排行、月榜单。

思路:首先是按天统计视频观看次数,然后再统计出今日榜单、三日榜单等。

统计视频观看次数的伪代码如下:

// 观看视频function view ($videoId){    $key = 'video:view:'.date('Y-m-d');            if (!$redis->exists($key)) {        $redis->zIncrBy($key, 1, $videoId);        $redis->expire($key, 86400 * 30);    }        $redis->zIncrBy($key, 1, $videoId);}

登录后复制

今日最热

今日最热有一个注意点,当新的一天刚开始时,数据可能为空或很少。所以,我们可以将今日和昨日的数据合并起来,但将今日的数据权重设高些。

今日最热功能实现伪代码如下:

function todayHot (){    $tokeyKey = 'video:view:'.date('Y_m_d');    $yesKey = 'video:view:'. date('Y_m_d', time() - 86400);    $keyUnion = "view:rank:today";        $redis->zUnionStore($keyUnion, [$tokeyKey, $yesKey], [10, 1]);    // 取前100名    return $redis->zRevRange($keyUnion, 0, 99);}

登录后复制

三日榜单

function threeHot (){    $keyUnion = 'view:rank:three';    $unionKeys = [];        for ($i=0; $i zUnionStore($keyUnion, $unionKeys);    return $redis->zRevRange($keyUnion, 0, 99, true);}

登录后复制

周榜单、月榜单等和三日榜单的思路完成一样,所以就不贴出代码了。

以上就是使用Redis完成排行榜系统的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2043591.html

(0)
上一篇 2025年2月24日 00:57:38
下一篇 2025年2月17日 23:57:21

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Redis运维之慢查询日志

    使用好redis,不仅仅要知道api的使用,还要知道如何防止redis阻塞及阻塞的查看和分析。今天,和大家聊聊如何发现redis的阻塞——通过慢查询找到阻塞的命令。 和Mysql一样,Redis也有慢查询记录。当命令的执行时间超过设定的值时…

    数据库 2025年2月24日
    200
  • redis性能优化方法

    一、 Redis部署结构优化建议 1. Master不做AOF或RDB持久化,Slave做AOF持久化,建议同时做RDB持久化 2. 所有Master全部增加Slave 3. Master挂载Slave不超过2个,采用M-S-S方式挂载。若…

    2025年2月24日
    200
  • Redis运维之shell的使用——统计内存、定期备份、基准测试

    使用redis shell可以完成许多有意思的操作,使用也非常的简单,下面开始介绍。 Redis-cli redis-cli的选项非常多,除了常用的-h、-p、-a外,下面在介绍几个很常用的选项。想查看所有选项的话可以使用redis-cli…

    数据库 2025年2月24日
    100
  • Redis的事务及乐观锁的应用

    相信phper都或多或少知道事务,在一些场景中也会经常用到事务。比如购买了一个产品,需要向订单表插入一条数据,还要修改用户表的余额字段等等。这两个操作必须是要么一起成功,要么都失败,否则就会产生数据不一致的情况。 Redis中也支持事务的特…

    数据库 2025年2月24日
    200
  • 设置redis开机启动的方法

    redis设置开机启动的方法: 1、拷贝 redis 安装目前下的 /usr/local/redis-4.0.8/utils/redis_init_script 到 /etc/init.d/redis文件中; cp /usr/local/r…

    2025年2月24日
    200
  • redis中两种持久化缺陷介绍

    一、RDB持久化模式缺陷 1、问题描述: 并发200路,模拟不断写Redis,持续4小时后,接口调用开始出现大量失败,错误信息如下: {“data”:{“sendResult”:null},”base”:{“returncode”:”999…

    2025年2月24日 数据库
    200
  • Redis安装大全涵盖Windows、Linux、Docker

    本文实现功能redis在windows安装教程Redis在centos上安装使用docker安装Redis实现环境centos7.3dockerVM虚拟机 window安装redis教程 redis在window上的版本最高到3.2 下载地…

    2025年2月24日 数据库
    200
  • 使用Redis的bitmaps统计活跃用户

    首先我们看一个场景:一个网站,需要统计一周内连续登陆的用户,以及一个月内登陆过的用户。 如果用传统的数据库如Mysql来实现的话,很难做到。但如果用Redis来做的话,就很简便。Redis的集合类型和Bitmap类型都可以很容易的做到。今天…

    数据库 2025年2月24日
    200
  • 使用Redis完成聊天室功能

    redis提供了pub/sub(发布/订阅)模式的消息机制。发布者向指定频道发布消息,订阅了该频道的订阅者就可以获取消息。通过该机制,我们可以完成聊天室、公告牌等功能。 首先,来介绍下关于pub/sub的几个命令。 发布消息 publish…

    数据库 2025年2月24日
    200
  • redis之django-redis使用

    自定义连接池 这种方式跟普通py文件操作redis一样,代码如下 views.py   import redis  from django.shortcuts import render,HttpResponse  from utils.r…

    2025年2月24日
    200

发表回复

登录后才能评论