Redis--数据结构--Set

1. 介绍

和java的set相同,set就是一个不允许重复的list。set也可以进行增加、删除、修改、查询等操作。不同的是,list执行查询的花费为O(n),n取决于在list的index。而set执行查询的花费为O(1).

因为set不允许重复,所以当多次增加相同的元素,只会保留最后一份。set可以在服务器上完成set之间的聚合操作,因为在服务端完成,所以效率非常高,节省IO网络的消耗。

2. 命令

2.1 增加

命令SADD key value1 [value2 …]

命令说明:向指定key中插入values,如果value存在,那么什么都不做,如果不存在,则会增加。如果key对应的不是set结构,执行异常。

返回值:实际增加的数量。

Redis--数据结构--Set_Redis的Set操作

2.2 统计个数

命令SCARD key

命令说明:获取指定key的set的元素个数。

返回值:0:key不存在或者set内元素为空;非0:实际key对应的set的元素的数量。

Redis--数据结构--Set_Redis的常用业务场景_02

2.3 是否存在

命令SISMEMBER key element

命令说明:判断元素element是否在指定key的set中存在。如果key对应的不是set,执行异常。

返回值:1:存在;0:元素不存在或者key不存在。

Redis--数据结构--Set_Redis的常用业务场景_03

2.4 获取全部set

命令SMEMBERS key

命令说明:获取指定key的set的全部元素。

返回值:指定key对应的set的元素的列表。如果key不存在返回空。如果key对应的不是set,执行异常。

Redis--数据结构--Set_Redis的Set操作_04

2.5 随机取出元素

命令SPOP key [count]

命令说明:随机取出key对应的set中的count个元素,count可以省略,省略表示1个。因为set内部元素的布局不受外界控制,所以取出的元素不可控。取出元素后,会将元素从set中移除。count大于set的总数,那么删除全部set元素;如果count等于0,那么什么都不做。

返回值:取出的元素。如果key对应的set为空或者key不存在,那么返回空。如果key对应的不是set,执行异常。

Redis--数据结构--Set_Redis的Set_05

2.6 删除

命令SREM key element [element1 …]

命令说明:从指定的key的set中删除指定的element。如果element不存在将会被忽略。如果key不存在,那么该操作什么都不改变。

返回值:实际删除的元素数量。如果key对应的不是set,执行异常。

Redis--数据结构--Set_Redis的集合能干什么_06

2.7 随机获取元素

命令SRANDMEMBER key [count]

命令说明:随机返回指定key的set中count个元素,count可以省略,省略表示1个。==该操作不会将element从set中删除。==count大于set的总数,那么返回全部set元素;如果count等于0,那么什么都不做;如果count小于0,那么返回count个元素,可能重复

返回值:set中随机的元素列表。如果key不存在返回空列表。如果key对应的不是set执行异常。

Redis--数据结构--Set_Redis的集合能干什么_07

2.8 转移元素

命令SMOVE source dest element

命令说明:将指定element从source中删除,并加入到dest中。如果dest不存在则会创建。如果source中不存在element则什么都不做。如果dest中已经给有了element,那么该命令就是将element从source中删除。如果source或者dest中存在任意一个不是set,那么执行异常。

返回值:1:正常移动;0:source中不存在element。

Redis--数据结构--Set_Redis的Set_08

2.9 差集

命令SDIFF key [key1 …]

命令说明:以第一个key的set为基准,返回后面key的set与第一个key的set的差集元素集合。如果key不存在则视为空set。如果任意key不是set,那么执行异常。

返回值:差异元素的list==(list最少为空,最多为第一个key对应的元素)==

Redis--数据结构--Set_Redis的集合操作_09

2.10 差集存储

命令SDIFFSTORE dest key [key1 …]

命令说明:获取key的set与后面key对应的set的差集元素,然后将差集元素放到dest中。如果dest不存在,则新建。如果dest已经存在,则覆盖dest。如果dest,keys任意一个不是set,执行异常。

返回值:差集元素数量。

Redis--数据结构--Set_Redis的常用业务场景_10

2.11 交集

命令SINTER key [key1 …]

命令说明:获取指定keys的set的交集元素。如果任意一个key的set为空或者key不存在,那么交集也是空。如果任意一个key不是set,那么执行异常。

返回值:交集元素list。

Redis--数据结构--Set_Redis的集合能干什么_11

2.12 交集存储

命令SINTERSTORE dest key [key1 …]

命令说明:获取keys的set的交集元素,然后将交集元素存入dest中。如果dest不存在,那么创建。如果dest不为空,那么覆盖dest。如果dest,keys任意一个不是set,那么执行异常。

返回值:交集元素数量。

Redis--数据结构--Set_Redis的集合能干什么_12

2.13 并集

命令SUNION key [key1 …]

命令说明:获取keys的set的所有元素的并集元素。如果key不存在,那么将被当做空set处理。如果任意key不是set,执行异常。

返回值:并集元素list。

Redis--数据结构--Set_Redis的常用业务场景_13

2.14 并集存储

命令SUNIONSTORE dest key [key1 …]

命令说明:获取keys的set的所有元素的并集元素,然后将元素存入dest。如果dest不存在,那么创建。如果dest存在,那么覆盖dest。如果dest,keys任意不是set,那么执行异常。

返回值:并集元素数量。

Redis--数据结构--Set_Redis的Set操作_14

3. 示例

3.1 随机展示

首页随机展示信息:

创建信息set,然后每次打开首页,从set中随机取出n条。

Redis--数据结构--Set_Redis的集合能干什么_15

3.2 随机执行

多线程条件下,任务存储在redis的set中,每个线程随机获取n个任务执行。

创建tasks的set,然后每次随机取出n个任务。

Redis--数据结构--Set_Redis的Set操作_16

3.3 黑白名单

借助set的不可重复以及查询高效的特性,做黑白名单。

创建wl白名单和bl黑名单,每次请求时判断。

用户要么在黑名单,要么在白名单。

白名单优先

首先获取白名单的交集 => twl

然后将白名单的差集从黑名单中取出。

Redis--数据结构--Set_Redis的Set_17

黑名单优先

首先获取黑名单的交集 => tbl

然后将黑名单的差集从白名单中取出。

Redis--数据结构--Set_Redis的集合操作_18

判断是否在黑名单中

Redis--数据结构--Set_Redis的集合操作_19