Redis 集合操作实战(全)

2023-09-20 20:25:46

目录

SADD 插入集合

SCARD 取元素数量

SPOP 随机移除元素

SREM 移除多个元素

SMOVE 移动元素到别的集合

SMEMBERS 取所有成员

SRANDMEMBER 取指定数量元素

SISMEMBER 判断元素是否存在

SUNION 多集合求并集

SUNIONSTORE 多集合求并集(存储)

SINTER 多集合求交集

SINTERSTORE 多集合求取交集(存储)

SDIFF 多集合求取差集

SDIFFSTORE 多集合求取差集(存储)

SSCAN 迭代


SADD 插入集合

SADD key member [member ...]:将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略

  • 假如 key 不存在,则创建一个只包含 member 元素作成员的集合
  • 当 key 不是集合类型时,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e f g h i j k l m n # 向key中添加集合元素,key不存在则自动创建空的key集合
(integer) 14
127.0.0.1:6379> set name lisi # 初始化非集合key
OK
127.0.0.1:6379> sadd name zhangsan # 向非集合中执行sadd
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是被添加的元素的数量。

返回值:

  • 被添加到集合中的新元素的数量,不包括被忽略的元素。
  • 对非集合执行sadd,报错。

SCARD 取元素数量

SCARD key:返回集合中的元素数量

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> scard myset2    # 不存在key
(integer) 0
127.0.0.1:6379> sadd myset a b c d e f g h i j k l m n
(integer) 14
127.0.0.1:6379> scard myset     # 存在集合key
(integer) 14
127.0.0.1:6379> set name lisi   # 初始化非集合key
OK
127.0.0.1:6379> scard name      # 对非集合key执行scard命令
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 不存在key似为空集合,返回0
  • 存在集合key,返回元素个数
  • 对非集合key,报错


SPOP 随机移除元素

SPOP key:移除并返回集合中的一个随机元素。

  • 如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a   # 初始化集合
(integer) 1
127.0.0.1:6379> spop myset
"a"
127.0.0.1:6379> spop myset     # 集合为空
(nil)
127.0.0.1:6379> spop myset2    # 不存在的key
(nil)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> spop name      # key 不为集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 被随机移除的元素。
  • 当 key 不存在或 key 是空集时,返回 nil
  • 当 key 不为集合,报错。

SREM 移除多个元素

SREM key member [member ...]:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e    # 初始化集合
(integer) 5
127.0.0.1:6379> srem myset a b c d      # 移除 a b c d
(integer) 4
127.0.0.1:6379> srem myset a b c d e    
(integer) 1                             # 移除 a b c d e,不存在元素忽视了
127.0.0.1:6379> srem myset2 a           
(integer) 0                             # 移除不存在key似为空集合
127.0.0.1:6379> set name list
OK
127.0.0.1:6379> srem name 1             # key不为集合,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度为O(N), N 为给定 member 元素的数量

返回值:

  • 不存在key似为空集合,返回0。
  • key为集合,返回成功移除的元素的数量(不包括被忽视的元素),不存在的元素直接被忽视。
  • key不为集合,报错。

SMOVE 移动元素到别的集合

SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合。

  • 该操作是原子性的。
  • 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
  • 当 destination 集合已经包含 member 元素时,SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
  • 当 source 或 destination 不是集合类型时,返回一个错误。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b    # 初始化集合
(integer) 2
127.0.0.1:6379> smove s1 dest a    # 移动集合
(integer) 1
127.0.0.1:6379> smembers s1        # 查看集合元素
1) "b"
127.0.0.1:6379> smembers dest      # 查看dest元素
1) "a"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> smove s1 name b    # 有非集合key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 如果 member 元素被成功移除,返回 1 。
  • 如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。

SMEMBERS 取所有成员

SMEMBERS key:返回集合 key 中的所有成员。

  • 不存在的 key 被视为空集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c d e
(integer) 5
127.0.0.1:6379> smembers s1
1) "d"
2) "b"
3) "a"
4) "c"
5) "e"
127.0.0.1:6379> smembers s2
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> smembers name
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 为集合的基数。

返回值:

  • 集合中的所有成员。
  • 不存在的key返回空。
  • 非集合key,报错。

SRANDMEMBER 取指定数量元素

SRANDMEMBER key [count]:取指定数量count的元素。

  • count不指定:默认为1,即随机取一个元素。
  • count为正数:count小于集合大小,返回不重复的count个元素的数组;count大于等于集合大小,则返回整个集合的元素。
  • count为负数:那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c
(integer) 3
127.0.0.1:6379> srandmember s1
"a"
127.0.0.1:6379> srandmember s1 2
1) "a"
2) "b"
127.0.0.1:6379> srandmember s1 5
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> srandmember s1 -5
1) "a"
2) "c"
3) "a"
4) "c"
5) "c"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> srandmember lisi
(nil)

时间复杂度:

  • 只提供 key 参数时为 O(1) 。
  • 如果提供了 count 参数,那么为 O(N) ,N 为返回数组的元素个数。

返回值:

  • 只提供 key 参数时,返回一个元素;如果集合为空,返回 nil 
  • 如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。
  • 对非集合key执行srandmember返回nil。

SISMEMBER 判断元素是否存在

SISMEMBER key member:判断 member 元素是否集合 key 的成员。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c    # 初始化集合
(integer) 3
127.0.0.1:6379> sismember s1 a   # 查看是否存在
(integer) 1
127.0.0.1:6379> sismember s1 f
(integer) 0
127.0.0.1:6379> sismember s2 f   # 不存在key似为空集合
(integer) 0
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sismember name f # 对非集合key操作,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回值:

  • 存在返回1
  • 不存在返回0
  • 对非集合执行 SISMEMBER 命令,报错。

SUNION 多集合求并集

SUNION key [key ...]:返回一个集合的全部成员,该集合是所有给定集合的并集。

  • 不存在的 key 被视为空集。
  • 原理:把所有key集合的元素组合在一起并且去重后的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b    # 初始化集合
(integer) 2
127.0.0.1:6379> sadd myset2 a b c d    # 初始化集合
(integer) 4
127.0.0.1:6379> sunion myset myset2 myset3 # myset3不存在被似为空集合
1) "d"
2) "a"
3) "b"
4) "c"
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sunion myset name        # 有key存在且不为集合,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 并集成员的列表。
  • 有key存在且不为集合则报错。

SUNIONSTORE 多集合求并集(存储)

SUNIONSTORE destination key [key ...]:与SUNION操作相似。

  • 不同点:它将结果保存到 destination 集合,而不是简单地返回结果集。
  • 如果 destination 已经存在,则将其覆盖。
  • destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b    # 初始化集合
(integer) 2
127.0.0.1:6379> sadd s2 c
(integer) 1
127.0.0.1:6379> sunionstore dest s1 s2 s3 # 取并集
(integer) 3
127.0.0.1:6379> smembers dest             # 查看dest信息
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sunionstore dest s1 s2 s3 name    # 有非命令key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 结果集中的元素数量。
  • 对非集合key执行SUNIONSTORE命令报错。

SINTER 多集合求交集

SINTER key [key ...]:返回所有给定集合的交集。

  • 不存在的 key 被视为空集。
  • 原理:取都存在于所有key集合中的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b c d e    # 初始化集合
(integer) 5
127.0.0.1:6379> sadd s2 b e f g      # 初始化集合
(integer) 4
127.0.0.1:6379> sinter s1 s2         # 取交集
1) "e"
2) "b"
127.0.0.1:6379> sinter s1 s2 s3      # 取交集,有不存在的key似为空集
(empty array)
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> sinter s1 s2 name    # 存在不为集合的key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

返回值:

  • 交集成员的列表(不存在key似为空集合)。
  • 存在key不为集合,报错。

SINTERSTORE 多集合求取交集(存储)

SINTERSTORE destination key [key ...]:跟SINTER操作相似。

  • 不同点:SINTERSTORE 它将结果保存到 destination 集合中。
  • 如果 destination 已经存在,则将其覆盖。
  • destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 a b d    # 初始化集合
(integer) 3
127.0.0.1:6379> sadd s2 d e f    # 初始化集合
(integer) 3
127.0.0.1:6379> sinterstore dest s1 s2
(integer) 1
127.0.0.1:6379> smembers dest    # 查看集合dest
1) "d"
127.0.0.1:6379> set name lisi 
OK
127.0.0.1:6379> sinterstore dest s1 s2 name # 存在不为集合的key
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

返回值:

  • 结果集中的成员数量。
  • 存在key不为集合,报错。

SDIFF 多集合求取差集

SDIFF key [key ...]:取给定集合之间的差集

  • 不存在的key似为空集合
  • 原理:以第个key集合为主减去存在于后面所有key集合的并集的元素,剩下的元素集合。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd myset a b c d e # 初始化几个集合key
(integer) 5
127.0.0.1:6379> sadd myset2 d e
(integer) 2
127.0.0.1:6379> sadd myset3 c d
(integer) 2
127.0.0.1:6379> sdiff myset myset2 myset3 # 取三个集合的差集
1) "b"
2) "a"
127.0.0.1:6379> sdiff myset myset2 myset3 myset4 # 取4个集合的差集,其中一个不存在似为空集合
1) "b"
2) "a"
127.0.0.1:6379> set name lisi # 定义一个非集合key
OK
127.0.0.1:6379> sdiff myset myset2 myset3 myset4 name # 有一个key不为集合
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 交集成员的列表
  • 若有不存在的key,似为空集合
  • 若有非集合key,报错


SDIFFSTORE 多集合求取差集(存储)

SDIFFSTORE destination key [key ...]:与SDIFF操作相拟。

  • 不同点:SDIFFSTORE 它将结果保存到 destination 集合中。
  • 如果 destination 已经存在,则将其覆盖。
  • destination 可以是 key 本身。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> sadd s1 'baidu' 'google' 'alibaba' 'banana' # 初始化集合
(integer) 4
127.0.0.1:6379> sadd s2 'apple' 'banana' 'orange'           # 初始化集合
(integer) 3
127.0.0.1:6379> sdiffstore dest s1 s2                       # 求差集并保存到dest中
(integer) 3
127.0.0.1:6379> smembers dest                               # 查看dest中元素
1) "baidu"
2) "google"
3) "alibaba"
127.0.0.1:6379> set name cxian
OK
127.0.0.1:6379> sdiffstore dest s1 name                     # 存在不为集合的key报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 是所有给定集合的成员数量之和。

返回值:

  • 结果集中的成员数量。
  • 存在key不为集合,报错。


SSCAN 迭代

更多推荐

什么是IoT数字孪生?

数字孪生是资产或系统的实时虚拟模型,它使用来自连接的物联网传感器的数据来创建数字表示。数字孪生允许您从任何地方实时监控设备、资产或流程。数字孪生用于多种目的,例如分析性能、监控问题或在实施之前运行测试。从物联网数字孪生中获得的见解使用户能够快速做出反应,以提高运营效率、生产质量、客户满意度等。基于NSDT场景编辑器搭建

docker总结

Docker实用篇0.学习目标1.初识Docker1.1.什么是Docker微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署,环境不一定一致,会遇到各种问题1.1.1.应用部署的环境问题大型项目组件较多

CLR via C#(三)垃圾回收

一、资源生命周期每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。访问一个资源所需的步骤如下:调用IL指令newobj,为代表资源的类型分配内存(在C#中一般用new操作符完成)初始化内存,设置资源的初始状态并使资源可用访问类型成员来使用资源摧毁资源状态以进行清理

多线程的学习第二篇

多线程线程是为了解决并发编程引入的机制.线程相比于进程来说,更轻量~~更轻量的体现:创建线程比创建进程,开销更小销毁线程比销毁进程,开销更小调度线程比调度进程,开销更小进程是包含线程的.同一个进程里的若干线程之间,共享着内存资源和文件描述符表每个线程被独立调度执行.每个线程都有自己的状态/优先级/上下文/记账信息进程是

Apache Tomcat

简介简而言之,Tomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器。ApacheTomcatTomcat是Apache软件基金会(ApacheSoftwareFoundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支

Responder

环境准备操作系统:KaliLinux工具:responder,john,evil-winrmPS:输入以下命令解决靶场环境无法打开问题#echo"<靶机IP>unika.htb">>/etc/hostsresponder工具[Kali官网]手册地址:https://www.kali.org/tools/responde

NSS [HNCTF 2022 WEEK2]easy_sql

NSS[HNCTF2022WEEK2]easy_sql这题考察了无列名注入,首先了解一下什么是无列名注入再开始做题吧。为什么会需要无列名注入?我们常用的SQL注入方法是通过information_schema这个默认数据库来实现,可是你有没有想过,如果过滤了该数据库那么我们就不能通过这个库来查出表名和列名。不过我们可以

UWB定位模块

UWB定位模组是华星智控自研的小尺寸高集成度模组,模组长宽厚为30.1513.955.62毫米,天线采用IPEX接口分体式设计,方便集成于您的产品中,产品采用本安设计,可以用于煤矿等井下场景,通信距离>100米,供电电压3.7V,支持标准锂电池供电。该模块定位精度可到10~30厘米,适合集成在各种需要高精度测距和定位产

可转债长期持有策略——收益与风险、利息收入、案例研究

可转债投资策略——长期持有策略一、收益与风险的权衡长期持有可转债是一种投资策略,旨在实现稳定的收益,并在投资期限内从可转债中获得利益。在采用这种策略时,投资者需要平衡可转债的收益和风险,以满足其财务目标。以下是关于长期持有策略中的收益与风险的权衡:收益:长期持有可转债可以提供稳定的利息收入,这对于寻求规模较大的收入的投

Mybatis 映射器中使用@InsertProvider,@UpdateProvider,@DeleteProvider,@SelectProvider

上一篇我们介绍了在Mybatis映射器的映射方法中使用@Param接收多个参数;本篇我们继续介绍如何在Mybatis的映射器中使用动态SQL。如果您对Mybatis映射器的映射方法中使用@Param接收多个参数不太了解,建议您先进行了解后再阅读本篇,可以参考:Mybatis映射器中映射方法接受多个参数(@Param)h

【业务功能109】微服务-springcloud-springboot-Skywalking-链路追踪-监控

Skywalkingskywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的分布式系统一、Skywalking介绍1.什么是SkyWalkingSkywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin/Pinpoint/CAT的设计思路。特点是:支持多种

热文推荐