Redis Set类型

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中

1)元素之间是无序的

2)元素不允许重复

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

集合类型

在这里插入图片描述

Set命令

sadd

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

语法

SADD key member [member ...]

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

smembers

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

语法

SMEMBERS key

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

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

spop

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

语法

SPOP key [count]

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

srandmember

用于从集合中随机返回一个元素。该命令提供了一个可选参数count,用于指定返回的元素数量。当count值为正数时,返回的元素不重复;当count值为负数时,返回的元素可以重复。

语法

SRANDMEMBER key [count]
  • key:要从中随机获取元素的集合的键。
  • count(可选):要返回的元素数量。

示例

127.0.0.1:6379> sadd key 1 2 3 4
(integer) 4
127.0.0.1:6379> srandmember key
"4"
127.0.0.1:6379> srandmember key
"3"
127.0.0.1:6379> srandmember key
"1"
127.0.0.1:6379> srandmember key
"4"
127.0.0.1:6379> srandmember key 3
1) "3"
2) "2"
3) "1"

smove

smove用于将元素从一个集合移动到另一个集合。如果元素被成功移动,命令返回1,否则返回0。

语法

SMOVE source destination member
  • source:源集合的键。
  • destination:目标集合的键。
  • member:要移动的元素。

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

srem

SREM用于从集合中删除一个或多个元素。此命令会返回成功删除元素的数量。

语法:

SREM key member [member ...]
  • key:集合的键名。
  • 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"

scard

SCARD用于获取集合(Set)的成员数。

语法

SCARD key

时间复杂度:O(1)

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

示例

redis> sadd myset "Hello"
(integer) 1
redis> sadd myset "World"
(integer) 1
redis> scard myset
(integer) 2

集合间操作

集合求交集、并集、差集

在这里插入图片描述

sinter/sinterstore

sinter

SINTER用于计算多个集合的交集。这个命令返回所有给定集合的交集。如果其中一个集合为零元素集合,结果也将是零元素集合。如果没有给定任何集合,结果是一个空集。

语法:

SINTER key [key ...]
  • key:一个或多个集合的键。

时间复杂度:O(N *M),N是最小的集合元素个数.M是最大的集合元素个数.

返回值:交集的元素。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sinter key1 key2
1) "c"

sinterstore

SINTERSTORE用于计算多个集合的交集,并将结果存储在新的集合中。如果目标集合已存在,那么这个集合将被覆盖。执行完命令后,返回结果集中的元素数量。

语法

SINTERSTORE destination key [key ...]
  • destination:新集合的键,用于存储计算出的交集。
  • key:一个或多个集合的键。

时间复杂度:O(N *M),N是最小的集合元素个数.M是最大的集合元素个数.

返回值:交集的元素个数。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sinterstore key key1 key2
(integer) 1
redis> smembers key   #存储到了新的key中
1) "c"

sunion/sunionstore

sunion

SUNION用于计算多个集合的并集。这个命令返回一个包含所有给定集合的并集的新集合。如果没有给定任何集合,结果是一个空集。

语法

SUNION key [key ...]
  • key:一个或多个集合的键。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素。

示例

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

sunionstore

SUNIONSTORE用于计算多个集合的并集,并将结果存储在新的集合中。如果目标集合已存在,那么这个集合将被覆盖。执行完命令后,返回结果集中的元素数量。

语法

SUNIONSTORE destination key [key ...]
  • destination:新的集合名。如果它已经存在,会被覆盖。
  • key [key ...]:一个或多个要求并集的集合。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素个数。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sunionstore key key1 key2
(integer) 5
redis> smembers key
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"

sdiff/sdiffstore

sdiff

SDIFF 用于返回名为 key 的第一个集合与其他集合之间的差集。换句话说,结果集中的每个元素都是第一个集合中存在,而在其他集合中不存在的元素。

语法

SDIFF key [key ...]
  • key 是想要从中获取差集的集合的键。
  • [key...]是想要与第一个集合进行差集操作的其他集合的键。方括号表示这些键是可选的,可以有一个或多个。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:差集的元素。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sdiff key1 key2
1) "a"
2) "b"
redis> sdiff key2 key1
1) "d"
2) "e"

sdiffstore

SDIFFSTORE 它的功能类似于 SDIFF,但是它不仅会返回差集,还会将差集保存到一个指定的 key 中。

语法

SDIFFSTORE destination key [key ...]
  • destination 是存储差集结果的新 key。

  • key 是想要从中获取差集的集合的键。

  • [key...]是想要与第一个集合进行差集操作的其他集合的键。方括号表示这些键是可选的,可以有一个或多个。

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:差集的元素个数。

示例

redis> sadd key1 "a" "b" "c"
(integer) 3
redis> sadd key2 "c" "d" "e"
(integer) 3
redis> sdiffstore key key1 key2
(integer) 2
redis> smembers key
1) "a"
2) "b"
redis> sdiffstore key key2 key1
(integer) 2
redis> smembers key
1) "d"
2) "e"

内部编码

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

  • 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

同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。例如一个电子商务网站会对不同标签的用户做不同的产品推荐。

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.hqwc.cn/news/283410.html

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

相关文章

链表之带头双向循环链表(C语言版)

我们之前已经介绍过链表的知识了,这里我们直接开始实现带头双向循环链表 数据结构之单链表(不带头单向非循环链表)-CSDN博客 第一步:定义结构体 //定义结构体 typedef int SLTDateType; typedef struct Listnode {SLTDateType d…

【消息中间件】Rabbitmq的基本要素、生产和消费、发布和订阅

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、消息队列的基本要素1.队列:queue2.交换机:exchange3.事件:routing_key4.任务:task 二、生产消费模式1.安装pika2.模拟生产者进程3.模…

Web前端-HTML(常用标签)

文章目录 1. HTML常用标签1.1 排版标签1)标题标签h (熟记)2)段落标签p ( 熟记)3)水平线标签hr(认识)4)换行标签br (熟记)5)div 和 span标签(重点)6)排版标签总结 1.2 标签属性1.3 图像标签img (重点)1.4 链…

shell子进程管理

简介 在我们平时写代码过程中,可能经常会遇到串行执行速度慢 ,串行无法执行多个任务,这时便需要使用子进程同时执行。使用父进程创建子进程时,子进程会复制父进程的内存、文件描述符和其他相关信息。当然,子进程可以独…

Web前端-JavaScript(js表达式)

文章目录 JavaScript基础第01天1.编程语言概述1.1 编程1.2 计算机语言1.2.1 机器语言1.2.2 汇编语言1.2.3 高级语言 1.4 翻译器 2.计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 3.初始JavaScript3.1 JavaScript 是什么3.2 JavaScript的作用3.3 HTML/CSS/…

医疗智能化革命:AI技术引领医疗领域的创新进程

一、“AI”医疗的崛起 随着人工智能(AI)技术的崛起,"AI"医疗正在以惊人的速度改变着医疗行业的面貌。AI作为一种强大的工具,正在为医疗领域带来前所未有的创新和突破。它不仅在医学影像诊断、病理学分析和基因组学研究等…

tomcat错误

Error running Tomcat8: Address localhost:1099 is already in use window环境,打开cmd netstat -ano | findstr :1099发现对应PID为24732 结束PID taskkill /PID 24732 /F

R语言【rgbif】——occ_search对待字符长度大于1500的WKT的特殊处理真的有必要吗?

一句话结论:只要有网有流量,直接用长WKT传递给参数【geometry】、参数【limit】配合参数【start】获取所有记录。 当我在阅读 【rgbif】 给出的用户手册时,注意到 【occ_search】 强调了 参数 【geometry】使用的wkt格式字符串长度。 文中如…

配置Nginx解决跨域问题

Nginx 中将前端请求中的所有以 “/apiUrl” 开头的路径代理到 http://192.12.200.101:9813 例如: /apiUrl/login > http://192.12.200.101:9813/login 配置nginx环境 进入Nginx 的配置文件编辑界面: sudo nano /etc/nginx/conf.d/default.conf开始编辑 defaul…

计算机网络(1):开始

计算机网络(1):开始 计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化、网络化和信息化,是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络,因为网络可以非常迅速地传递信息。因此网络现…

STM32/STM8资源节约主义设计方式

STM32/STM8资源节约主义设计方式 在小资源芯片进行代码设计时,如STM32C0系列,STM8系列,因为官方库本身要包含各种场景应用特征的支持,所以会有一些冗余的代码占用更多FLASH空间。当需要实现资源占用最简化设计方式时,…

AAAI中稿心得

很幸运我们的一篇工作中稿了AAAI2024,题目是 Self-Prompt Mechanism for Few-Shot Image Recognition. 很高兴能在研二的上学期中稿一篇a会保底,也是我中稿的第一篇工作,成为我申请博士的资本。最重要的是,让枯燥无味的科研&#…