Redis常见数据类型(6)-set, zset

目录

Set

命令小结

内部编码

使用场景

用户画像

其它

Zset有序集合

普通指令

zadd

zcard

zcount

zrange

zrevrange

​编辑 

 zrangebyscore

zpopmax/zpopmin

bzpopmax/bzpopmin

zrank/zrevrank

zscore

zrem

 zremrangebyrank

zremrangebyscore


Set

命令小结

命令功能时间复杂度
sadd key element [element...]向集合添加元素O(k), k是元素个数
srem key element [element...]删除集合中的元素O(k), k是元素个数
scard key求集合中的元素数目O(1)
sismember key element判断一个元素是否在集合内O(1)
srandmember key [count]在集合中随机获取count个元素O(count)
spop key [count]在集合中随机删除count个元素O(count)
smembers key获取集合中的所有元素O(k), k是元素个数
sinter key [key...] sinterstore求多个集合的交集O(m * k)
sunion key [key...] sunionstore求多个集合的并集O(k), k是多个集合元素个数的总和
sdiff key [key...] sdiffstore求多个集合的差集O(k), k是多个集合元素个数的总和

内部编码

集合中的内部编码有两种: 

intset(整数集合): 当集合中的元素都是整数并且元素的个数小于set-max-intset-entires配置时, Redis会选用intset来作为集合的内部实现, 从而减少内存的使用. 

hashtable(哈希表): 当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现. 

 

使用场景

用户画像

集合类型比较典型的使用场景就是用户画像, 例如在抖音中, 用户A对美女跳舞, 唱跳rap篮球感兴趣, 用户B对历史, 二次元游戏感兴趣, 那么这些特征就会被记录为用户画像, 这些数据对提升用户体验和用户黏度就非常有帮助.

其它

在社交软件中查找共同好友. 以及互联网产品中衡量用户量, 用户规模非常有帮助(主要是按照浏览量等指标来确定, 如果同一个用户多次访问, 就会去重访问信息, 这样有助于准确地提供用户规模等信息). 

Zset有序集合

简而言之, 它还是一种集合, 但是与集合不同, 它在里面引入了一个浮点类型 -- 分数(score)这个概念, 我们可以通过这个分数作为排序依据, 使其有序(之前如list中是使用下标的概念).  

比如我们按照伤害对如下植物进行排序:

有序集合提供了指定分数和元素的范围查找, 计算成员排名等功能, 合理利用有序集合, 能解决很多问题.

普通指令

zadd

功能: 添加或者更新指定的元素以及关联的分数到zset中, 分数应该符合double类型

语法: 

zadd key [nx | xx] [gt | lt] [ch] [incr] score member [score member...] (注: 分数可重复)

相关选项介绍: 

xx|nx: xx仅仅用于更新存在的元素, 不添加新元素; nx可以更新未存在的元素(不写默认为nx)

gt | lt : 如果要更新分数, 发现比现在给定的分数大(小), 此时就更新成功, 否则不更新.

ch: 默认情况下, zadd返回的是本次添加的元素个数, 但指定这个选项之后, 就会还包含本次更新的元素个数.

incr: 此时命令类似zincrby 的效果, 将元素分数加上指定的分数, 此时只能指定一个元素/分数. 

时间复杂度: O(logN): 因为要找到插入元素的位置, 就会使用类似二分查找这种方式寻找.

返回值:  本次添加的元素个数.

 

其余参数可以自行测试.

zcard

功能: 获取zset中的元素数目

语法:

zcard key

返回值: zset中的元素个数. 

zcount

功能: 返回分数在min和max之间的元素个数, 默认情况下, min和max都是包含的, 可以通过 ( 排除.即一般情况下为闭区间, 使用(的那个数字的那个部分是开区间.

语法:

zcount key min max

时间复杂度: O(logN), 因为实际上在Zset内能够得知元素的位次, 因此我们只需要定位到min和max的位次, 然后相减即可. 

返回值: 满足条件的元素列表个数 

 

zrange

功能: 返回指定区间里的元素, 分数按照升序排序. 带上withscores可以把分数也返回.

语法:

 zrange key start stop [withscores]

此处的[start, stop]为下标构成的区间,  从0开始, 支持负数.

时间复杂度: O(logN + M), 先找到start/ stop, 然后M是指start与stop之间的元素数目.

返回值: 区间里的元素列表.

zrevrange

功能: 返回指定区间里的元素, 分数按降序排序, 带上withscores也可以将分数返回.

语法:

zrevrange key start stop [withscores]

时间复杂度: O(logN + M)

返回值: 区间元素列表.

 

 zrangebyscore

返回分数在min, max之间的元素, 默认情况下, min和max都是包含的, 可以通过 ( 排除.

语法:

zrangebyscore key min max

时间复杂度: O(logN + M)

返回值: 区间的元素列表 

zpopmax/zpopmin

删除并返回分数最高/低的count个元素

语法:

zpopmax/zpopmin key [count]

时间复杂度: O(logN * M) N是有序集合数目, M是要删除数目, 虽然我们记录了次序, 但我们是通过M次普通删除(每次删一个), 因此时间复杂度是这个.

返回值: 分数和元素列表.

bzpopmax/bzpopmin

功能: zpopmax/zpopmin阻塞版本.

语法:

bzpopmax/bzpopmin key [key...] timeout 

时间复杂度: O(N)

zrank/zrevrank

功能: 返回指定元素的排名, 升序/降序

语法:

zrank/zrevrank key member

时间复杂度: O(logN)

返回值, 排名. 

 

zscore

 功能: 返回指定元素的分数.

语法:

zscore key member

时间复杂度: O(1) 

返回值: 分数

zrem

功能: 删除指定元素.

语法:

zrem key member [member...] 

时间复杂度: O(M * logN)

返回值: 本次操作删除的元素个数.

 zremrangebyrank

功能: 按照排序, 升序删除指定范围的元素, 左闭右闭.

语法:

zremrangebyrank key start stop

时间复杂度: O(logN + M)

返回值: 本次操作的元素个数.

zremrangebyscore

功能: 按照分数删除指定范围的元素, 左闭右闭.

语法

zremrangebyscore key min max

时间复杂度: O(logN + M)

返回值: 本次操作删除的元素数目. 

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

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

相关文章

链栈的存储

单向链表在栈中的存储 typedef struct StackNode {SElemType data;struct StackNode* next; }StackNode, *LinkStack; LinkStack S; //链栈初始化 void InitStack(LinkStack& S) {S NULL;return OK; } //判断链栈是否为空 Status StackEmpty(LinkStack S) {if (S NU…

将具有传统IP的设计迁移到Vivado设计套件

将具有传统IP的设计迁移到Vivado设计套件 概述 AMD Vivado™设计套件允许您从CORE Generator™工具迁移IP设计。你可以 还可以将IP迁移到Vivado Design Suite的最新版本。 重要!Vivado集成开发环境(IDE)要求IP、实例化和 端口名都是小写的。将…

Spring 模拟管理Web应用程序

MVC:Model View Controller 1)controller:控制层(Servlet是运行服务器端,处理请求响应java语言编写技术) 2)service:业务层(事务,异常) 3&#xf…

视频号小店的保证金是多少钱?2024最新收费标准,一篇了解!

哈喽~我是电商月月 现实社会,干什么都需要交钱,就连上班,路费也得掏钱 想要入驻视频号小店,在视频号里卖货赚钱,就要缴纳类目保证金 那到底要缴多少钱呢? 今天,月月就把最新的收费标准分享给…

轻松拿捏C语言——【字符串函数】的使用及模拟实现

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🎉创作不易,请多多支持🎉 🌈感谢大家的阅读、点赞、收藏和关注💕 🌹如有问题,欢迎指正 感谢 目录 一、…

mysql 拼接两个字段的值 使用CONCAT的函数

CONCAT()函数拼接两个不用字段的值,最后在一个字段里面显示出来,具体实例如下: 下面这个案例就行把SSSHENGBH、SSSBH、SSXBH、SSXZBH字段值拼接到一个字段里面进行显示 select CONCAT(SSSHENGBH,SSSBH,SSXBH,SSXZBH) FROM BLT_JBXXJLB

3D 生成重建013-ProlificDreamer将SDS拓展到VSD算法进行高质量的3D生成

3D 生成重建013-ProlificDreamer将SDS拓展到VSD算法进行高质量的3D生成 文章目录 0论文工作1论文方法2效果 0论文工作 **分数蒸馏采样(SDS)**通过提取预先训练好的大规模文本到图像扩散模型,在文本到3d生成方面显示出了巨大的前景&#xff0…

Windows VS2022 C语言使用 sqlite3.dll 访问 SQLite数据库

今天接到一个学生C语言访问SQLite数据库的的需求: 第一步,SQLite Download Page下载 sqlite3.dll 库 下载解压,发现只有两个文件: 于是使用x64 Native Tools Command Prompt 终端 生成 sqlite3.lib 和 sqlite3.exp文件 LIB -def:sqlite3.def -out:sqlite3.lib -machin…

广告圈策划大师课:活动策划到品牌企划的深度解析

对于刚接触营销策划的新人来说,在这个知识密集型行业里生存,要学习非常多各种意思相近的概念,常常让人感到头疼,难以区分。 这里对这些策划概念进行深入解析,帮助您轻松理清各自的含义和区别。 1. 活动策划&#xff…

C++ 字符串处理-将字符串转成大写或小写

1. 关键词2. strutil.h3. strutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 C 字符串处理 将字符串转成大写或小写 跨平台 2. strutil.h #include <string> namespace cutl {/*** brief Convert a string to upper case.** param str the string to be conve…

微信小程序自定义头部

1.在对应界面的json文件&#xff0c;将navigationStyle属性设置为“custom” "navigationStyle":"custom" 2. 状态栏的高度可以通过 wx.getSystemInfo() 获取。 胶囊按钮的信息可以通过 wx.getMenuButtonBoundingClientRect() 获取。 导航栏高度状态栏…

截图工具PixPin(比Snipaste更强大)

PixPin官网链接&#xff1a;https://pixpinapp.com/ 最近新出的一款截图工具PixPin&#xff0c;比Snipaste功能多一些。在Snipaste功能基础上&#xff0c;还支持长截图&#xff0c;截动图&#xff0c;文本识别。

C++11-独占指针unique_ptr原理实现

独占指针&#xff08;unique_ptr&#xff09;是C11标准引入的一种智能指针&#xff0c;用于独占管理动态分配对象的生命周期。unique_ptr确保对象在同一时间只有一个所有者&#xff0c;防止对象被多个指针共享。下面是unique_ptr的实现原理及其内存管理机制。 unique_ptr 的基…

618好物推荐,省心省力省钱包!

一年一度的“618”购物狂欢节又来啦&#xff01;大家都心动了吧&#xff0c;购物车也早就堆满了心仪的好物。别急&#xff0c;别急&#xff0c;让我给你们推荐几款真正值得入手的宝贝&#xff0c;让你们省心、省力还省钱包&#xff01;不管是给自己添置点新装备&#xff0c;还是…

Vue实现一个动态添加行的表格?

在Vue中实现一个动态添加行的表格可以通过以下步骤来完成&#xff0c;如下所示。 步骤 1&#xff1a;设置表格的数据模型 在Vue组件中定义表格的数据模型&#xff0c;通常使用一个数组来存储表格的数据。每一行数据可以是一个对象&#xff0c;对象的属性对应表格的列。 data(…

MFC 编程:Windows 桌面应用程序开发框架

目录 一.概述 二.MFC 与 Win32 的关系 三.CObject 类 1.CObject 类的主要功能 2.CObject 类的派生类 3.CObject 类成员函数 4.内存管理 对象的创建 对象的销毁 引用计数 复制对象 5.序列化 序列化的概念 CObject 类的序列化功能 序列化示例 6.运行时类型信息 …

uniapp App去除iOS底部安全区域白边

未设置的情况下&#xff0c;iOS底部安全区域白边 如图&#xff1a; 去除方法&#xff1a; 在 mainfest.json 中加入一下代码&#xff1a; "safearea" : {"bottom" : {"offset" : "none"} }, 去除效果展示&#xff1a;

Git使用笔记

Git使用笔记 介绍Git推送指定的提交 介绍 Git推送指定的提交 在Git中&#xff0c;如果只想推送一个特定的提交&#xff08;commit&#xff09;&#xff0c;而不是整个分支&#xff0c;可以使用以下步骤&#xff1a; 首先&#xff0c;找到你想要推送的提交的哈希值。通过运行g…

开放式耳机2024超值推荐!教你如何选择蓝牙耳机!

开放式耳机的便利性让它在我们的日常生活中变得越来越重要。它让我们摆脱了传统耳机的限制&#xff0c;享受到了更多的自由。不过&#xff0c;市面上的开放式耳机种类繁多&#xff0c;挑选一款既实用又实惠的产品确实需要一些小窍门。作为一位对开放式耳机颇有研究的用户&#…