Redis - Set 集合

news/2024/11/9 0:03:08 标签: redis, bootstrap, javascript

  一、基本了解

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

图2-24集合类型

二、普通命令

2.1、SADD

将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中。

语法:

 SADD key member [member ...]

命令有效版本:1.0.0之后

时间复杂度:O(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"

2.1、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"

2.2、SISMEMBER

判断⼀个元素在不在set中。

语法:

SISMEMBER key member

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在。

⽰例:

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

2.3、SCARD

获取⼀个set的基数(cardinality),即set中的元素个数。

语法:

 SCARD key

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:set内的元素个数。

⽰例:

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

2.4、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"

2.4、SMOVE

将⼀个元素从源set取出并放⼊⽬标set中。

语法:

 SMOVE source destination member

命令有效版本:1.0.0之后

时间复杂度:O(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"

2.5、SREM

将指定的元素从set中删除。

语法:

 SREM key member [member ...]

时间复杂度: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集合求交集、并集、差集

3.1、SINTER 

获取给定set的交集中的元素。

语法:

 SINTER 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> SINTER key1 key2
 1) "c"

3.2、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"

3.3、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"

3.4、SUNIONSTORE

获取给定set的并集中的元素并保存到⽬标set中。

语法:

SUNIONSTORE 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> SUNIONSTORE key key1 key2
 (integer) 5
 redis> SMEMBERS key
 1) "a"
 2) "c"
 3) "e"
 4) "b"
 5) "d"

3.5、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"

3.6、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"

3.7、命令⼩结

表2-6集合类型命令

命令时间复杂度
sadd key element[element...]O(k),k是元素个数
srem key element[element...]O(k),k是元素个数
scard keyO(1)
sismember key elementO(1)
srandmember key[count]O(n),n是count
spop key[count]O(n),n是count
smembers keyO(k),k是元素个数
sinter key[key...]  sitnerstoreO(m*k),k是⼏个集合中元素最⼩的个数,m是键个 数
sunion key[key...]  sunionstoreO(k),k是多个集合的元素个数总和
sdiff key[key...]  sdiffstoreO(k),k是多个集合的元素个数总和

四、内部编码

集合类型的内部编码有两种:

  • 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"

五、使⽤场景

        集合类型⽐较典型的使⽤场景是标签(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.niftyadmin.cn/n/5744599.html

相关文章

keil-C51 linux下开发小记

author: hjjdebug date: 2024年 11月 07日 星期四 15:23:40 CST description: keil-C51 linux下开发小记 想了解一下学习型红外遥控器. 淘宝上买了一块开发版,资料还是挺全的. 有demo 代码,原理图. 视频教程。 cpu 是51单片机,型号为 STC8H3K…

如何挑选开放式耳机?五款热门测评告诉你答案

在当前的开放式耳机市场中,不少品牌都宣称自家产品能达到 HIFI 级音质。可实际情况是,经过测试,超过 90%的用户反映使用开放式耳机时存在诸多问题,比如音质单薄无力、失真严重,还有漏音过大等情况。 从市场层面分析&am…

Linux 常用操作指令大揭秘(上)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 💯…

认识类和对象

认识类 类是用来对一个实体 ( 对象 ) 来进行描述的,主要描述该实体(对象)具有哪些属性(外观尺寸等),哪些功能(用来干啥) 类中包含的内容称为 类的成员。属性主要是用来描述类的,称之为 类的成员属性或者 类成员变量。方法主要说明类具有哪些功…

JavaScript 网页设计详解教程

JavaScript 网页设计详解教程 引言 JavaScript 是一种广泛使用的编程语言,主要用于网页开发。它使得网页具有动态交互性,能够响应用户的操作。随着前端开发的不断发展,JavaScript 已成为现代网页设计中不可或缺的一部分。本文将详细介绍 Ja…

《AI 大模型:重塑软件开发新生态》

《AI 大模型:重塑软件开发新生态》 一、AI 大模型引领软件开发新潮流二、AI 大模型在软件开发中的优势(一)提高开发效率(二)减少错误与提升质量(三)激发创新与拓展功能 三、AI 大模型在软件开发…

【青牛科技】应用方案|D2587A高压大电流DC-DC

1、概述 D2587A稳压器是专为反激式、升压和正向转换器应用而设计的单片集成电路。该器件提供四种不同的输出电压版本:3.3V、5V、12V 和可调节电压。这些稳压器需要的外部元器件很少,因此具有成本效益,并且易于使用。该电源开关是一款5A NPN器…

梧桐数据库SQL分析对比之订单最多的客户

一、背景说明 在特定的业务场景,许多业务部门需要推送业务订单最多的客户。需要编写一个解决方案,找出业务订单最多的客户。 本次以三种不同数据库进行分析和用例讲解,分别是梧桐数据库,mysql ,oracle 。 二、表结构…