Redis基本数据类型set详解

    科技2024-08-14  30

    4.5 Set数据类型详解

    4.5.1 简介

    set为一个集合

    set中的值是不能重复的!

    关于set的命令都是s开头


    4.5.2 新增set并查看

    sadd key member [member …]

    ##新增一个set 127.0.0.1:6379> sadd set set1 set2 set3 (integer) 3 ##查看所有的key 127.0.0.1:6379> keys * 1) "set" ##查看set的元素 127.0.0.1:6379> smembers set 1) "set3" 2) "set1" 3) "set2" 127.0.0.1:6379>

    4.5.3 查询set中是否包含指定的元素

    sismember key member ##查询set的所有元素 127.0.0.1:6379> smembers set 1) "set3" 2) "set1" 3) "set2" ##判断set中是否有set1这个元素 127.0.0.1:6379> sismember set set1 (integer) 1 ##判断set中是否有set4这个元素 127.0.0.1:6379> sismember set set4 (integer) 0 127.0.0.1:6379>

    4.5.4 查询set中元素的个数

    scard key

    ##获取所有的key 127.0.0.1:6379> keys * 1) "set" ##查询set中的所有元素 127.0.0.1:6379> smembers set 1) "set3" 2) "set1" 3) "set2" ##判断set中有无这个元素 127.0.0.1:6379> sismember set set1 (integer) 1 ##判断set中有无这个元素 127.0.0.1:6379> sismember set set4 (integer) 0 ##查询set中的元素个数 127.0.0.1:6379> scard set (integer) 3 ##往set中添加元素 127.0.0.1:6379> sadd set lll (integer) 1 ##查询set的所有元素 127.0.0.1:6379> smembers set 1) "lll" 2) "set3" 3) "set1" 4) "set2" ##获取set中的元素个数 127.0.0.1:6379> scard set (integer) 4 127.0.0.1:6379>

    4.5.5 移除set中的元素

    srem key member [member …]

    ##查询set中的所有元素 127.0.0.1:6379> smembers set 1) "lll" 2) "set3" 3) "set1" 4) "set2" ##移除set中的某一个元素 127.0.0.1:6379> srem set lll (integer) 1 ##查询set里的元素个数 127.0.0.1:6379> scard set (integer) 3 ##查询set中的所有元素 127.0.0.1:6379> smembers set 1) "set3" 2) "set1" 3) "set2" 127.0.0.1:6379>

    4.5.6 随机获取set中的元素

    场景展示:

    比如有一个奖品池,奖品都在set中存放,为什么可以在set中存放,因为set是无序不重复的

    现在要抽一个奖品,就可以用redis为我们提供的获取随机元素的api

    srandmember key [count]

    ##查询set中的所有元素 127.0.0.1:6379> smembers set 1) "set3" 2) "set1" 3) "set2" ##随机获取set中的元素 127.0.0.1:6379> srandmember set "set3" ##随机获取set中的元素 127.0.0.1:6379> srandmember set "set2" ##随机获取set中的元素 127.0.0.1:6379> srandmember set "set3" ##随机获取set中的元素 127.0.0.1:6379> srandmember set "set1" 127.0.0.1:6379>

    4.5.7 随机移除元素

    spop key

    ##查询所有的key 127.0.0.1:6379> keys * 1) "set" ##获取set中的所有元素 127.0.0.1:6379> smembers set 1) "set3" 2) "set1" 3) "set2" ##随机移除set中的元素 127.0.0.1:6379> spop set "set2" ##随机移除set中的元素 127.0.0.1:6379> spop set "set3" ##获取set中的所有元素 127.0.0.1:6379> smembers set 1) "set1" 127.0.0.1:6379>

    4.5.8 将指定的元素移动到另一个set中

    smove source destination member

    ##新增一个set 127.0.0.1:6379> sadd set1 v1 v2 v3 (integer) 3 ##新增一个set 127.0.0.1:6379> sadd set2 v4 v5 (integer) 2 ##查询所有的key 127.0.0.1:6379> keys * 1) "set1" 2) "set2" ##查询set的所有元素 127.0.0.1:6379> smembers set1 1) "v1" 2) "v3" 3) "v2" ##查询set的所有元素 127.0.0.1:6379> smembers set2 1) "v5" 2) "v4" ##移动set的某一个元素到另一个set中 127.0.0.1:6379> smove set1 set2 v1 (integer) 1 ##查询set的所有元素 127.0.0.1:6379> smembers set1 1) "v3" 2) "v2" ##查询set的所有元素 127.0.0.1:6379> smembers set2 1) "v1" 2) "v5" 3) "v4" 127.0.0.1:6379>

    4.5.9 基于场景展示数字集合类:

    场景:

    微博|B站中有一个共同关注功能!在数学中称为交集

    这个功能如何在Redis中的Set去做呢

    数字集合类:

    差集 sdiff并集 sunion交集 sinter

    redis中实现差集

    sdiff key [key …]

    ##添加set 127.0.0.1:6379> sadd set1 a b c (integer) 3 ##添加set 127.0.0.1:6379> sadd set2 a e d (integer) 3 ##使用sdiff 以set1作为参考,比较与set2中的哪些元素不同 127.0.0.1:6379> sdiff set1 set2 1) "b" 2) "c" ##使用sdiff 以set2作为参考,比较与set1中的哪些元素不同 127.0.0.1:6379> sdiff set2 set1 1) "e" 2) "d" 127.0.0.1:6379>

    redis中实现交集

    sinter key key

    ##查询所有的key 127.0.0.1:6379> keys * 1) "set1" 2) "set2" ##查询set的所有元素 127.0.0.1:6379> smembers set1 1) "c" 2) "b" 3) "a" ##查询set的所有元素 127.0.0.1:6379> smembers set2 1) "e" 2) "d" 3) "a" ##比较set并做交集输出 127.0.0.1:6379> sinter set1 set2 1) "a" 127.0.0.1:6379>

    redis中实现并集

    sunion key key

    ##查询所有的key 127.0.0.1:6379> keys * 1) "set1" 2) "set2" ##查询set的所有元素 127.0.0.1:6379> smembers set1 1) "c" 2) "b" 3) "a" ##查询set的所有元素 127.0.0.1:6379> smembers set2 1) "e" 2) "d" 3) "a" ##利用sunion做set的并集 127.0.0.1:6379> sunion set1 set2 1) "b" 2) "c" 3) "a" 4) "e" 5) "d" 127.0.0.1:6379>

    4.5.10 实际场景展示

    微博 BIliBILI

    将XX用户所有关注的人放在set中,因为每一个用户的Id都是唯一的!将他的粉丝也放在一个集合中

    共同关注:把这两个集合做一个交集即可

    共同爱好:在这两个中可以存入爱好的属性,同样做一个交集即可

    二度好友

    推荐好友:(六度分割理论)

    Processed: 0.011, SQL: 8