redis—Set集合

目录

前言

1.常见命令

2.使用场景


前言

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中1)元素之间是无序的2)元素不允许重复,如图2-24所示。一个集合中最多可以存储22 - 1个元素。Redis 除了支持集合内的增删查改操作,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多问题。
图2-24集合类型

1.常见命令

SADD
将一个或者多个元素添加到set中。注意,重复的元素无法添加到set中。
语法:

SADD key member [member ...]

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值:本次添加成功的元素个数。
示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"

SMEMBERS
获取一个set中的所有元素,注意,元素间的顺序是无序的。
语法:

SMEMBERS key 

命令有效版本: 1.0.0之后
时间复杂度: O(N) 
返回值:所有元素的列表。
示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"

SISMEMBER
判断一个元素在不在set中。
语法:

SISMEMBER key member 
redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0

SCARD
获取一个set的基数(cardinality) ,即set中的元素个数。
语法:

SCARD key 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值: set 内的元素个数。
示例:

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2

SPOP
从set中删除并返回一个或者多个元素。注意,由于set内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。
语法:

SPOP key [count] 

命令有效版本: 1.0.0 之后
时间复杂度: O(N), n是count
返回值:取出的元素。
示例:

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset
"one"
redis> SMEMBERS myset
1) "three"
2) "two"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3
1) "three"
2) "four"
3) "two"
redis> SMEMBERS myset
1) "five"

SMOVE
将一个元素从源set取出并放入目标set中。
语法:

SMOVE source destination member 

命令有效版本: 1.0.0之后
时间复杂度: 0(1)
返回值: 1表示移动成功,0表示失败。
示例:

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myotherset "three"
(integer) 1
redis> SMOVE myset myotherset "two"
(integer) 1
redis> SMEMBERS myset
1) "one"
redis> SMEMBERS myotherset
1) "three"
2) "two"

SREM 
将指定的元素从set中删除。
语法
:

SREM key member [member ...] 

命令有效版本: 1.0.0之后
时间复杂度: O(N), N是要删除的元素个数.
返回值:本次操作删除的元素个数。
示例:

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "three"
2) "two"

集合间操作
交集(inter) 、并集(union) 、差集(diff) 的概念如图2-25所示。.
图2-25集合求交集、并集、差集

SINTER
获取给定set的交集中的元素。
语法:

SINTER key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度:0(N*M),N是最小的集合元素个数.M是最大的集合元素个数.
返回值:交集的元素。
示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "c"

SINTERSTORE
获取给定set的交集中的元素并保存到目标set中。
语法:

SINTERSTORE destination key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度:O(N*M),N是最小的集合元素个数.M是最大的集合元素个数.
返回值:交集的元素个数。
示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTERSTORE key key1 key2
(integer) 1
redis> SMEMBERS key
1) "c"

SUNION
获取给定set的并集中的元素。
语法:

SUNION key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度: O(N), N给定的所有集合的总的元素个数.
返回值:并集的元素。
示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

SUNIONSTORE 
获取给定set的并集中的元素并保存到目标set中。
语法:

SUNIONSTORE destination key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度: 0(N), N给定的所有集合的总的元素个数.
返回值:并集的元素个数。
示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNIONSTORE key key1 key2
(integer) 5
redis> SMEMBERS key
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

SDIFF
获取给定set的差集中的元素。
语法:

SDIFF key [key ...] 

命令有效版本: 1.0.0之后
时间复杂度: O(N), N给定的所有集合的总的元素个数.
返回值:差集的元素。
示例: 

redis> SADD key1 "a" 
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"

SDIFFSTORE
获取给定set的差集中的元素并保存到目标set中。
语法:

SDIFFSTORE destination key [key ...] 

命令有效版本: 1.0.0 之后
时间复杂度: O(N), N给定的所有集合的总的元素个数.
返回值:差集的元素个数。
示例:

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFFSTORE key key1 key2
(integer) 2
redis> SMEMBERS key
1) "a"
2) "b"

命令小结
表2-6总结了集合类型的常见命令,开发人员可以根据自身需求进行选择。
表2-6集合类型命令

内部编码
集合类型的内部编码有两种:
●intset (整数集合) :当集合中的元素都是整数并且元素的个数小于set-max- intset-entries配置
(默认512个)时,Redis 会选用intset来作为集合的内部实现,从而减少内存的使用。
●hashtable (哈希表) :当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合
的内部实现。
1)当元素个数较少并且都为整数时,内部编码为intset:

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset" 

2)当元素个数超过512个,内部编码为hashtable:

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 513
127.0.0.1:6379> object encoding setkey
"hashtable"

3)当存在元素不是整数时,内部编码为hashtable:

127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"

2.使用场景

集合类型比较典型的使用场景是标签(tag) 。例如A用户对娱乐、体育板块比较感兴趣,B用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。例如一个电子商务网站会对不同标签的用户做不同的产品推荐。
下面的演示通过集合类型来实现标签的若干功能。
1)给用户添加标签

sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4

2)给标签添加用户

sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28

3)删除用户下的标签

srem user:1:tags tag1 tag5
...

4)删除标签下的用户

srem tag1:users user:1
srem tag5:users user:1
...

5)计算用户的共同兴趣标签

sinter user:1:tags user:2:tags

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

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

相关文章

前端 .then 返回有数据但是return 不出来 ,并 解决处理后的 Promise下的Object

解决方法就是&#xff1a;async await async声明方法为异步方法&#xff0c;await等待异步操作执行完。 &#xff08;async函数return的是Promise&#xff0c;await Promise后得到Object&#xff09; 注意的是&#xff0c;异步方法返回值为peomise<>&#xff0c;接收时需…

【计算机网络】【练习题】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 该题目描述一个网络中传播时延&#xff08;Transmission Delay&#xff09;的例子。题目如下&#xff1a; 二、问题解答&#xff08;个人&#xff09; 笔者第3问采用均值不等式求解。标答中采用求导数的方法求极值。似乎均值…

学术精选,EI检索2024年计算机应用系统与微芯片技术国际会议

2024年计算机应用系统与微芯片技术国际会议(ICCASMT 2024) 2024 International Conference on Computer Application Systems and Microchip Technology(ICCASMT 2024) 数据库&#xff1a;EI,CPCI,CNKI,Google Scholar等检索 一、【会议简介】 &#x1f514; ​2024年计算机应用…

macOS Sonoma 14.3(23D56)发布(附黑/白苹果系统镜像)

系统镜像下载:黑果魏叔 系统介绍 黑果魏叔12 月 23 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.3 更新&#xff08;内部版本号&#xff1a;23D56&#xff09;&#xff0c;本次更新距离上次发布隔了 34 天。 小部件套件 小部件在更多地方变得更加强大。现在…

JS之打地鼠案例

需要素材的同学可以私信我 效果图&#xff1a; 上代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style>* {margin: 0;padding: 0;}.box {position: relative;width: 320px;heigh…

OC-字符串

前言 本篇文章介绍OC的字符串 字符串常量 要使用Objective-C语言创建一个常量字符串对象&#xff0c;需要在字符串开头放置 一个字符&#xff0c;下面的语句创建了一个常量字符串 "Programoning is fun" NSLog NSLog函数可以打印格式化对象&#xff0c;类似于C语…

JavaScript进阶教程- 箭头函数和this关键字

在JavaScript中&#xff0c;箭头函数是ES6中引入的一种新的函数语法。它们提供了一种更简洁的方式来写函数&#xff0c;并且对 this 关键字的行为有特殊的处理。 箭头函数&#xff08;Arrow Functions&#xff09; 箭头函数使用一个“箭头”&#xff08;>&#xff09;定义…

数据结构之树

树 前面文章讲的线性表&#xff0c;不论数组还是链&#xff0c;都是“一对一”的关系&#xff0c;本文章节让我们来认识一下“一对多”关系的数据结构——树&#xff08;Tree&#xff09;。 树结构分为二叉树和三叉树等&#xff0c;如下图所示。常用的就是二叉树&#xff0c;因…

深度学习(5)--Keras实战

目录 一.Keras基础概念 二.如何跑通Keras项目 2.1.在cmd上跑通 2.2.在PyCharm上跑通 一.Keras基础概念 Keras是深度学习中的一个神经网络框架&#xff0c;是一个高级神经网络API&#xff0c;用Python编写&#xff0c;可以在TensorFlow&#xff0c;CNTK或Theano之上运行。 …

开发相关的工具及AI算法调研【降本增效】

前置说明: 看各个章节总结即可了解章节调研结果 开发降本增效调研可用工具参考以下几块: 总结 以下是实现软件开发降本增效的主要流程,将调研涉及该过程的可用工具或方法。 1、需求收集和分析 效率从软件项目的最初阶段开始——需求收集和分析阶段。这一阶段经常被忽视…

如何保护电脑数据?电脑数据怎么保护?

电脑会储存大量的重要数据&#xff0c;而为了避免数据泄露&#xff0c;必须要使用专业的方式进行保护。那么&#xff0c;要如何保护电脑数据呢&#xff1f;下面我们就来了解一下。 文件夹加密超级大师 文件夹加密超级大师是一款专业的电脑数据加密软件&#xff0c;拥有强大的文…

医疗天使禅道使用工作流程:优化医疗服务的必经之路

目录 博客前言 医疗天使禅道使用工作流程 一.使用最高管理员账号admin管理组织结构 1.新增用户 产品经理使用禅道 1.创建产品 2.添加产品模块​编辑 3.添加产品计划 4.添加产品需求 5.创建项目 6.设置团队 项目经理使用禅道 1.关联需求 2.分解任务 测试主管使用禅…

Swiper轮播图后端接口实现

mybatis-plus:global-config:db-config:id-type: auto #id生成规则&#xff1a;数据库id自增configuration:map-underscore-to-camel-case: false # 开启驼峰功能auto-mapping-behavior: full # 自动映射任何复杂的结果log-impl: org.apache.ibatis.logging.stdout.StdOutImpl…

200G数据中心:QSFP56和QSFP-DD光模块如何选择?

随着光通信与互联网技术的迅猛发展&#xff0c;网络数据流量的需求呈指数级增长&#xff0c;电信骨干网流量年均增速高达50%至80%。为了应对日益攀升的数据传输需求&#xff0c;光通信速率实现了从10G、25G、40G到当前主流的100G、200G、400G甚至更高规格的持续演进。 在此背景…

Flutter中状态管理选项的比较:利弊探索

Flutter 应用程序开发的一个关键方面是管理状态&#xff0c;这确保了整个应用程序的数据一致性和更新。然而&#xff0c;Flutter 提供了多种状态管理解决方案&#xff0c;每种解决方案都有自己的优缺点。在这篇博客中&#xff0c;我们将探讨 Flutter 中一些流行的状态管理选项&…

TestNG @BeforeClass 注解

目录 那么&#xff0c;这个带BeforeClass注释的方法什么时候执行呢&#xff1f; 如果我们在一个类中放置多个BeforeClass注释方法会发生什么&#xff1f; 在这篇文章中&#xff0c;我们将讨论TestNG中的BeforeClass注释。BeforeClass注释方法将在特定类的测试用例之前运行。…

Linux-共享内存

文章目录 前言一、system V共享内存申请共享内存挂载共享内存删除共享内存挂载删除共享内存 二、示例代码三.运行效果 前言 在这之前我们已经学习了两种进程间通信方式&#xff1a;匿名管道和命名管道。 从我们之前的学习已经知道&#xff0c;想让多个进程间进行通信就需要让他…

Spring框架--Spring入门实验二之依赖注入

目录 引言 1、依赖注入之setter注入 2、依赖注入之构造器注入 3、为类类型属性赋值&#xff08;依赖注入之对象注入&#xff09; 4、为数组类型属性赋值 引言 Spring框架中的依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;是一种设计模式和编程实践…

前端JavaScript篇之intanceof 操作符的实现原理及实现、为什么0.1+0.2 ! == 0.3,如何让其相等

目录 intanceof 操作符的实现原理及实现为什么0.10.2 ! 0.3&#xff0c;如何让其相等 intanceof 操作符的实现原理及实现 instanceof 是一个用于检查对象是否属于特定类的 JavaScript 操作符。它返回一个布尔值&#xff0c;指示对象是否是特定类的实例或者原型链中是否存在该…

Tensorflow 中的损失函数 —— loss 专题汇总

回归和分类是监督学习中的两个大类。自学过程中&#xff0c;阅读别人代码时经常看到不同种类的损失函数&#xff0c;到底 Tensorflow 中有多少自带的损失函数呢&#xff0c;什么情况下使用什么样的损失函数&#xff1f;这次就来汇总介绍一下。 一、处理回归问题 1. tf.losses…