redis数据类型之set

缺乏、安全感 2022-10-23 12:53 271阅读 0赞

set(集合):其实就是数学中的集合,集合中元素要具备三个特性:确定性、无序性、互异性。

  • 确定性:一个元素要么属于集合,要么不属于集合。
  • 无序性:集合中每个元素的地位相当,没有顺序
  • 互异性:集合中的元素都是不同,也就是一个元素在一个集合中只能出现一次。

简单使用

sadd:往集合中添加元素,语法:SADD key member [member ...]

  1. 127.0.0.1:6379> sadd fruit apple banana orange
  2. (integer) 3

scard:获取集合中元素的个数,语法:SCARD key

  1. 127.0.0.1:6379> scard fruit
  2. (integer) 3

sismember:判断一个元素是否是集合中的元素,语法:SISMEMBER key member

  1. 127.0.0.1:6379> sismember fruit apple
  2. (integer) 1
  3. 127.0.0.1:6379> sismember fruit pear
  4. (integer) 0

smembers:查询集合中所有的元素,语法:SMEMBERS key

  1. 127.0.0.1:6379> smembers fruit
  2. 1) "orange"
  3. 2) "banana"
  4. 3) "apple"

srandmember:从集合中随机返回指定个数的元素,语法:SRANDMEMBER key [count]

  1. 127.0.0.1:6379> srandmember fruit
  2. "apple"
  3. 127.0.0.1:6379> srandmember fruit 2
  4. 1) "banana"
  5. 2) "apple"

spop:从集合中随机移除指定个数的元素,语法:SPOP key [count]

  1. 127.0.0.1:6379> spop fruit 1
  2. 1) "apple"
  3. 127.0.0.1:6379> smembers fruit
  4. 1) "orange"
  5. 2) "banana"

srem:从集合中移除指定元素,语法:SREM key member [member ...]

  1. 127.0.0.1:6379> srem fruit orange banana
  2. (integer) 2
  3. 127.0.0.1:6379> smembers fruit
  4. (empty array)

sinter:返回指定集合之间的交集,语法:SINTER key [key ...]

  1. 127.0.0.1:6379> sadd f1 morris bob tom marry jack
  2. (integer) 5
  3. 127.0.0.1:6379> sadd f2 bob sean lily tom
  4. (integer) 4
  5. 127.0.0.1:6379> sinter f1 f2
  6. 1) "tom"
  7. 2) "bob"

sinterstore:将指定集合之间的交集存储到另一个集合中,语法:SINTERSTORE destination key [key ...]

  1. 127.0.0.1:6379> sinterstore interf12 f1 f2
  2. (integer) 2
  3. 127.0.0.1:6379> smembers interf12
  4. 1) "tom"
  5. 2) "bob"

sunion:返回指定集合之间的并集,语法:SUNION key [key ...]

  1. 127.0.0.1:6379> sunion f1 f2
  2. 1) "tom"
  3. 2) "morris"
  4. 3) "marry"
  5. 4) "jack"
  6. 5) "bob"
  7. 6) "sean"
  8. 7) "lily"

sunionstore:将指定集合之间的并集存储到另一个集合中,语法:SUNIONSTORE destination key [key ...]

  1. 127.0.0.1:6379> smembers unionf12
  2. 1) "tom"
  3. 2) "morris"
  4. 3) "marry"
  5. 4) "jack"
  6. 5) "bob"
  7. 6) "sean"
  8. 7) "lily"

sdiff:返回指定集合之间的差集,语法:SUNION key [key ...]

  1. 127.0.0.1:6379> sdiff f1 f2
  2. 1) "marry"
  3. 2) "morris"
  4. 3) "jack"
  5. 127.0.0.1:6379> sdiff f2 f1
  6. 1) "sean"
  7. 2) "lily"

sdiffstore:将指定集合之间的差集存储到另一个集合中,语法:SDIFFSTORE destination key [key ...]

  1. 127.0.0.1:6379> sdiffstore difff12 f1 f2
  2. (integer) 3
  3. 127.0.0.1:6379> smembers difff12
  4. 1) "morris"
  5. 2) "marry"
  6. 3) "jack"

smove:将member从source集合移动到destination集合中,如果source集合不存在或者不包含指定的元素,smove命令不执行任何操作并且返回0,否则对象将会从source集合中移除,并添加到destination集合中去,如果destination集合已经存在该元素,则smove命令仅将该元素从source集合中移除,如果source和destination不是集合类型,则返回错误。语法:SMOVE source destination member

  1. 127.0.0.1:6379> smove f1 f3 morris
  2. (integer) 1
  3. 127.0.0.1:6379> smembers f3
  4. 1) "morris"

内部编码

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

  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。
  • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。```

    127.0.0.1:6379> object encoding f3
    “hashtable”
    127.0.0.1:6379> sadd set 1 2 3
    (integer) 3
    127.0.0.1:6379> object encoding set
    “intset”

使用场景

  1. 交集:例如微信的朋友圈点赞,你只能看点你和朋友的共同好友点的赞。

    127.0.0.1:6379> sadd user1 zhangsan lisi wangwu zhaoliu
    (integer) 4
    127.0.0.1:6379> sadd user2 lisi zhaoliu tianqi
    (integer) 3
    127.0.0.1:6379> sinter user1 user2
    1) “zhaoliu”
    2) “lisi”

  2. 抽奖。

先看以下smember命令的复杂用法,语法:SRANDMEMBER key [count]

  • count不传,默认会随机返回一个元素。
  • count为0,不返回元素。
  • count为正数,不会返回重复的元素,如果count参数的值大于集合内的元素数量,此命令将会仅返回整个集合,没有额外的元素。
  • count为负数,可能返回重复的元素,以及总是会返回我们请求的数量的元素。

    127.0.0.1:6379> sadd number one two three four five six
    127.0.0.1:6379> srandmember number 0
    (empty array)
    127.0.0.1:6379> srandmember number 2
    1) “two”
    2) “six”
    127.0.0.1:6379> srandmember number 7
    1) “two”
    2) “three”
    3) “four”
    4) “five”
    5) “one”
    6) “six”
    127.0.0.1:6379> srandmember number -3
    1) “two”
    2) “three”
    3) “three”
    127.0.0.1:6379> srandmember number -9
    1) “two”
    2) “four”
    3) “five”
    4) “three”
    5) “six”
    6) “six”
    7) “five”
    8) “one”
    9) “four”

如果抽奖的礼品的数量n大于抽奖的人数,可以使用命令srandmember users n

如果抽奖的礼品的数量n小于抽奖的人数,可以使用命令srandmember users -n

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读

    相关 redis数据类型set

    set(集合):其实就是数学中的集合,集合中元素要具备三个特性:确定性、无序性、互异性。 确定性:一个元素要么属于集合,要么不属于集合。 无序性:集合中每个元素的

    相关 redis学习——Set数据类型

    一、概述 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说