redis集合[1]

编程

上次我们讲到 redis的列表,这次继续讲 集合(Set) 这种数据结构。

1,简介

Redis 的 Set 是 String 类型 的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过 哈希表 实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

2,使用场景

2.1 社交场景

好友/关注/粉丝/感兴趣的人集合

  • sinter命令可以获得A和B两个用户的共同好友

  • sismember命令可以判断A是否是B的好友

  • scard命令可以获取好友数量

  • 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合

需要注意的是,如果你用的是Redis Cluster集群,对于sinter、smove这种操作多个key的命令,要求这两个key必须存储在同一个slot(槽位)中,否则会报出 (error) CROSSSLOT Keys in request don"t hash to the same slot 错误。Redis Cluster一共有16384个slot,每个key都是通过哈希算法CRC16(key)获取数值哈希,再模16384来定位slot的。要使得两个key处于同一slot,除了两个key一模一样,还有没有别的方法呢?

答案是肯定的,Redis提供了一种Hash Tag的功能,在key中使用{}括起key中的一部分,在进行 CRC16(key) mod 16384 的过程中,只会对{}内的字符串计算,例如friend_set:{123456}和fans_set:{123456},分别表示用户123456的好友集合和粉丝集合,在定位slot时,只对{}内的123456进行计算,所以这两个集合肯定是在同一个slot内的,当用户123456关注某个粉丝时,就可以通过smove命令将这个粉丝从用户123456的粉丝集合移动到好友集合。相比于通过srem命令先将这个粉丝从粉丝集合中删除,再通过sadd命令将这个粉丝加到好友集合,smove命令的优势是它是原子性的,不会出现这个粉丝从粉丝集合中被删除,却没有加到好友集合的情况。然而,对于通过sinter获取共同好友而言,Hash Tag则无能为力,例如,要用sinter去获取用户123456和456789两个用户的共同好友,除非我们将key定义为{friend_set}:123456和{friend_set}:456789,否则不能保证两个key会处于同一个slot,但是如果真这样做的话,所有用户的好友集合都会堆积在同一个slot中,数据分布会严重不均匀,不可取,所以,在实战中使用Redis Cluster时,sinter这个命令其实是不适合作用于两个不同用户对应的集合的(同理其它操作多个key的命令)。

2.2 随机展示

set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。

2.3 黑名单/白名单

经常有业务出于安全性方面的考虑,需要设置用户黑名单、ip黑名单、设备黑名单等,set类型适合存储这些黑名单数据,sismember命令可用于判断用户、ip、设备是否处于黑名单之中。

 

3,语法

127.0.0.1:6379> SADD s1 1

127.0.0.1:6379> SMEMBERS s1

1) "1"

127.0.0.1:6379> SADD s1 2

(integer) 1

127.0.0.1:6379> SADD s1 1

(integer) 0

127.0.0.1:6379> SMEMBERS s1

1) "1"

2) "2"

 

4,常见命令

命令

描述

SADD key member1 [member2]

向集合添加一个或多个成员

SCARD key

获取集合的成员数

SDIFF key1 [key2]

返回给定所有集合的差集

SDIFFSTORE destination key1 [key2

返回给定所有集合的差集并存储在 destination 中

SINTER key1 [key2]

返回给定所有集合的交集

SINTERSTORE destination key1 [key2]

返回给定所有集合的交集并存储在 destination 中

SISMEMBER key member

判断 member 元素是否是集合 key 的成员

SMEMBERS key

返回集合中的所有成员

SMOVE source destination member

将 member 元素从 source 集合移动到 destination 集合

SPOP key

移除并返回集合中的一个随机元素

SRANDMEMBER key [count]

返回集合中一个或多个随机数

SREM key member1 [member2]

移除集合中一个或多个成员

SUNION key1 [key2]

返回所有给定集合的并集

SUNIONSTORE destination key1 [key2]

所有给定集合的并集存储在 destination 集合中

SSCAN key cursor [MATCH pattern] [COUNT count]

迭代集合中的元素

 

参考链接: https://www.runoob.com/redis/redis-sets.html  

以上是 redis集合[1] 的全部内容, 来源链接: utcz.com/z/517582.html

回到顶部