当前位置: 首页 > news >正文

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、获取元素排名

可以使用ZRANKZREVRANK命令获取元素的排名,其中ZRANK返回升序排名,而ZREVRANK返回降序排名。

ZRANK myzset "two"
ZREVRANK myzset "two"

上述命令分别返回"two"的升序和降序排名。

3、zset的范围查询

3.1、按排名查询

可以使用ZRANGEZREVRANGE命令按排名查询元素。

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的名称,100020001500是玩家的得分,user1user2user3是对应的用户名。

1.2、获取排行榜

要获取排名前三的玩家,我们可以使用ZREVRANGE命令。

ZREVRANGE game_scores 0 2 WITHSCORES

这个命令将返回得分最高的三个玩家及其得分。

2、延时队列

假设我们需要实现一个任务队列,其中任务需要在特定时间后执行。以下是如何使用zset来实现延时队列的具体步骤和代码示例。

2.1、添加任务

当添加一个需要在未来执行的任务时,我们将任务的执行时间和任务ID作为元素和分数添加到zset中。

ZADD delayed_tasks <未来时间戳> task1 <另一个未来时间戳> task2

这里,<未来时间戳>是任务应该执行的时间(以时间戳表示),task1task2是任务的唯一标识符。

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.大小写规范 文件名全部小写是一种广泛使用的命名约定&#xff0c;特别是在跨平台开发和开源项目中。主要原因涉及技术约束、可读性和一致性等方面。以下是原因和优劣势的详细分析&#xff1a; 1. 避免跨平台问题 不同操作系统对文件名的大小写处理方式不同&#xff1a; Li…...

Python 操作mysql - 关系型数据库存储

Python 操作mysql - 关系型数据库存储 文章目录 Python 操作mysql - 关系型数据库存储简单介绍连接数据库创建表插入数据更新数据删除数据查询数据 简单介绍 关系型数据库是一种以“关系”的方式来组织和存储数据的数据库。它使用表&#xff08;也称为“关系”&#xff09;来表…...

React基础知识一

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

游戏行业趋势:“AI、出海、IP”大热下,如何提升竞争力?

游戏&#xff1a;新品供给影响业绩释放节奏&#xff0c;后续游戏新品逐步上线&#xff0c;或驱动板块业绩修复 2024年前三季度A股游戏板块实现营业收入681.8亿元&#xff0c;同比增长5.1%&#xff0c;实现归母净利润73.3亿元&#xff0c;同比下滑30.4%&#xff0c;或主要受 20…...

shell--第一次作业

1.接收用户部署的服务名称 # 脚本入口 read -p "请输入要部署的服务名称&#xff1a;" service_name 2.判断服务是否安装 # 判断服务是否安装 if rpm -q "$service_name" &>/dev/null; then echo "服务 $service_name 已安装。" 已…...

Rust:原子操作 AtomicBool

在 Rust 中&#xff0c;你可以使用 std::sync::atomic 模块来进行原子操作。原子操作在多线程环境中特别有用&#xff0c;因为它们可以确保操作的原子性和可见性&#xff0c;从而避免数据竞争和其他并发问题。 为了读取和设置布尔值&#xff0c;你可以使用 AtomicBool 类型。以…...

深入浅出学算法002-n个1

任务内容 Description 由n个1组成的整数能被K&#xff08;K<10000)整除&#xff0c;n至少为多少&#xff1f; Input 多组测试数据&#xff0c;第一行输入整数T,表示组数 然后是T行&#xff0c;每行输入1个整 数代表K Output 对于每组测试数据输出1行&#xff0c;值为n Sampl…...

GPT1.0 和 GPT2.0 的联系与区别

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

STM32F103 GPIO和串口实战

本节我们将会对STM32F103的硬件资源GPIO和串口进行介绍。 一、GPIO 1.1 电路原理图 LED电路原理图如下图所示&#xff1a; 其中&#xff1a; LED1连接到PA8引脚&#xff0c;低电平点亮&#xff1b;LED2连接到PD2引脚&#xff0c;低电平点亮&#xff1b; 1.2 GPIO引脚介绍 STM32…...

Go 并发

Go 并发 Go 语言,自2009年发布以来,以其独特的并发模型和简洁的语法在编程界崭露头角。Go 语言的并发机制是其最大的亮点之一,它通过轻量级的线程——goroutine,以及通道(channel)和同步原语,为开发者提供了一种高效、易用的并发编程方式。 Goroutine:Go 语言的并发基…...

C语言数据结构与算法--简单实现栈的出栈与入栈

&#xff08;一&#xff09;栈的基本概念 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表&#xff0c;如铁路调度。如下 图&#xff1a; &#xff08;二&#xff09;栈的的表现形式 栈有两种表示形式&#xff1a;栈的表示和实现、栈的 链式表示。 1&#xff0e;栈的表示和…...

单片机智能家居火灾环境安全检测-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器&#xff0c;…...

python FastAPI 后台运行

最近需要用python把AI的能力封装起来&#xff0c;通过暴露API的方式供别的服务来调用。整体的想法是&#xff0c;选择对应接口&#xff0c;接口读取传入的sql语句&#xff0c;自动去数据库读取数据&#xff0c;运算后将结果在存放在数据库中。 搭建FastAPI框架&#xff0c;由于…...

Java开发者必备:23种设计模式全面解析

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

编译OpenWrt步骤

实验平台搭建 硬件平台&#xff1a;hilink-7628n核心板 宿主机系统&#xff1a;ubuntu20.04 server 宿主机安装所需工具&#xff1a; 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&#xff1a;confluence8.5.9的部署&#xff08;下载安装破ji&#xff09;离线部署全流程_atlassian-agent-v1.3.1.zip-CSDN博客 背景&#xff1a;个人使用2核4g 内存扛不住 总是卡住&#xff0c;但是流程通了所以 直接公司开服务器干生产 个人是centos7 公司…...

✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本

api.js //封装ajax方法 import $g from "../sg";//vue项目使用 import $ from jquery;//(提示&#xff1a;原生开发页面请前往https://jquery.com下载最新版jQuery) import { Message } from "element-ui";//element项目使用 // import axios from "…...

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…...

什么是 Faiss?

好的&#xff0c;我来详细解释 Faiss&#xff0c;它的用途、使用场景&#xff0c;以及如何安装和使用。 什么是 Faiss&#xff1f; Faiss 是由 Facebook AI Research 开发的一个开源库&#xff0c;专门用于高效的相似性搜索和聚类。它非常擅长在高维向量空间中进行快速搜索&a…...

保姆级教程:用HWSD世界土壤数据库为SWAT模型快速搭建土壤库(附SPAW软件计算避坑指南)

从HWSD到SWAT&#xff1a;零基础构建高精度土壤数据库的完整指南 水文模型研究者常面临一个棘手问题&#xff1a;如何将全球土壤数据转化为模型可用的参数&#xff1f;HWSD&#xff08;Harmonized World Soil Database&#xff09;作为国际权威土壤数据库&#xff0c;与SWAT模…...

保姆级教程:用微信小程序测试号搞定getPhoneNumber功能(绕过企业认证限制)

微信小程序测试号实战&#xff1a;零成本解锁getPhoneNumber全流程指南 最近在帮朋友开发一个预约类小程序时&#xff0c;遇到了一个典型问题&#xff1a;需要获取用户手机号进行预约确认&#xff0c;但个人开发者账号无法直接调用getPhoneNumber接口。这让我想起了三年前第一次…...

中小型企业构建内部AI助手时如何通过Taotoken实现成本与权限的双重管控

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 中小型企业构建内部AI助手时如何通过Taotoken实现成本与权限的双重管控 应用场景类&#xff0c;企业部署内部AI助手需考虑成本与安…...

安徽话语音合成从0到商用,11步完成ElevenLabs API对接、情感注入与皖北/皖南口音校准

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;安徽话语音合成的地域语言学基础与商用价值 安徽话并非单一均质方言&#xff0c;而是涵盖江淮官话&#xff08;如合肥话、扬州话&#xff09;、中原官话&#xff08;如阜阳话&#xff09;、赣语&#xff08;如…...

Generative AI本质与企业落地实战指南

1. 这不是“AI画画”那么简单&#xff1a;Generative AI到底在生成什么、为什么突然爆发、谁该真正关注它Generative AI——这个词过去三年里高频出现在科技媒体、投资人会议、产品经理周报甚至咖啡馆闲聊中&#xff0c;但很多人至今仍把它等同于“用文字生成图片”或“让AI写周…...

Photoshop+Unity法线贴图工作流:从NMF生成到URP Decal正确显示

1. 这不是一张“凹凸贴图”&#xff0c;而是一套从PS到Unity的法线工作流闭环你有没有试过在Photoshop里用滤镜生成法线贴图&#xff0c;导出后放进Unity——结果模型表面像被砂纸磨过一样全是噪点&#xff1f;或者更糟&#xff1a;Decal&#xff08;贴花&#xff09;明明贴在墙…...

信贷系统压测:用JMeter实现状态流并发与资金流仿真

1. 为什么信贷业务压测不能只跑个登录接口就交差&#xff1f;我第一次接手某城商行信贷系统压测时&#xff0c;信心满满地用JMeter搭了个500线程的“高并发”脚本&#xff0c;模拟用户登录查看额度。结果压测报告一出来&#xff0c;TPS稳定在320&#xff0c;平均响应时间180ms&…...

从 Dify 配置页理解 RAG 的重要参数

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;经常被一句话概括成“先检索&#xff0c;再回答”。这句话没有错&#xff0c;但如果真的要把一个知识库调到可用&#xff0c;仅仅理解这四个字还不够。真正影响答案质量的&#xff0c;往往是…...

HTR6916 共阴极16x9阵列LED驱动器 聚能芯半导体禾润电子一级代理

概述HTR6916 是一款功能卓越的 LED 驱动芯片。它可通过 2 线串行接口进行编程&#xff0c;能够完美支持 169 阵列的 LED 布局。芯片中的每一颗 LED 均能借助 8 位 PWM 数据实现独立调光&#xff0c;为用户提供了高度灵活的调光方案。此外&#xff0c;用户还能通过 ISET 端的外部…...

智慧巡检-基于深度学习的指针式压力表读数识别【YOLO+OpenCv+TensorRT+ROS+Python】

智慧巡检-基于深度学习的指针式压力表读数识别【YOLOOpenCvTensorRTROSPython】 1指针式压力表读数识别系统&#xff08;YOLOOpenCVTensorRTROS&#xff09;一、系统整体架构 ┌──────────────────────────────────────────────…...