前言
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,而集合就类似数学中有三大特性,确定性,无序性,互异性,那么自然集合中不能有重复的数据,和上一节redis的list列表类型不同,list的顺序不一样,也表示不同的key。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
情景融入
类似qq好友推荐功能,你们的共同好友,注意集合中的各个元素不能重复,没有顺序。既然是集合,那么就有集合的运算,并交差集。
现在这里有两个人的朋友圈,tom和linken的圈子,他们都有各自的朋友,而且他们朋友之间也有一样的。看下面这个图。
那用数学符号表示一下
tomU={mary,jack,wang5,wang6,xiaoming};
linkenU={yuehan,daxiong,luce,wang5,wang6};
如何把他们进行添加到redis,并且进行运算操作?
命令操作
【1】集合元素的添加
#<1>向集合添加一个或多个成员
sadd key member [member ...]
注意:
命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。假如集合 key 不存在,则创建一个只包含添加的元素作成员的集合。当集合 key 不是集合类型时,返回一个错误。
返回: 添加成功,返回刚才添加进去的元素的个数,(与集合中重复的元素,或者添加中有重复的元素,只算作一个)。
用这个命令添加到redis中,如图
【2】集合的运算(交,并,差)
#<2>返回给定所有集合的交集
sinter key [key ...]
#<3>返回所有给定集合的并集
sunion key [key ...]
#<4>返回给定所有集合的差集
sdiff key [key ...]
注意:不存在的集合 key 被视为空集
sinter 当给定集合当中有一个空集时,交集结果也为空集(根据集合运算定律)。
sunion当给定集合当中有一个空集时,并集结果就是除了空集其他的集合并集(根据集合运算定律)。
sdiff 前面的集合对后面的集合做差运算,那么差集的结果元素总是来自前面的集合元素(根据集合运算定律)。所以差集要注意顺序
如果想要将集合运算的结果保存在另一个集合destination中可以用下面的命令
sinterstore/ sunionstore/sdiffstore destination key [key ...]
返回:
sinter 返回给定集合的交集 上面例子也就是,tomU ∩ linkenU
sunion 返回给定集合的并集 上面例子也就是,tomU ∪ linkenU
sdiff 返回给定集合的差集 上面例子也就是,tomU - linkenU , linkenU - tomU 这两个结果是不一样的
【3】其他常用命令
#<5>获取集合的成员数
scard key
#<6>返回集合中的所有成员
smembers key
#<7>将 member 元素从 source 集合移动到 destination 集合
smove source destination member
#<8>移除集合中一个或多个成员
srem key member [member ...]
#<9>判断 member 元素是否是集合 key 的成员
sismember key member
【4】随机操作
#<10>返回集合中一个或多个随机数
srandmember key [count]
#<11>移除并返回集合中的一个随机元素
spop key [count]