深入学习 Redis - 深挖经典数据类型之 set

目录

前言

[一、Set 类型](#一、Set 类型)

1.1、操作命令

[sadd / smembers(添加)](#sadd / smembers(添加))

sismember(判断存在)

scard(获取元素个数)

spop(删除元素)

smove(移动)

srem(删除)

[sinter / sinterstore(交集 / 存储)](#sinter / sinterstore(交集 / 存储))

[sunion / sunionstore(并集 / 存储)](#sunion / sunionstore(并集 / 存储))

[sdiff / sdiffstore(差集 / 存储)](#sdiff / sdiffstore(差集 / 存储))

[1.2、set 的内部编码方式](#1.2、set 的内部编码方式)

1.3、使用场景

[用户画像(set 保存用户 "标签")](#用户画像(set 保存用户 “标签”))

共同好友

[统计 UV(去重)](#统计 UV(去重))


前言


redis 中所有的 key 都是字符串,value 的类型是存在差异的,因此出现了操控不同 value 的命令,接下来,就一起来学习一下吧~

Ps1:接下来,我给出的指令都是按照 Redis 官方文档的语法格式来解析的, 相当于一个独立的单元,表示可选项(可有可无),其中 | 表示 "或者" 的意思,多个只能出现一个, 之间是可以同时存在的.
Ps2:一个快速失去年终奖的小技巧 ------ 清除 redis 上所有的数据 =》 FLUSHALL,这个操作可以把 redis 上所有的键值对全部带走.
Ps3:不同操作返回值差别挺大,很容易记混,不用可以去背,经常使用的操作,自然就记住了.

一、Set 类型


1.1、操作命令

redis 中的 set 就是一个集合,集合就是把一些关联的数据放在一起,我们把集合中的元素叫 member ,具有以下特殊的特性:

  1. 集合中的元素是无序的.
  2. 集合中的元素是唯一的,不能重复.
  3. 和 list 类似,集合中的每个元素都是 string 类型的,同时也可以使用 json 这样的格式让 string 存储 结构化 的数据.

Ps:这里提到的到无序,对应前面讲到的 list.

list: 1, 2, 32, 1, 3 是两个不同的 list.

set: 1, 2, 32, 1, 3 是两个相同的 set.

sadd / smembers(添加)

将一个或多个元素添加到 set 中,返回值是成功添加的元素个数. 注意,重复的元素会添加失败.

复制代码
SADD key member [member ...]

获取一个 set 中所有的元素. 注意,返回的元素是无序的.

复制代码
SMEMBERS key

sismember(判断存在)

判断一个元素是否在 set 中,返回 1 表示存在,0表示不存在.

复制代码
SISMEMBER key member

scard(获取元素个数)

用来获取 set 中元素的个数.

复制代码
SCARD key

spop(删除元素)

pop 一般表示 "从末尾" 删除一个元素,集合中的元素都是无序的,末尾是什么呢?在 redis 的 set 中,使用 spop 表示随机删除一个元素.

复制代码
SPOP key [count]

通过 count 参数可以指定删除的个数,没写就是默认删除这一个.

smove(移动)

将 member 从 source 上删除,再插入到 destination 中.

返回 1 表示移动成功.

返回 0 表示移动失败,但是 source 中删除成功,只是 destination 中不能出现重复元素(destination 中含有新插入的元素).

复制代码
SMOVE source destination member

srem(删除)

可以一次删除一个 或 多个 member ,返回值表示删除元素的个数.

复制代码
SREM key member [member ...]

sinter / sinterstore(交集 / 存储)

交集就是在两个集合中都有的元素,通过 sinter 就可以获取多个元素的之间的交集,时间复杂度为 O(N*M),N 是最小的集合元素个数,M 是最大集合的元素个数.

复制代码
SINTER key [key ...]

//此处 key 对应一个集合,返回值就是最终交集的数据.

sinterstore 用来将算好的交集,放到 destination 这个 key 对应的集合中

复制代码
SINTERSTORE destination key [key ...]

sunion / sunionstore(并集 / 存储)

并集就是两个集合的数据全集,sunion 就是返回并集的结果数据,时间复杂度为 O(N),N 表示总的元素个数.

复制代码
SUNION key [key ...]

sunionstore 直接把并集的结果存储到 destination 对应的集合中,返回值事并集的元素个数.

复制代码
SUNIONSTORE destination key [key ...]

sdiff / sdiffstore(差集 / 存储)

差集,A 和 B 做差集,就是找出哪些元素在 A 中存在,同时 B 中不存在(B 和 A 做差集则相反).

复制代码
SDIFF key [key ...]

sdiffstore 就是将差集的结果放在 destination 中,时间复杂度为 O(N).

复制代码
SDIFFSTORE destination key [key ...]

1.2、set 的内部编码方式

set 内部有两种编码方式:

  1. intset:整数集合,当所有元素均为整数,并且元素个数不是很多的时候,为了节省空间,做出的特定优化.
  2. hashtable:最基本的哈希表(不是 java 标准库中的 HashTable),redis 内部对哈希表的实现方式和 java 中的哈希表可能不太一样,但是整体思想都是一样的;时间上复杂度O(1),但是空间上会有一定的浪费(hash 是一个数组,数组上有些位置有元素,有些位置没有元素).

1.3、使用场景

用户画像(set 保存用户 "标签")

通过你对这个服务器访问的数据,分析出你这个人的一些特征,之后再 "投其所好"~

抖音这款软件在这方面做的就尤为突出,他会根据用户经常观看收藏点赞那种类型的视频,就能看出你这个人的 性别、年龄、居住地、爱好... 通过这个过程,就会将这些特征,就会转换成标签保存到 redis 的 set 中,之后就会给你推送与这些标签相关的视频内容.

共同好友

基于 set 的 "集合求交集" 就可得到两个用户之间的 "用户关系"

在 QQ 上,我这边加了很多好友,你这边也加了很多好友,这样系统就可以做到好友推荐:

A 的好友中有 B 和 C.

D 的好友中也有 B 和 C.

系统就会把 A 推荐给 D.

统计 UV(去重)

利用 set 的去重机制,衡量用户规模.

一个互联网产品衡量用户规模,主要就是两个指标:

PV:page view,用户每次访问服务器都会产生一个 pv.

UV:user view ,每个用户访问服务器,都会产生一个 uv,但是同一个用户多次访问,不会使 uv 增加,这就需要基于 set 实现去重.

相关推荐
Y3815326622 小时前
MySQL 慢查询排查实战:EXPLAIN 看懂 type 与 Extra,一个字段定位性能问题
数据库·mysql
mykj15512 小时前
英语单词APP解锁学习新方式,智能高效背单词
学习·英语单词app
知识分享小能手3 小时前
深度学习学习教程,从入门到精通,深度学习中的正则化 — 完整知识点与代码示例(7)
人工智能·深度学习·学习
Logintern093 小时前
PostgreSQL 的 ORDER BY 多列排序
数据库·postgresql
今天AI了吗4 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
~kiss~4 小时前
Agent 的 未来吗?String: An Agentic OS Where Every App Is a Markdown File
学习
数据库小学妹4 小时前
为什么MySQL索引用B+树?从存储底层讲透原理
数据库·mysql·b+树·索引优化·磁盘io·数据库原理
BestHeaker4 小时前
制造业 MES 开发入门:和互联网业务开发的 5 个本质差异(一)
数据库·经验分享·制造业·mes
HugoStudio_SWAN4 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
自动化监测Learner5 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库