首页 > 数据库 >详解Redis的Set类型及相关命令

详解Redis的Set类型及相关命令

时间:2025-01-13 22:00:53浏览次数:3  
标签:Set SADD Redis myset redis 详解 key integer 元素

目录

SADD

SMEMEBERS

SISMEMBER

SCARD

SPOP

SMOVE

SREM

SINTER

SINTERSTORE

SUNION

SUNIONSTORE

SDIFF

SDIFFSTORE

内部编码

应用场景


集合类型是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是⽆序的,且元素不允许重复。⼀个集合中最多可以存储 个元素。

Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。

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"
SMEMEBERS
获取⼀个 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
SCARD
获取⼀个 set 的基数(cardinality),即 set 中的元素个数。
语法
SCARD key
时间复杂度:O(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]
时间复杂度: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
"two"
redis> SMEMBERS myset
1) "one"
2) "three"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3
1) "one"
2) "three"
3) "four"
redis> SMEMBERS myset
1) "five"
SMOVE
将⼀个元素从源 set 取出并放⼊⽬标 set 中。

语法

SMOVE 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
将指定的元素从 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) "two"
2) "three"
SINTER
获取给定 set 的交集中的元素。

语法

SINTER key [key ...]
时间复杂度: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"
SINTERSTORE
获取给定 set 的交集中的元素并保存到⽬标 set 中。

语法

SINTERSTORE destination key [key ...]
时间复杂度: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 ...]
时间复杂度: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) "b"
3) "c"
4) "d"
5) "e"
SUNIONSTORE
获取给定 set 的并集中的元素并保存到⽬标 set 中。
语法
SUNIONSTORE destination key [key ...]
时间复杂度: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) "b"
3) "c"
4) "d"
5) "e"
SDIFF
获取给定 set 的差集中的元素。
语法
SDIFF key [key ...]
时间复杂度: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 ...]
时间复杂度: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"
内部编码

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

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

应用场景

1.标签系统

在社交网络、博客或新闻网站中,可以使用Redis Set存储具有相同标签的文章或用户。
标签系统可以用于信息分类和组织,方便进行标签搜索和统计。

2.好友关系

在社交网络应用中,可以使用Redis Set存储用户的好友列表。
通过交集、并集等操作,可以实现好友推荐、共同好友查找等功能。

3.实时排行榜

在在线游戏或竞技场景中,可以使用Redis Set(或更常用的有序集合Sorted Set)存储玩家的得分。
通过定期更新玩家的得分并将其添加到排行榜集合中,可以实时获取当前排名。

标签:Set,SADD,Redis,myset,redis,详解,key,integer,元素
From: https://blog.csdn.net/wmh_1234567/article/details/144489091

相关文章

  • React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次
    基础概念Element对象与Fiber对象Element对象与Fiber对象Element对象定义React的Element对象是一个描述用户界面(UI)的普通JavaScript对象,通常由React.createElement或JSX语法生成。作用它是React应用中的一种描述UI的不可变数据结构。表示一个虚拟DOM......
  • 360度测评系统详解
    360度测评系统详解作者:开源测评系统FreeHR360,https://github.com/FreeHrTools/FreeHR360360度测评,又称360度绩效评估或全方位评估,是一种综合性的测评方法,旨在通过多元化的反馈机制,全面、客观地评估一个人的工作表现与能力发展。以下是对360度测评的详细解析:一、定义与起源3......
  • 【自动化测试】—— Appium安装配置保姆教程(图文详解)
    目录一.环境准备二.JDK安装1.JDK下载2.JDK安装3.配置环境4.验证安装三.AndroidSDK安装1.下载AndroidSDK2.安装AndroidSDK3.安装工具4.配置环境5.验证安装四.NodeJS安装1.下载NodeJS2.安装NodeJS3.验证安装4.安装淘宝镜像五.Python及依......
  • 【详解】Hadoop执行start-all.sh时namenode没有启动
    目录Hadoop执行start-all.sh时namenode没有启动1.检查Hadoop配置文件1.1core-site.xml1.2hdfs-site.xml1.3yarn-site.xml1.4mapred-site.xml2.检查日志文件2.1查看NameNode日志2.2常见错误及解决方法2.2.1端口被占用2.2.2文件系统不一致3.检查环境变量......
  • Redis 面试题
    Redis主要有哪些功能?缓存加速:Redis通常被作为应用程序的缓存层,将热点数据或频繁访问的数据存储在Redis中,减少对数据库的访问次数,常见应用场景包括Web页面缓存、数据库查询结果缓存、API调用缓存等。轻量级数据库:可以用作一个轻量级数据库,尤其是需要在高速读写和持久化的场......
  • 微软 Phi-4:小模型的大智慧——技术详解及简单测评
    原文:https://zhuanlan.zhihu.com/p/17577753167在人工智能的世界里,大型语言模型(LLMs)一直是科技巨头们竞相追逐的焦点。然而,微软研究院的最新成果——Phi-4,却以14B参数的“小身材”在众多巨无霸模型中脱颖而出。Phi-4不仅在STEM领域的问答能力上超越了其“老师”GPT-4,还在多个......
  • 万字详解内网渗透该怎么学!黑客技术零基础入门到精通实战教程建议收藏!
    前言:本文主要记录了作者之前在内网渗透的一个全方面的学习过程,包括如何从外网找到入口点,之后如何提权,然后如何在内网中进行一个信息收集,当存在域的情况下又是怎么收集信息,然后通过代理来进一步横向,不论是一层代理还是两层,本文都有涉及,以及一些常见的代理工具的使用方法、权......
  • fping命令详解
    fping是一个用于发送ICMPECHO_REQUEST数据包到网络主机的工具,类似于ping命令,但它可以同时ping多个主机。fping通常用于网络监控和批量测试主机的可达性。安装fping在大多数Linux发行版中,fping可以通过包管理器安装:Debian/Ubuntu:sudoapt-getinstallfpingCen......
  • 《ARM Cortex - M3与Cortex - M4权威指南》第8章深入了解异常处理详解
    8.1简介8.1.1关于本章本章主要聚焦于ARMCortex-M3与Cortex-M4处理器中异常处理的深入知识。旨在让读者全面理解异常处理机制,包括异常处理的实现方式、栈帧的管理以及异常流程中的各种细节,这些知识对于开发高效、可靠的基于这两款处理器的嵌入式系统至关重要。8.1.......
  • 【Redis】初识分布式系统
    目录单机架构分布式系统应用数据分离架构应用服务集群架构读写分离/主从分离架构冷热分离架构垂直分库微服务架构 分布式名词概念 本篇博文,将根据分布式系统的演进一步一步介绍每一种架构的形式,最后为大家总结了一些分布式中常用的名词解释单机架构单机架构简......