Redis中的zset用法详解
文章目录
- Redis中的zset用法详解
- 一、引言
- 二、zset的基本概念和操作
- 1、zset的添加和删除
- 1.1、添加元素
- 1.2、删除元素
- 2、zset的查询
- 2.1、获取元素分数
- 2.2、获取元素排名
- 3、zset的范围查询
- 3.1、按排名查询
- 3.2、按分数查询
- 三、zset的应用场景
- 1、排行榜
- 1.1、添加玩家得分
- 1.2、获取排行榜
- 2、延时队列
- 2.1、添加任务
- 2.2、处理到期任务
- 3、滑动窗口限流
- 3.1、记录请求
- 3.2、检查请求频率
- 3.3、清理旧请求
- 四、总结
Redis中的zset用法详解
一、引言
Redis是一个开源的高性能键值对数据库,它支持多种类型的数据结构,其中之一就是有序集合(zset)。有序集合类似于集合(set),但它为每个元素关联了一个分数(score),使得元素可以按照分数进行排序。这种数据结构在实现排行榜、延时队列等场景中非常有用。
二、zset的基本概念和操作
1、zset的添加和删除
1.1、添加元素
向zset中添加元素可以使用ZADD
命令。这个命令允许你将一个或多个元素及其分数添加到有序集合中。
ZADD myzset 1 "one" 2 "two" 3 "three"
上述命令将元素"one"、"two"和"three"及其对应的分数添加到名为myzset
的有序集合中。
1.2、删除元素
从zset中删除元素可以使用ZREM
命令。
ZREM myzset "two"
上述命令将元素"two"从myzset
有序集合中删除。
2、zset的查询
2.1、获取元素分数
可以使用ZSCORE
命令获取有序集合中元素的分数。
ZSCORE myzset "one"
上述命令将返回元素"one"的分数。
2.2、获取元素排名
可以使用ZRANK
和ZREVRANK
命令获取元素的排名,其中ZRANK
返回升序排名,而ZREVRANK
返回降序排名。
ZRANK myzset "two"
ZREVRANK myzset "two"
上述命令分别返回"two"的升序和降序排名。
3、zset的范围查询
3.1、按排名查询
可以使用ZRANGE
和ZREVRANGE
命令按排名查询元素。
ZRANGE myzset 0 -1 WITHSCORES
ZREVRANGE myzset 0 -1 WITHSCORES
上述命令分别返回myzset
中所有元素及其分数,按照升序和降序排列。
3.2、按分数查询
可以使用ZRANGEBYSCORE
命令按分数查询元素。
ZRANGEBYSCORE myzset 1 3
上述命令返回myzset
中分数在1到3之间的所有元素。
三、zset的应用场景
1、排行榜
假设我们正在开发一个在线游戏,需要实现一个玩家得分排行榜。以下是如何使用Redis的zset来实现这个功能的具体步骤和代码示例。
1.1、添加玩家得分
当玩家完成游戏并获得分数时,我们将他们的得分和用户名添加到zset中。
ZADD game_scores 1000 user1 2000 user2 1500 user3
这里,game_scores
是zset的名称,1000
、2000
和1500
是玩家的得分,user1
、user2
和user3
是对应的用户名。
1.2、获取排行榜
要获取排名前三的玩家,我们可以使用ZREVRANGE
命令。
ZREVRANGE game_scores 0 2 WITHSCORES
这个命令将返回得分最高的三个玩家及其得分。
2、延时队列
假设我们需要实现一个任务队列,其中任务需要在特定时间后执行。以下是如何使用zset来实现延时队列的具体步骤和代码示例。
2.1、添加任务
当添加一个需要在未来执行的任务时,我们将任务的执行时间和任务ID作为元素和分数添加到zset中。
ZADD delayed_tasks <未来时间戳> task1 <另一个未来时间戳> task2
这里,<未来时间戳>
是任务应该执行的时间(以时间戳表示),task1
和task2
是任务的唯一标识符。
2.2、处理到期任务
定期运行一个脚本来检查是否有任务到期,并执行它们。
ZRANGEBYSCORE delayed_tasks 0 <当前时间戳>
这个命令将返回所有到期的任务(分数小于或等于当前时间戳的任务)。然后,你可以遍历这些任务并执行它们,最后从zset中删除这些任务。
ZREM delayed_tasks task1 task2
3、滑动窗口限流
假设我们需要对一个API接口进行限流,以确保在一分钟内不超过100次请求。以下是如何使用zset来实现滑动窗口限流的具体步骤和代码示例。
3.1、记录请求
每次API被调用时,我们将当前时间戳和请求标识符添加到zset中。
ZADD api_limit:<接口名称> <当前时间戳> <请求标识符>
这里,api_limit:<接口名称>
是zset的名称,<当前时间戳>
是请求发生的时间,<请求标识符>
是每个请求的唯一标识符。
3.2、检查请求频率
在处理请求之前,检查过去一分钟内是否有超过100次请求。
ZCOUNT api_limit:<接口名称> <当前时间戳-60000> <当前时间戳>
这个命令将返回过去一分钟内(60000毫秒)的请求数量。如果这个数量超过了100,那么拒绝当前请求。
3.3、清理旧请求
为了保持zset的大小,定期删除超过时间窗口的请求。
ZREMRANGEBYSCORE api_limit:<接口名称> 0 <当前时间戳-60000>
这个命令将删除所有超过一分钟的请求记录。
以上示例展示了如何使用Redis的zset来实现排行榜、延时队列和滑动窗口限流功能。这些应用场景展示了zset的灵活性和强大的功能。
四、总结
Redis的zset是一个功能强大的有序集合数据结构,它不仅支持元素的添加、删除和查询,还支持范围查询和排名查询,非常适合实现排行榜、延时队列和限流等场景。通过合理使用zset,可以有效地解决许多实际问题。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章:
- 零基础手把手带你阅读Redis源代码系列-ZSet底层原理详解(跳表SkipList)-阿里云开发者社区
- redis 中Zset(有序集合)介绍 及常用命令(附有示例)_redis zset-CSDN博客
相关文章:
Redis中的zset用法详解
文章目录 Redis中的zset用法详解一、引言二、zset的基本概念和操作1、zset的添加和删除1.1、添加元素1.2、删除元素 2、zset的查询2.1、获取元素分数2.2、获取元素排名 3、zset的范围查询3.1、按排名查询3.2、按分数查询 三、zset的应用场景1、排行榜1.1、添加玩家得分1.2、获取…...
上位机编程命名规范
1.大小写规范 文件名全部小写是一种广泛使用的命名约定,特别是在跨平台开发和开源项目中。主要原因涉及技术约束、可读性和一致性等方面。以下是原因和优劣势的详细分析: 1. 避免跨平台问题 不同操作系统对文件名的大小写处理方式不同: Li…...
Python 操作mysql - 关系型数据库存储
Python 操作mysql - 关系型数据库存储 文章目录 Python 操作mysql - 关系型数据库存储简单介绍连接数据库创建表插入数据更新数据删除数据查询数据 简单介绍 关系型数据库是一种以“关系”的方式来组织和存储数据的数据库。它使用表(也称为“关系”)来表…...

React基础知识一
写的东西太多了,照成csdn文档编辑器都开始卡顿了,所以分篇写。 1.安装React 需要安装下面三个包。 react:react核心包 react-dom:渲染需要用到的核心包 babel:将jsx语法转换成React代码的工具。(没使用jsx可以不装)1.1 在html中…...

游戏行业趋势:“AI、出海、IP”大热下,如何提升竞争力?
游戏:新品供给影响业绩释放节奏,后续游戏新品逐步上线,或驱动板块业绩修复 2024年前三季度A股游戏板块实现营业收入681.8亿元,同比增长5.1%,实现归母净利润73.3亿元,同比下滑30.4%,或主要受 20…...

shell--第一次作业
1.接收用户部署的服务名称 # 脚本入口 read -p "请输入要部署的服务名称:" service_name 2.判断服务是否安装 # 判断服务是否安装 if rpm -q "$service_name" &>/dev/null; then echo "服务 $service_name 已安装。" 已…...
Rust:原子操作 AtomicBool
在 Rust 中,你可以使用 std::sync::atomic 模块来进行原子操作。原子操作在多线程环境中特别有用,因为它们可以确保操作的原子性和可见性,从而避免数据竞争和其他并发问题。 为了读取和设置布尔值,你可以使用 AtomicBool 类型。以…...
深入浅出学算法002-n个1
任务内容 Description 由n个1组成的整数能被K(K<10000)整除,n至少为多少? Input 多组测试数据,第一行输入整数T,表示组数 然后是T行,每行输入1个整 数代表K Output 对于每组测试数据输出1行,值为n Sampl…...

GPT1.0 和 GPT2.0 的联系与区别
随着自然语言处理技术的飞速发展,OpenAI 提出的 GPT 系列模型成为了生成式预训练模型的代表。作为 GPT 系列的两代代表,GPT-1 和 GPT-2 虽然在架构上有着继承关系,但在设计理念和性能上有显著的改进。本文将从模型架构、参数规模、训练数据和…...

STM32F103 GPIO和串口实战
本节我们将会对STM32F103的硬件资源GPIO和串口进行介绍。 一、GPIO 1.1 电路原理图 LED电路原理图如下图所示: 其中: LED1连接到PA8引脚,低电平点亮;LED2连接到PD2引脚,低电平点亮; 1.2 GPIO引脚介绍 STM32…...
Go 并发
Go 并发 Go 语言,自2009年发布以来,以其独特的并发模型和简洁的语法在编程界崭露头角。Go 语言的并发机制是其最大的亮点之一,它通过轻量级的线程——goroutine,以及通道(channel)和同步原语,为开发者提供了一种高效、易用的并发编程方式。 Goroutine:Go 语言的并发基…...

C语言数据结构与算法--简单实现栈的出栈与入栈
(一)栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表,如铁路调度。如下 图: (二)栈的的表现形式 栈有两种表示形式:栈的表示和实现、栈的 链式表示。 1.栈的表示和…...

单片机智能家居火灾环境安全检测-分享
目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器,…...
python FastAPI 后台运行
最近需要用python把AI的能力封装起来,通过暴露API的方式供别的服务来调用。整体的想法是,选择对应接口,接口读取传入的sql语句,自动去数据库读取数据,运算后将结果在存放在数据库中。 搭建FastAPI框架,由于…...

Java开发者必备:23种设计模式全面解析
文章目录 一、创建型模式1、工厂模式简单工厂工厂方法 2、抽象工厂模式3、原型模式4、建造者模式5、单例模式 二、结构型模式1、适配器模式2、桥接模式3、组合模式4、装饰模式5、外观模式6、享元模式7、代理模式 三、行为型模式1、解释器模式2、模板方法模式3、策略模式4、观察…...

编译OpenWrt步骤
实验平台搭建 硬件平台:hilink-7628n核心板 宿主机系统:ubuntu20.04 server 宿主机安装所需工具: binutils bzip2 diff find flex gawk gcc-6 getopt grep install libc-dev libz-dev make4.1 perl python3.7 rsync subversion unzip whi…...

Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题
原文地址Linux:confluence8.5.9的部署(下载安装破ji)离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景:个人使用2核4g 内存扛不住 总是卡住,但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…...
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
api.js //封装ajax方法 import $g from "../sg";//vue项目使用 import $ from jquery;//(提示:原生开发页面请前往https://jquery.com下载最新版jQuery) import { Message } from "element-ui";//element项目使用 // import axios from "…...

axios 请求跨域问题
文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口,Vue-CLI 的默认端口为 8080,所以为避免端口冲突,我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…...
什么是 Faiss?
好的,我来详细解释 Faiss,它的用途、使用场景,以及如何安装和使用。 什么是 Faiss? Faiss 是由 Facebook AI Research 开发的一个开源库,专门用于高效的相似性搜索和聚类。它非常擅长在高维向量空间中进行快速搜索&a…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...