【存储中间件】Redis核心技术与实战(一):Redis入门与应用(常用数据结构:集合set、有序集合ZSET)

【存储中间件】Redis核心技术与实战(一):Redis入门与应用(常用数据结构:集合set、有序集合ZSET)

文章目录

在这里插入图片描述


个人主页:道友老李
欢迎加入社区:道友老李的学习社区

Redis入门与应用

Redis常用数据结构

集合(set)

image.png

集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。

一个集合最多可以存储2的32次方-1个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。

集合内操作命令
sadd 添加元素

允许添加多个,返回结果为添加成功的元素个数

image.png
srem 删除元素

允许删除多个,返回结果为成功删除元素个数

image.png
scard 计算元素个数
image.png
sismember 判断元素是否在集合中

如果给定元素element在集合内返回1,反之返回0

image.png
srandmember 随机从集合返回指定个数元素

指定个数如果不写默认为1

image.png
spop 从集合随机弹出元素

同样可以指定个数,如果不写默认为1,注意,既然是弹出,spop命令执行后,元素会从集合中删除,而srandmember不会。

image.png
smembers 获取所有元素(不会弹出元素)

返回结果是无序的

image.png
集合间操作命令

现在有两个集合,它们分别是set1和set2

image.png
sinter 求多个集合的交集
image.png
suinon 求多个集合的并集
image.png
sdiff 求多个集合的差集
image.png
将交集、并集、差集的结果保存
sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...] 

集合间的运算在元素较多的情况下会比较耗时,所以 Redis提供了上面三个命令(原命令+store)将集合间交集、并集、差集的结果保存在destination key中,例如:

image.png
使用场景

集合类型比较典型的使用场景是标签(tag)。例如一个用户可能对娱乐、体育比较感兴趣,另一个用户可能对历史、新闻比较感兴趣,这些兴趣点就是标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于用户体验以及增强用户黏度比较重要。

例如一个电子商务的网站会对不同标签的用户做不同类型的推荐,比如对数码产品比较感兴趣的人,在各个页面或者通过邮件的形式给他们推荐最新的数码产品,通常会为网站带来更多的利益。

除此之外,集合还可以通过生成随机数进行比如抽奖活动,以及社交图谱等等。

有序集合(ZSET)

image.png

有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。

有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同。

有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。

集合内操作命令
zadd添加成员
image.png

返回结果代表成功添加成员的个数

要注意:

image.png

zadd命令还有四个选项nx、xx、ch、incr 四个选项

nx: member必须不存在,才可以设置成功,用于添加。

xx: member必须存在,才可以设置成功,用于更新。

ch: 返回此次操作后,有序集合元素和分数发生变化的个数

incr: 对score做增加,相当于后面介绍的zincrby

zcard 计算成员个数
image.png
zscore 计算某个成员的分数
image.png

如果成员不存在则返回nil

zrank计算成员的排名
image.png

zrank是从分数从低到高返回排名

zrevrank反之

很明显,排名从0开始计算。

zrem 删除成员
image.png

允许一次删除多个成员。

返回结果为成功删除的个数。

zincrby 增加成员的分数
image.png
zrange和zrevrange返回指定排名范围的成员

有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。如果加上
withscores选项,同时会返回成员的分数

image.png
image.png
zrangebyscore返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key max min [withscores][limit offset count] 

其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如下面操作从低到高返回200到221分的成员,withscores选项会同时返回每个成员的分数。

同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:

image.png
image.png
image.png
zcount 返回指定分数范围成员个数

zcount key min max

image.png
zremrangebyrank 按升序删除指定排名内的元素

zremrangebyrank key start end

zremrangebyscore 删除指定分数范围的成员

zremrangebyscore key min max

集合间操作命令
zinterstore 交集

zinterstore

image.png

这个命令参数较多,下面分别进行说明

destination:交集计算结果保存到这个键。

numkeys:需要做交集计算键的个数。

key [key …]:需要做交集计算的键。

weights weight
[weight …]:每个键的权重,在做交集计算时,每个键中的每个member 会将自己分数乘以这个权重,每个键的权重默认是1。

aggregate sum/
min |max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum。

不太好理解,我们用一个例子来说明。(算平均分)

image.png
image.png
zunionstore 并集

该命令的所有参数和zinterstore是一致的,只不过是做并集计算,大家可以自行实验。

使用场景

有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。

Read more

【算法详解】理解KMP,真的那么难吗?—— 一篇讲透它的核心思想

【算法详解】理解KMP,真的那么难吗?—— 一篇讲透它的核心思想

🫧 励志不掉头发的内向程序员:个人主页  ✨️ 个人专栏: 《C++语言》《Linux学习》 🌅偶尔悲伤,偶尔被幸福所完善 👓️博主简介: 文章目录 * 前言 * 一、相关概念 * 二、前缀函数 * 三、计算前缀函数 * 四、用前缀函数解决字符串匹配 * 五、kmp 算法模板 * 六、next 数组版本 * 七、周期和循环节 * 总结 前言 本文用尽量详细的语言来讲解说明 kmp 算法内容,学习之前需要知道一点点动态规划的基础,如果不知道最好去了解了解。我们一起来看看算法吧。 一、相关概念 在学习 kmp 算法之前,我们得先提前了解最基本的 “ 动态规划 ” 的知识,否则可能学习的时候会有一些困难,因为它的原理类似于动态规划。 字符串: * 用字符构成的的序列就是字符串。 这个概念很简单,但是我们这里有个小技巧:就和动态规划那样,

数据结构:单链表(2)

数据结构:单链表(2)

目录 前言  一、实现单链表 介绍: 1.链表节点查找 2.链表在指定位置之前或之后插入元素 (1)链表在指定位置之前插入元素 举实例: (2)链表在指定位置之后插入元素 3.链表在指定位置删除或指定位置之后删除 (1)链表在指定位置删除 (2)链表在指定位置之后删除 三、举实例,测试代码(包括所有代码展现) 1.h 1.cpp main.cpp 四、链表的分类 按节点连接方向分类 按是否有头节点分类   总结 前言  上篇文章讲解了单链表的知识,包括:单链表的概念,单链表的结构、实现单链表(单链表的尾插、单链表的头插、单链表的尾删、单链表的头删)知识的相关内容,实现单链表其余的函数、链表的分类、单链表算法题知识的相关内容,为本章节知识的内容。

Flutter for OpenHarmony 实战:Material Color Utilities — 算法驱动的动态换肤

Flutter for OpenHarmony 实战:Material Color Utilities — 算法驱动的动态换肤

Flutter for OpenHarmony 实战:Material Color Utilities — 算法驱动的动态换肤 前言 随着 Flutter for OpenHarmony 进入全场景智慧时代,UI 的“个性化”与“自适应”成为了衡量应用质感的重要指标。Material Design 3 (M3) 引入了颠覆性的 动态颜色 (Dynamic Color) 系统,它可以从一张壁纸或用户的特定配色中提取出一整套和谐、对比度合格的主题。 你是否好奇:这些颜色是如何生成的?为什么生成的蓝色看起来既专业又不刺眼?答案就在 material_color_utilities 中。这是谷歌 M3 配色方案背后的核心算法库。本文将带你深入底层,由算法驱动鸿蒙应用的色彩革命。 二、M3 动态配色的核心黑科技 2.1 HCT

HDFS核心组件深度解析:分布式文件系统的架构基石

HDFS核心组件深度解析:分布式文件系统的架构基石

HDFS核心组件深度解析:分布式文件系统的架构基石 * 引言:HDFS——大数据的存储基石 * 一、HDFS架构全景 * 1.1 主从架构设计 * 1.2 核心组件概览 * 二、NameNode:HDFS的"大脑" * 2.1 核心职责 * 2.2 元数据存储结构 * 2.3 内存与持久化 * 2.4 单点故障问题 * 三、DataNode:HDFS的"数据仓库" * 3.1 核心职责 * 3.2 工作流程 * 3.3 数据存储结构 * 四、Secondary NameNode:NameNode的&