目录
- 谈到一个术语,往往该术语很可能有多种含义
实例理解
- set
- 可理解为?集合
- 也可理解为 设置,与?GET?相对应
注意:
- Set 类型中不同命令的返回值,含义差别大且乱
原则:
- 不要刻意地背,而是多翻 Redis 官方文档,那些经常用的命令,久而久之就记住了
- Redis 中的 Set 类型表示为一个 集合
- 而 集合就是将一些有关联的数据放到一起
特点:
- 集合中的元素是无序的
- 集合中的元素是不能重复,即集合中的元素具有唯一性
- 集合中的每个元素均为?String 类型,可使用 JSON?格式让 String 类型存储结构化数据
注意:
- 此处 Set 类型的无序 与?List 类型的有序 相互对应
理解:
- 无序:顺序不重要,变化一下顺序,集合还是那个集合
- 有序:顺序很重要,变换一下顺序,就是不同的列表了
实例理解
- List 类型 [1,2,3]?和 [2,1,3] 为两个不同的列表
- Set 类型?[1,2,3]?和 [2,1,3] 为同一个集合
SADD
- 用来将一个或多个元素 添加到 set 中
- 重复元素无法添加
语法:
sadd key member [member ...]
时间复杂度:
- O(N)
- 其中?N 为添加成员的数量,一般不会特别大,可看成 O(1)
返回值:
- 本次操作添加成功的元素个数
?实例理解
SMEMBERS
- 用于获取一个 set 中的所有元素
- 返回的 元素顺序是无序的
语法:
smembers key
时间复杂度:
- O(N)
- 其中 N 为集合中元素的数量
实例理解
SISMEMBER
- 用于 判断在 set 中是否存在指定元素?
语法:
sismember key member
时间复杂度:
- O(1)
返回值:
- 返回 1 代表存在
- 返回 0 代表不存在
实例理解
SPOP
- 用于从 set 中随机删除一个或多个元素
语法:
spop key [count]
- 未设置 count 时,表示随机删除一个元素
- 设置了 count 时,表示随机删除 count 个元素
时间复杂度:
- O(1)
返回值:
- 返回随机删除的元素
实例理解
- Redis 官方在 spop?命令的源码中,采取?生成随机数 的方式,来实现从 set 中随机删除元素
SRANDMEMBER
- 用于从 set 中随机获取一个或多个元素
- 该命令区别于 spop 命令,其不会将获取到的元素从 set 中删除
语法:
srandmember key [count]
时间复杂度:
- O(1)
返回值:
- 未设置 count 参数,该命令将从 set 中随机返回一个元素
- 设置了 count 参数且 count 为正数,则返回的成员中包含 count 个不同的元素
- 设置了 count 参数且 count 为负数,则返回的元素可能重复,且其绝对值表示返回元素的数量
实例理解
SCARD
- 用于 获取指定?set 中的元素个数
语法:
scard key
时间复杂度:
- O(1)
实例理解
SMOVE
- 用于将一个元素从源 set 取出并放入目标 set 中?
语法:
smove source destination member
- 把 member 从 source 上删除,再插入到 destination 中
时间复杂度:
- O(1)
返回值:
- 返回 1 表示移动成功
- 返回 0 表示移动失败
实例理解
- 如上图所示,key 对应的 set 集合成功删除元素1
- 且该元素也成功插入到了 key2 对应的 set 集合中
补充一:
- 如果我给 key 里面再添加一个 元素 1,并再次把这个 元素 1 移动给 key2 会怎么样?
- 注意此时 key2 中已经包含有元素1 了!
- 针对上述的情况 smove 命令并不会报错
- 同样也会按照 删除 插入 执行来执行该命令
- 但是对于 key2 来说,并不会再次插入一个重复的元素
补充二:
- 如果要移动的元素在 source 中不存在呢?
- 此时 smove 命令便会返回 0 表示移动失败
SREM
- 用于删除指定 set 中的 一个或多个 member
语法:
srem key member [member ...]
时间复杂度:
- O(N)
- N 是要删除的元素个数
返回值:
- 表示删除成功的元素个数
实例理解
- 交集(inter)、并集(union)、差集(diff)
交集
- 最终结果同时出现在两个集合中
SINTER
- 用于获取给定 set 的交集中的元素
语法:
sinter key [key ...]
- 此处每个 key 均对应一个集合
- 有多个 key 就求这多个 key 之间的交集
时间复杂度:
- O(N*M)
- N 为最小集合 的元素个数
- M 为最大集合 的元素个数
返回值:
- 最终交集的结果元素
实例理解
SINTERSTORE
- 用于获取给定 set 的交集中的元素,并将这些元素保存到目标 set 中
语法:
sinterstore destination key [key ...]
- 直接将算好的交集放到 destination 对应的集合中
返回值:
- 交集的元素个数
实例理解
- 要想知道集合的内容,直接使用 smembers 命令访问 destination?即可
并集
- 把多个集合中的数据集中放到一起
- 如果元素有重复,也最终只保留一份
SUNION?
- 用于获取给定 set 的并集中的元素
语法:
sunion key [key ...]
时间复杂度:
- O(N)
- ?N 为给定所有集合的总元素个数
返回值:
- 最终并集的结果元素
实例理解
SUNIONSTORE
- 用于获取给定 set 的并集中的元素,并将这些元素保存到目标 set 中
语法:
sunionstore destination key [key ...]
- 直接将算好的并集放到 destination 对应的集合中
时间复杂度:
- O(N)
- ?N 为给定所有集合的总元素个数
返回值:
- 并集的元素个数
实例理解
差集
- A 和 B 做差集,就是找出哪些元素,在 A 中存在,同时在 B 中不存在
SDIFF
- 用于获取给定 set 的差集中的元素
语法:
sdiff key [key ...]
时间复杂度:
- O(N)
- ?N 为给定所有集合的总元素个数
返回值:
- 最终差集的结果元素
实例理解
SDIFFSTORE
- 用于获取给定 set 的差集中的元素,并将这些元素保存到目标 set 中
语法:
sdiffstore destination key [key ...]
- 直接将算好的差集放到 destination 对应的集合中
时间复杂度:
- O(N)
- ?N 为给定所有集合的总元素个数
返回值:
- 差集的元素个数
实例理解
- 集合的内部编码有 两种
- intset(整数集合)
- hashtable(哈希表)
注意:
- intset 编码方式是为了节省空间而做出的特定优化
- 即 当元素均为整数,且元素个数不是很多的时候,将使用 intset 编码
实例理解
用户画像
- 指根据用户的个人信息、行为、偏好等数据,通过分析和整理而形成的关于用户的详细描述
重点理解:
- 我们可以将收集到的用户特征转换成标签,并将其保存到 Redis 中的 Set 类型
- 标签为一些简短的字符串,比如?性别、年龄、居住地、爱好 等
- 由此我们便可根据该用户的标签,实现更精准地提供个性化的产品、服务和推广活动
补充:
- 不同的用户,其商业价值具有一定差别,就比如 该用户是否愿意花钱
- 该点 可根据用户的一些历史行为,进行分析总结
实例理解
- 抖音在该方面尤为突出
- 收集你的用户特征,并推送符合相关特征的短视频内容
共同好友
- 基于 Set 类型的 "集合求交集"
- 由此便能够很容易地 找到两个用户之间的共同好友
实例理解
- QQ 的添加好友页面,经常存在 相关好友推荐
- 这些好友推荐 通常会显示出 我? 与?该用户之间存在多少个共同好友
统计 UV(去重)
- 一个互联网产品,如果需要衡量用户量、用户规模,通常有两个重要指标
- PV(page view)表示页面浏览量,即用户每次打开页面就记录一次 PV,无论是否为同一用户
- UV(user view)表示独立访客数,即每个访客仅计算一次,无论其访问了多少个页面
重点理解:
- UV 需要按照用户进行去重,即我们可以利用 Set 类型自带的去重机制来满足该需求