图解Redis 05 | Zset数据类型的原理及应用场景

news2024/11/26 9:39:43

介绍

Zset 类型(有序集合)与 Set 类型相比,增加了一个排序属性 score。对于有序集合 Zset,每个元素由两个部分组成:一个是元素的值,另一个是用于排序的分数 score。

有序集合继承了Set中成员唯一(元素值不能重复,分数可以重复)的特性,但不同之处在于,有序集合中的元素是按分数进行排序的。

内部实现

Zset 类型的底层数据结构可以采用ziplist或skiplist来实现:

  • 当有序集合中的元素个数少于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用ziplist作为 Zset 的底层数据结构。
  • 如果不满足这些条件,Redis 则会使用skiplist来实现 Zset 的底层数据结构。

要注意的是,从 Redis 7.0 开始,压缩列表已被废弃,改用更高效的 listpack 数据结构来实现。

常用命令

添加一个或多个元素
zadd key [NX|XX] [CH] [INCR] score member [score member …]
# NX:仅当成员不存在时才添加。如果成员已经存在,什么都不做。
# CH:返回被成功修改的成员数,新增的成员和更新了分数的成员都将被计数。
# INCR:将给定分数递增到成员的当前分数上。如果成员不存在,ZADD 会像正常一样创建一个成员,并将分数设置为指定的值。

> zadd zset1 10 Java
(integer) 1
> zadd zset1 4 Golang 5 JavaScript 7 Python
(integer) 3
查询所有元素
zrange key start stop [WITHSCORES] 

> zrange zset1 0 -1
1) "Golang"
2) "JavaScript"
3) "Python"
4) "Java"

其中,-1表示最后一个元素,查询结果包括开始和结束元素。

删除一个或多个元素(根据元素值)
zrem key member [member …]

> zrem zset1 Java Python
2
> zrange zset1 0 -1
1) "Golang"
2) "JavaScript"

在删除操作中,如果包含的元素不存在,该命令仍会正常执行;所有不存在的元素将被自动忽略。

查询某个元素的分数值
zscore key member

> zscore zset1 Golang
4.0
查询指定分数区间的元素
zrangebyscore key min max [WITHSCORES] [LIMIT offset count] 

> zrangebyscore zset1 3 7
1) "Golang"
2) "JavaScript"
查询元素的排名
zrank key member 

> zadd zset1 10 C++ 12 Ruby
(integer) 2
> zrank zset1 C++
2
> zrank zset1 Golang
0

可以看出排名都是从0开始的,排名可以理解为元素排序后的下标值。更多操作命令请参见文末部分。

应用场景

在需要展示最新榜单或排行榜的场景下,如果数据更新频繁或需要分页显示,建议优先使用 Zset(有序集合)。

排行榜

有序集合最典型的使用场景就是排行榜,例如学生成绩排行、游戏积分排行、视频播放排行、电商系统中产品销量排行等。

以文章点赞量排行为例,假设我发表了 3 篇文章,分别获得了 200、50 和 100 个点赞。

1. arcticle:1 获得200个赞
> ZADD arcticle:ranking 200 arcticle:1
(integer) 1
2. arcticle:2获得50个赞
> ZADD arcticle:ranking 50 arcticle:2
(integer) 1
3. arcticle:3获得100个赞
> ZADD arcticle:ranking 100 arcticle:3
(integer) 1
4. article:2又加了一个赞
> ZINCRBY arcticle:ranking 1 arcticle:2
51.0
5. 查看某篇文章的点赞数
> ZSCORE arcticle:ranking arcticle:3
100.0
6. 获取点赞数最多的2篇文章,
ZREVRANGE arcticle:ranking 0 1 WITHSCORES
1) "arcticle:1"
2) 200.0
3) "arcticle:3"
4) 100.0
7. 获取点赞数在50~100的文章
ZRANGEBYSCORE arcticle:ranking 100 200 WITHSCORES
1) "arcticle:3"
2) 100.0
3) "arcticle:1"
4) 200.0

更多有序集合命令

1.查询有序集合的元素个数。
zcard key

> zcard arcticle:ranking
3
2. 查询某个元素的逆序排名(从高到低的排名)。
zrevrank key member

> zrevrank arcticle:ranking arcticle:2
2
> zrange arcticle:ranking 0 -1
1) "arcticle:2"
2) "arcticle:3"
3) "arcticle:1"
3. 删除指定排名范围内的元素
zremrangebyrank key start stop

> zremrangebyrank arcticle:ranking 0 1 #Delete element
(integer) 2
> zrange arcticle:ranking 0 -1 #Query all elements
1) "arcticle:1"
4. 删除指定分数范围内的元素。
zremrangebyscore key min max

> ZADD arcticle:ranking 51 arcticle:2 100 arcticle:3
(integer) 2
> ZREVRANGE arcticle:ranking 0 -1 WITHSCORES
1) "arcticle:1"
2) 200.0
3) "arcticle:3"
4) 100.0
5) "arcticle:2"
6) 51.0
​
> zremrangebyscore arcticle:ranking 50 100
2
> ZREVRANGE arcticle:ranking 0 -1 WITHSCORES
1) "arcticle:1"
2) 200.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1D+洪水淹没制图软件+山洪径流模拟与洪水危险性评价技术及典型地区洪水淹没及损失分析

1. 软件原理简介: 基于洪水频率计算得到的设计洪水成果,通过水位流量关系将常见年遇洪水的洪峰流量转化为水位,进一步结合洪泛平原DEM数据,采用GIS水文分析方法计算洪泛平原内任一栅格的水流流程,耦合一维水力学模拟计…

树莓派4处理器超频指南

概述 在树莓派4的系列硬件中,处理器都是基于Broadcom BCM2711,内部具有4个ARM Cortex-A72和VideoCore VI。如果仔细看:树莓派4B开发板用的是BCM2711B0,主频为 1.5GHz;而Pi 400(Keyboard Computer&#xff…

【华为\荣耀、中兴、华三路由器IPV6设置】

华为\荣耀、中兴、华三路由器ipv6设置 华为\荣耀设置-路由器拨号情况下中兴设置-路由器拨号情况下华三设置-光猫拨号情况下(待续) 华为\荣耀设置-路由器拨号情况下 如图设置就行 中兴设置-路由器拨号情况下 中兴路由器有两个设置地方也是如图设置 …

浅析Android View绘制过程中的Surface

前言 在《浅析Android中View的测量布局流程》中我们对VSYNC信号到达App进程之后开启的View布局过程进行了分析,经过对整个App界面的View树进行遍历完成了测量和布局,确定了View的大小以及在屏幕中所处的位置。但是,如果想让用户在屏幕上看到…

免费送源码:Java+ssm+Springboot Springboot小型仪器公司生产管理系统 计算机毕业设计原创定制

摘 要 本论文主要论述了如何使用java语言开发一个Springboot小型仪器公司生产管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述小型仪器公司生产管理系统…

Java学习Day56:暴打舔狗!(SpringBoot)

1.springboot简介 核心能力:Spring容器、日志、自动配置AutoCongfiguration、Starters web应用的能力:MVC、嵌入式Web服务器 数据访问(持久化):关系型数据库、非关系型数据库 强大的整合其他技术的能力 只要是Java中牛逼的技术&#xff0c…

nascpolarssh

安装cpolarCpolar快速入门教程:群晖NAS系列 - cpolar 极点云官网 设置ssh: 然后:ssh tobecpolard.26.tcp.cpolar.top -p 12774即可进入 跳板机: 设置端口转向ssh -f -N -L 23:localhost:22 tobe192.168.31.44 ssh tobecpolard.26.tcp.cpola…

相关矩阵图——Python实现

import matplotlib.pyplot as plt import numpy as np# 创建一些正常分布的数据 mean [0, 0] cov [[1, 1], [1, 2]] x, y np.random.multivariate_normal(mean, cov, 3000).T# Set up the axes with gridspec fig plt.figure(figsize(6, 6)) grid plt.GridSpec(4, 4, hspa…

学习笔记:黑马程序员JavaWeb开发教程(2024.10.30)

5.3 请求响应-请求-简单参数 客户端使用postman实现,服务端通过idea,又两种请求方式,springboot的更加简洁方便 对于RequestParam,可以通过设置requiredflase来让参数不是必须传递的 在请求参数过多的时候,可以将请求参…

rabbitmq高级特性(2)TTL、死信/延迟队列、事务与消息分发

目录 1.TTL 1.1.设置消息过期时间 1.2.设置队列过期时间 2.死信队列 2.1.介绍 2.2.演示 3.延迟队列 3.1.模拟实现延迟队列 3.2.延迟队列插件 4.事务与消息分发 4.1.事务 4.2.消息分发 1.TTL 所谓的ttl,就是过期时间。对于rabbitmq,可以设置…

pip使用

pip全称pip install package,是python第三方包sitepackage管理的工具,安装,卸载第三方包。安装python时可以选择安装pip,或自己安装pip 查看pip是否安装:pip --version 安装pip :pip python -m pip install --upgrade…

早期进程间的通信

目录 IO进程(day06) 无名管道 有名管道 信号 IO进程(day06) 无名管道 原理图 无名管道的特点 只能用于有亲缘关系之间的进程无名管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数.无名管道是…

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en,可以获取多个linux内核版本下的存储栈概略图,下面是kernel-4.0的存储栈概略图: 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD:固态存储核心…

Python爬虫入门篇!

毕设是做爬虫相关的,本来想的是用java写,也写了几个爬虫,其中一个是爬网易云音乐的用户信息,爬了大概100多万,效果不是太满意。之前听说Python这方面比较强,就想用Python试试,之前也没用过Pytho…

从0开始搭建一个生产级SpringBoot2.0.X项目(三)SpringBoot接口统一返回和全局异常处理

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot接口统一返回和全局异常处理&#xff0c;使用ControllerAdvice ExceptionHandler 的组合来实现。 一、pom文件新增依赖 <dependency><groupId>com.alibaba</groupId><ar…

【MySQL】实战篇—项目需求分析:ER图的绘制与关系模型设计

在软件开发中&#xff0c;数据库是信息系统的核心部分&#xff0c;合理的数据库设计能够显著提高系统的性能和可维护性。 ER图&#xff08;实体-关系图&#xff09;是数据库设计的重要工具&#xff0c;它通过图形化的方式描述了数据实体及其相互关系&#xff0c;帮助开发者和设…

输入整数n,求,i从1到n的和

// 第一题&#xff0c;输入整数n&#xff0c;求&#xff0c;i从1到n的和 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() {int n 0;printf("请输入一个整数n:");scanf("%d", &n);int i 0;int j 0;for (j 1; j < n; j){i…

频率限制:WAF保护网站免受恶意攻击的关键功能

频率限制&#xff08;Rate Limiting&#xff09;是一项有效的安全措施&#xff0c;用于控制每个 IP 地址的访问速率&#xff0c;以防止恶意用户利用大量请求对网站进行攻击&#xff0c;例如防止 CC 攻击等。频率限制不仅能保护网站资源&#xff0c;还能提升服务的稳定性。 下面…

C++基础: string(3)

文章目录 1. 两道题目1. [387. 字符串中的第一个唯一字符 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/problems/first-unique-character-in-a-string/description/)2.[415. 字符串相加 - 力扣&#xff08;LeetCode&#xff09;](https://leetcode.cn/proble…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…