Redis基础教程(九):redis有序集合
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!
💝💝💝如有需要请大家订阅我的专栏【Redis系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!
文章目录
- 引言
- 一、Redis 有序集合特性
- 常用命令
- 二、实战案例
- 场景:用户排行榜
- 步骤1:初始化排行榜
- 步骤2:添加玩家到排行榜
- 步骤3:获取排行榜前10名玩家
- 步骤4:获取特定分数区间的玩家
- 步骤5:更新玩家分数
- 步骤6:移除特定分数区间的玩家
- 场景:任务队列按优先级排序
- 步骤1:初始化任务队列
- 步骤2:添加任务到队列
- 步骤3:获取最高优先级的任务
- 步骤4:移除已完成的任务
- 总结
引言
Redis 的有序集合(Sorted Set)是一种特殊的数据结构,它结合了集合的唯一性与列表的排序功能,允许你存储一系列唯一的元素,并为每个元素关联一个分数(score)。这种数据结构非常适合用于实现排行榜、任务队列按优先级排序、时间序列数据的存储与查询等场景。本文将详细介绍 Redis 有序集合的基本概念、常用命令,并通过实战案例展示有序集合在实际项目中的应用。
一、Redis 有序集合特性
有序集合在内部实现上,使用了跳表(Skip List)和字典(Dictionary)两种数据结构,跳表用于保证元素的快速排序和查找,而字典则用于保证元素的唯一性。有序集合中的元素和分数(score)一起被存储,这使得你可以按照分数对集合进行排序。
常用命令
-
ZADD key score member [score member …]
- 描述:将一个或多个成员元素及其分数加入到有序集合中,如果成员元素已经存在,则更新其分数。
- 示例:
ZADD leaderboard 100 player1 200 player2
-
ZCARD key
- 描述:返回有序集合的基数(元素数量)。
- 示例:
ZCARD leaderboard
-
ZCOUNT key min max
- 描述:计算在有序集合中指定区间分数的成员数。
- 示例:
ZCOUNT leaderboard 100 200
-
ZRANGE key start stop [WITHSCORES]
- 描述:返回有序集合中指定范围的成员,可以包含分数。
- 示例:
ZRANGE leaderboard 0 10 WITHSCORES
-
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 描述:返回有序集合中指定分数区间的成员,可以包含分数。
- 示例:
ZRANGEBYSCORE leaderboard 100 200 WITHSCORES LIMIT 0 10
-
ZREVRANGE key start stop [WITHSCORES]
- 描述:返回有序集合中指定范围的成员,按分数降序排列,可以包含分数。
- 示例:
ZREVRANGE leaderboard 0 10 WITHSCORES
-
ZREMRANGEBYRANK key start stop
- 描述:移除有序集合中指定排名范围的成员。
- 示例:
ZREMRANGEBYRANK leaderboard 0 10
-
ZREMRANGEBYSCORE key min max
- 描述:移除有序集合中指定分数范围的成员。
- 示例:
ZREMRANGEBYSCORE leaderboard 100 200
-
ZREM key member [member …]
- 描述:移除有序集合中的一个或多个成员。
- 示例:
ZREM leaderboard player1
-
ZSCORE key member
- 描述:返回有序集合中成员的分数。
- 示例:
ZSCORE leaderboard player1
二、实战案例
场景:用户排行榜
假设我们正在开发一个在线游戏,需要实时显示玩家的排行榜,根据玩家的分数进行排序。
步骤1:初始化排行榜
redis-cli DEL leaderboard
步骤2:添加玩家到排行榜
redis-cli ZADD leaderboard 1000 player1
redis-cli ZADD leaderboard 800 player2
redis-cli ZADD leaderboard 1200 player3
步骤3:获取排行榜前10名玩家
redis-cli ZRANGE leaderboard 0 9 WITHSCORES
步骤4:获取特定分数区间的玩家
redis-cli ZRANGEBYSCORE leaderboard 800 1000 WITHSCORES
步骤5:更新玩家分数
redis-cli ZADD leaderboard 1100 player1
步骤6:移除特定分数区间的玩家
redis-cli ZREMRANGEBYSCORE leaderboard 800 900
场景:任务队列按优先级排序
假设我们正在构建一个任务调度系统,需要根据任务的优先级进行调度。
步骤1:初始化任务队列
redis-cli DEL task_queue
步骤2:添加任务到队列
redis-cli ZADD task_queue 5 task1
redis-cli ZADD task_queue 10 task2
redis-cli ZADD task_queue 1 task3
步骤3:获取最高优先级的任务
redis-cli ZRANGE task_queue 0 0 WITHSCORES
步骤4:移除已完成的任务
redis-cli ZREM task_queue task1
喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘

💝💝💝如有需要请大家订阅我的专栏【Redis系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!
总结
Redis 的有序集合因其独特的排序和唯一性功能,在排行榜、任务队列、时间序列数据存储等多种场景中展现了其强大的应用价值。掌握这些知识和技能,将帮助你更好地利用 Redis 的数据结构特性,提升应用程序的性能和用户体验。在实际应用中,有序集合往往与其他数据结构结合使用,以实现更复杂的功能和更精细的数据管理。
| Redis相关文章索引 | 文章链接 |
|---|---|
| Redis基础教程(一):redis配置 | Redis基础教程(一):redis配置 |
| Redis基础教程(二):redis数据类型 | Redis基础教程(二):redis数据类型 |
| Redis基础教程(三):redis命令 | Redis基础教程(三):redis命令 |
| Redis基础教程(四):redis键(key) | Redis基础教程(四):redis键(key) |
| Redis基础教程(五):string字符串 | Redis基础教程(五):string字符串 |
| Redis基础教程(六):redis 哈希(Hash) | Redis基础教程(六):redis 哈希(Hash) |
| Redis基础教程(七):redis列表(List) | Redis基础教程(七):redis列表(List) |
| Redis基础教程(八):redis集合(Set) | Redis基础教程(八):redis集合(Set) |
❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
相关文章:
Redis基础教程(九):redis有序集合
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝Ὁ…...
Servlet与Servlet容器
什么是Servlet? Servlet是Java EE(现称Jakarta EE)中的一个组件,通常用于创建动态Web内容。Servlet是运行在Web服务器上的Java程序,它处理客户端的请求并生成响应。Servlet的核心功能是处理HTTP请求和响应。下面是一个servlet例…...
腾讯centos mysql安装
腾讯centos mysql安装 腾讯云提供了一系列的云计算服务,包括操作系统、数据库、服务器等。在腾讯云上安装CentOS操作系统和MySQL数据库可以按照以下步骤进行: 登录腾讯云控制台(登录 - 腾讯云)。在控制台页面上方的搜索框中输入…...
c_各个unsigned int 和 int的取值范围
bool, uint8_t, uint16_t, uint32_t, uint64_t, int8_t, int16_t, int32_t, int64_t 取值范围分别是什么? 定义形式: typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long uint64_…...
C#/WPF 自制截图工具
在日常使用电脑办公时,我们经常遇到需要截图然后保存图片,我们往往需要借助安装截图工具才能实现,现在我们通过C#自制截图工具,也能够轻松进行截图。 我们可以通过C#调用WindousAPI来实现截图,实例代码如下:…...
以腾讯为例,手把手教你搭建产品帮助中心
一个精心设计的产品帮助中心对于提高用户满意度和体验至关重要。腾讯,作为全球领先的互联网企业,通过其多样化的产品线(包括微信、QQ、腾讯游戏、腾讯视频等)吸引了亿万用户。下面将以腾讯为例,向您展示如何搭建一个高…...
计算机网络概述--自我学习用
计算网络体系概述 相关问题 计算机网络为什么要分层?计算机网络是怎么分层的?三种计算机网络模型的关系是什么?每一层分别包含哪些协议?计算机网络中,数据如何在各层中传播?数据在网络各层中的存在形式是…...
超级好用的java http请求工具
kong-http 基于okhttp封装的轻量级http客户端 使用方式 Maven <dependency><groupId>io.github.kongweiguang</groupId><artifactId>kong-http</artifactId><version>0.1</version> </dependency>Gradle implementation …...
在原有的iconfont.css文件中加入新的字体图标
前言:在阿里图标库中,如果你没有这个字体图标的线上项目,那么你怎么在本地项目中的原始图标文件中添加新的图标呢? 背景:现有一个vue项目,下面是这个前端项目的字体图标文件。现在需要新开发功能页&#x…...
使用 ESP32-WROOM + DHT11 做个无屏温湿度计
最近梅雨天,有个房间湿度很大,而我需要远程查看温湿度,所以无所谓有没有显示屏,某宝上的温湿度计都是带屏的,如果连WIFI查看温湿度操作也比较麻烦,还需要换电池,实在不能满足我的需求࿰…...
如何使用 SwiftUI 构建 visionOS 应用
文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出,现在是看看 SwiftUI API 的完美时机,这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示,构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…...
InspireFace-商用级的跨平台开源人脸分析SDK
InspireFace-商用级的跨平台开源人脸分析SDK InspireFaceSDK是由insightface开发的⼀款⼈脸识别软件开发⼯具包(SDK)。它提供了⼀系列功能,可以满⾜各种应⽤场景下的⼈脸识别需求,包括但不限于闸机、⼈脸⻔禁、⼈脸验证等。 该S…...
华为HCIP Datacom H12-821 卷24
1.单选题 企业大楼有大量员工通常都在上班时在大厅开始接入到公司的WLAN网络,随着每位员工走到各自的工位过程中,每个人的移动端叶通过漫游的方式漫游到各自的网络覆盖区域。为了尽量保证每个终端的IP地址是固定的,建议的做法是? A、配置VLAN Pool并配置顺序算法 B、…...
TikTok马来西亚直播网络怎么配置?
TikTok是一款全球流行的社交媒体应用,在东南亚地区拥有大量用户。在马来西亚这个多元化的国家,配置高效稳定的直播网络对TikTok的运营至关重要。 配置马来西亚直播网络的必要性 广泛的地理覆盖:马来西亚包括大片陆地和众多岛屿,网…...
基于若依的文件上传、下载
基于若依实现文件上传、下载 文章目录 基于若依实现文件上传、下载1、前端实现-文件上传1.1 通用上传分析1.2 修改实现上传接口 2、后端实现-文件上传3、后端实现-文件下载4、前端实现-文件下载 官网其实也写了,但是我是自己改造封装了一下,再次迈向全栈…...
论文回顾 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法
论文速览 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法 1 引言 在计算机视觉和机器人领域,相机校准一直是一个基础而又重要的问题。传统的相机校准方法主要依赖于从已知校准图案中提取角点,然后通过优化算法求解相机的内参和外参。这…...
高级java每日一道面试题-2024年7月1日
题目:请解释 Java 中的内存泄漏,并说明如何检测和避免内存泄漏。 答案: 内存泄漏指的是程序中不再使用的对象,由于某些原因没有被垃圾回收器回收,仍然占据着内存空间,导致可用内存逐渐减少,最…...
当需要对多个表进行联合更新操作时,怎样确保数据的一致性?
文章目录 一、问题分析二、解决方案三、示例代码(以 MySQL 为例)四、加锁机制示例五、测试和验证六、总结 在数据库管理中,经常会遇到需要对多个表进行联合更新的情况。这种操作带来了一定的复杂性,因为要确保在整个更新过程中数据…...
数据结构-线性表的应用
目录 前言一、有序表的合并1.1 顺序表实现1.2 单链表实现 二、稀疏多项式的相加和相乘2.1 稀疏多项式的相加2.2 稀疏多项式的相乘 总结 前言 本篇文章介绍线性表的应用,分别使用顺序表和单链表实现有序表的合并,最后介绍如何使用单链表实现两个稀疏多项…...
cpp http server/client
httplib 使用httplib库 basedemo server.cpp #include "httplib.h" #include <iostream> using namespace httplib;int main(void) {Server svr;svr.Get("/hello", [](const Request& req, Response& res) {std::cout << "lo…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
