首页 > 数据库 >利用 Redis Sorted Set 实现高性能排行榜

利用 Redis Sorted Set 实现高性能排行榜

时间:2024-08-24 18:26:55浏览次数:19  
标签:Set Redis 排行榜 score student Sorted 排序

文章目录

背景

排行榜这个业务很常见,比如直播间中的“榜一大哥”、微信的步数排行榜、游戏的段位排行榜等等。

如下图为 CSDN 的排行榜,有全站综合热榜、领域内容榜、热门专栏榜…………各式各样。

在这里插入图片描述

使用MySQL实现排行榜

实现思路

直接使用MySQL中的order by limit关键字,对查询出来的数据进行排序截取前多少名次

举个例子

select * from student order by score desc limit 10;

这条 SQL 就是查询了所有学生中分数最高的前十名,排序的字段为score,排序的方向是desc(降序)。

优点

  • 实现简单:使用成本低,无需引入其他中间件。
  • 查询能力强:利用 SQL 查询语言,可以灵活地构建复杂的查询语句来检索排行榜数据。

弊端

  • 资源消耗:数据库资源是宝贵的,当业务对排行榜的实时性强,数据量大的时候,对数据库的性能消耗是非常大

复现

1)建表

CREATE TABLE `student` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `score` int(11) NOT NULL,
  `name` varchar(11) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100000 DEFAULT CHARSET=utf8mb4;

2)使用 navicat 生成 500w 数据

在这里插入图片描述

3)直接使用 order by 查询

平均在 2.3 秒左右,当然实际业务中可能会拼接多个查询条件和多张表,耗时会更长
在这里插入图片描述

4)优化:对 score 添加索引

在这里插入图片描述

创建索引也是一种加速查询的手段,在加上索引后平均耗时 0.6 秒左右
在这里插入图片描述

这只是一个最简单的场景,实际项目中的复杂度要复杂很多,执行速度也会慢很多。

当然这种怕排序需根据业务场景决定。对于小数据量且排序逻辑简单的场景(如博客文章按阅读量排序),直接使用 order by limit 也是没问题的。

Redis 的 Sorted Set

什么是 Sorted Set

Redis 中的 Sorted Set 是一种有序集合,每个元素都关联一个分数score,用于排序。

在这里插入图片描述

它类似于 Java 中的 HashMap,但增加了排序功能,其中 HashMap 存储键值对,而 Sorted Set 存储带分数的元素,通过分数排序。Sorted Set 支持范围查询和快速排序操作。

Sorted Set 常用命令

命令介绍
ZADD key score1 member1 score2 member2 …向指定有序集合添加一个或多个元素
ZCARD KEY获取指定有序集合的元素数量
ZSCORE key member获取指定有序集合中指定元素的 score 值
ZINTERSTORE destination numkeys key1 key2 …将给定所有有序集合的交集存储在 destination 中,对相同元素对应的 score 值进行 SUM 聚合操作,numkeys 为集合数量
ZUNIONSTORE destination numkeys key1 key2 …求并集,其它和 ZINTERSTORE 类似
ZDIFF destination numkeys key1 key2 …求差集,其它和 ZINTERSTORE 类似
ZRANGE key start end获取指定有序集合 start 和 end 之间的元素(score 从低到高)
ZREVRANGE key start end获取指定有序集合 start 和 end 之间的元素(score 从高到底)
ZREVRANK key member获取指定有序集合中指定元素的排名(score 从大到小排序)

详细命令:https://redis.io/commands/?group=sorted-set 。

使用示例

1)添加数据

ZADD student_set 112.0 user1 100.0 user2 123.0 user3 100.0 user4 33.0 user5 993.0 user6

在这里插入图片描述

2)查看前五名

ZREVRANGE student_set 0 4

在这里插入图片描述

3)查看具体分数

ZSCORE student_set "user1"

在这里插入图片描述

4)查看具体排名

ZREVRANK student_set "user6"

在这里插入图片描述

5)对排名数据进行更新

ZINCRBY student_set +2 "user1"

对 “user1” 的分数做 +2 处理

在这里插入图片描述

标签:Set,Redis,排行榜,score,student,Sorted,排序
From: https://blog.csdn.net/m0_72918997/article/details/141503012

相关文章

  • linux: ipset命令
    一,ipset命令功能:1,ipset是一个用于管理IP地址集合的工具,主要用于‌Linux系统中高效处理大量IP地址。它提供了创建、添加、删除、查询和测试集合的操作 2,查看ipset的文件路径:[lhdop@blog~]$whereisipsetipset:/usr/sbin/ipset/usr/share/man/man8/ipset.8.gz查......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • awk打印除某数据项/某列数/某些列数之外其它列数据的实现以及Twemproxy(redis集群方案
    一、awk打印除某数据项/某列数/某些列数之外其它列数据的实现        偶尔碰到一个需求,我需要使用awk打印数据,但是只需要打印某列之后的其它列,比如我只要第2列及之后的所有数据,如何实现呢?实际很简单:#将$1置成空,然后打印即可awk'{$1="";print}'filepathawk'{$1......
  • Superset BI封装自定义组件(堆叠柱状图)
    目录前言封装步骤一、创建组件文件夹二、预设组件信息三、使用组件往期回顾前言Superset是一个现代化的、易于使用的、轻量级的数据可视化工具,它允许用户通过简单的点击操作来创建和分享图表。如果你想在Superset中创建自定义组件,你可能需要进行一些扩展工作。......
  • TreeMap&TreeSet解析
    TreeMapTreeSet使用适配器模式包装了TreeMap,所以只需要理解TreeMap就够了概述TreeMap实现了SortedMap接口,也就是说会按照顺序对Map中的元素进行排序,可以是自然顺序,也可以使用自定义比较器TreeMap<Integer,String>treeMap=newTreeMap<>();treeMap.put(3,"Apple");tree......
  • LinkedHashMap&LinkedHashSet源码解析
    LinkedHashMap概述LinkedHashSet使用适配器模式包装了LinkedHashSet一个有序的散列表,允许key为null也允许value为空,从名字上可以看出使用链表维护了有序性在元素存储时,在原来的HashMap的数组+链表的基础上,为每个元素添加了pre和next指针,构成了一个双向链表注意:内部没有使用红......
  • [Redis]消息队列
    Redis如何实现消息队列1、使用ListList最为简单和直接,主要通过lpush、rpop存储和读取消息队列的(先进先出)ruby代码解读复制代码127.0.0.1:6379>lpushmq"firstMsg"#推送消息firstMsg(integer)1127.0.0.1:6379>lpushmq"secondMsg"#推送消息secondMsg(integer)212......
  • Linux下Redis的安装和部署(哨兵模式)
    1.哨兵模式配置文件redis服务 redis端口 哨兵端口 主从redis-1 7001 27001 主节点redis-2 7002 27002 从节点redis-3 7003 27003 从节点下载Rediscurl-Ohttp://download.redis.io/releases/redis-6.0.6.tar.gz解压Redistarxzvfredis-6.0.6.tar.gz进入redis-6.0.6目......
  • Linux设备驱动之Kobject、Kset
    原文:https://blog.csdn.net/qq_21435127/article/details/80746788?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%A6%82%E4%BD%95%E8%AF%86%E5%88%AB%20kobject%20kset&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~de......
  • vue3 语法糖<script setup>
    在Vue3中,<scriptsetup>是一种新的语法糖,它极大地简化了组件的编写方式。<scriptsetup>是在单文件组件(SFC)中使用组合式API的编译时语法糖。当同时使用SFC与组合式API时该语法是默认推荐。基本概念简洁的语法:<scriptsetup>允许在<script>标签中直接使用组......