Redis的Set集合

什么是Set集合

Set类型是用来保存多个字符串类型的集合,list类型也是保存多个字符串类型的集合,两者之间的区别主要是两点。1. set集合中的元素是无序的,即顺序不重要(set[1,2,3]和set[2,1,3]是等价的);2. set集合中的元素不允许重复

常用命令

sadd

将一个或多个元素添加到set中,重复的元素无法添加成功
语法:sadd key menber [menber...]
时间复杂度:O(1)
返回值:返回添加成功的元素个数
image.png

smembers

获取set中的所有元素,注意:元素间的顺序是无序的
语法:smembers key
时间复杂度:O(n)
返回值:返回所有元素的列表
Redis的Set集合_第1张图片

sismember

判断一个元素在不在set中
语法:sismember key member
时间复杂度:O(1)
返回值:1表示在set中,0表示不在set中或key不存在
Redis的Set集合_第2张图片

scard

获取set中元素个数
语法:scard key
时间复杂度:O(1)
返回值:返回set内的元素个数
image.png

spop

从set中删除一个或多个元素,注意:由于set内的元素是无序的,所以取出哪个元素实际是未定义行为,是随机的。
语法:spop key [count]

  • count:表示要删除的个数

时间复杂度:O(1)
返回值:删除的元素
Redis的Set集合_第3张图片

smove

将一个元素从源set取出并放入目标set中
语法:smove source destination member
时间复杂度:O(1)
返回值:1表示移动成功,0表示失败
Redis的Set集合_第4张图片

srem

将指定元素从set中删除
语法:srem key member [member...]
时间复杂度:O(1)
返回值:删除元素个数
Redis的Set集合_第5张图片

集合间操作(交集/并集/差集)

sinter

获取给定set的交集中的元素
语法:sinter key [key...]
时间复杂度:O(NM),N是最小集合的元素个数,M是最大集合的元素个数
返回值:返回交集的元素
Redis的Set集合_第6张图片
sinterstore
获取给定set的交集并保存到目标set中
语法:sinterstore destination key [key...]
时间复杂度:O(N
M)
返回值:返回交集的元素个数
Redis的Set集合_第7张图片

sunion

获取给定set并集中的元素
语法:sunion key [key...]
时间复杂度:O(n),n指的是总的元素个数
返回值:返回并集的结果
Redis的Set集合_第8张图片
sunionstore
获取给定set的并集中的元素并保存到目标set中
语法:sunionstore destination key [key...]
时间复杂度:O(N)
返回值:返回并集的元素个数
Redis的Set集合_第9张图片

sdiff

获取给定set差集中的元素
语法:sdiff key [key...]
时间复杂度:O(n),n是给定所有集合的总的元素个数
返回值:差集的元素
Redis的Set集合_第10张图片

这里的差集是以第一个set集合相比于后面的set集合中的不同元素

sdiffstore
获取给定set的差集中的元素并保存到目标set中
语法:sdiffstore destination key [key...]
时间复杂度:O(n)
返回值:返回差集的元素个数
Redis的Set集合_第11张图片

内部编码

set类型的内部编码有两种

  • intset整数集合:当集合中的元素都是整数时,redis采用intset可以节省空间
  • hasetable哈希表:当set类型无法满足intset的条件时,redis使用hashtable作为集合的内部实现

应用场景

打标签

  1. 给用户打标签
    :::tips
    sadd user:1:tags tag1 tag2 tag3

    sadd user:n:tags tag1 tag5 tag7
    :::

  2. 给标签添加用户
    :::tips
    sadd tag1:users user:1 user:5

    sadd tagn:users user:1 user:6
    :::

  3. 删除用户下的标签
    :::tips
    srem user:1:tages tag3

    srem user:n:tags tag100
    :::

  4. 删除标签下的用户
    :::tips
    srem tag1:users user:5

    srem tagn:users user:6
    :::

  5. 用户的共同标签
    :::tips
    sinter user:1:tags user:2:tags
    :::

计算用户的共同好友

基于”集合求交集“,可以做一些好友推荐

统计UV

UV:衡量用户量的一个指标,每个用户访问服务器,都会产生一个uv,但是同一个用户多次访问,不会使用uv增加

统计uv需要按照用户进行去重,因此可以利用set的去重特性来实现

你可能感兴趣的:(redis,redis,数据库,缓存)