Redis.集合


集合

  • 集合的基本操作
  • 集合运算操作
  • 应用场景示例

Redis的集合以无序的方式储存多个各不相同的元素。
用户可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个集合进行集合运算操作,比如计算并集、交集和差集。集合类型是使用值为空的散列表实现的。操作的时间复杂度为0(1)。

集合的特性:唯一,无序

集合的基本操作

SADD key element

添加元素 将一个或多个元素添加到给定的集合里面,已经存在于集合的元素会自动被忽略,命令返回新添加到集合的元素数量。

SREM key element

移除元素 移除集合中的一个或者多个元素,不存在于集合中的元素会自动被忽略,命令返回存在并且被移除的元素数量。

SISMEMBER key element

检查给定元素是否存在于集合 检查给定的元素是否存在于集合,存在的 话返回 1 ;如果元素不存在,或者给定的键不存在,那么返回 0 。

SCARD key

返回集合的大小 返回集合包含的元素数量(也即是集合的基数)。

SMEMBERS key

返回集合包含的所有元素。
命令的复杂度为 O(N) ,N为集合的大小。当集合的基数比较大时,执行这个命令有可能会造成服务器阻塞,后面会有更好的方式来迭代集合中的元素。
由于集合的无序性质,对于相同的一集元素,同一个集合命令可能会返回不同的结果。
不要使用集合来储存有序的数据。如果想要储存有序且重复的值,可以使用列表;如果想要储存有序且无重复的值,可以使用<code>有序集合</code>。

SPOP key

从集合里面随机地弹出一个元素 随机地从集合中移除并返回一个元素,复杂度为 O(1) 。

SRANDMEMBER key [count]

从集合里面随机地返回元素
和 SPOP 不同, SRANDMEMBER 不会移除被返回的元素。命令的复杂度为 O(N),N 为被返回元素的数量。

如果没有给定可选的 count 参数,那么命令随机地返回集合中的一个元素。如果给定了 count 参数,那么:

  • 当 count 为正数并且少于集合基数时,命令返回一个包含 count 个元素的数组,数组中的每个元素各不相同。如果 count
    大于或等于集合基数,那么命令返回整个集合。
  • 当 count 为负数时,命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count 的绝对值。

集合运算操作

差集运算

命令作用复杂度
SDIFF key计算所有给定集合的差集,并返回结果。O(N),N为所有参与差集计算的元素数量之和。
RDFSTORE destkey key计算所有给定集合的差集,并将结果储存到 destkey。O(N),N为所有参与差集计算的元素数量之和。

交集运算

命令作用复杂度
SINTER key计算所有给定集合的交集,并返回结果。O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。
SINTERS TORE destroy key计算所有给定集合的交集,并将结果储存到 destkey 。O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。

并集运算

命令作用复杂度
SUNION key计算所有给定集合的并集,并返回结果。O(N),N 为所有参与计算的元素数量。
SUNIONSTORE destkey key计算所有给定集合的并集,并将结果储存到 destkey。O(N),N 为所有参与计算的元素数量。

应用场景示例

示例:构建商品筛选功能

京东上的一个手机筛选系统,用户可以根据品牌、价格、网络、屏幕尺寸等条件,对商品进行筛选。
对于每个条件的每个选项,我们可以使用一个集合来保存该选项对应的所有商品,并通过在多个选项之间进行交集计算,从而达到筛选的目的。

对于品牌条件,我们可以创建这样的集合,比如

apple = {"iPhone 5c", "iPhons 5s", ...}
samsung = {"Galaxy S5", "Galaxy S4", ...}

而对于价格条件,我们可以创建这样的集合,比如

price_2900_to_4099 = {"Galaxy S5", "GalaxyS4",...}
price_uppon_4100 = {"iPhone 5c", "iPhone 5S",...}

每当用户添加一个过滤选项时,我们就计算出所有被选中选项的交集,而交集的计算结果就是符合筛选条件的商品。
当然,每次过滤都要计算一次交集的话,速度就太慢了,因此我们可以预先计算好,然后把结果储存在一个固定的地方。

声明:Rock 版权所有,内容均为原创,欢迎转载。

转载:转载请注明原文链接 - Redis.集合


我是一个程序员,致力于网页开发,我还很年轻,什么也不懂。