3.5集合类型
3.5.1介绍
- 在集合中的每个元素都是不同的,且没有顺序
表3-4集合类型和列表类型的对比
- | 集合类型 | 列表类型 |
---|---|---|
存储内容 | 至多232-1个字符串 | 至多232-1个字符串 |
有序性 | 否 | 是 |
唯一性 | 是 | 否 |
- 集合类型在redis内部是使用值为空的散列表实现的,所有这些操作的
事件复杂度都是O(I)
3.5.2命令
-
增加/删除元素
sadd key member [member ...]
向集合中增加元素,如果键不存在会自动创建- 如果加入的元素已经存在域集合,就会忽略这个元素
返回值是成功加入元素数量
srem key member [member ...]
用来从集合删除元素
返回值是删除成功的个数 - 如果加入的元素已经存在域集合,就会忽略这个元素
-
获得集合中的所有元素:
smembers key
-
判断元素是否在集合:sismember key member
127.0.0.1:6379> sadd 江湖 张无忌 1 127.0.0.1:6379> sadd 江湖 赵敏 周芷若 2 127.0.0.1:6379> smembers 江湖 赵敏 张无忌 周芷若 127.0.0.1:6379> srem 江湖 周芷若 1 127.0.0.1:6379> sismember 江湖 周芷若 0
-
集合间运算
sdiff key1 [key2 key3 ,,]
多个集合执行差集运算- 两个集合: key1的值 - key2的值
- 三个集合: (key1的值 -key2的值) - key3的值
127.0.0.1:6379> sadd 武林 张无忌 张三丰 杨逍 赵敏 4 127.0.0.1:6379> sadd 江湖 周芷若 张无忌 赵敏 3 127.0.0.1:6379> sdiff 江湖 武林 周芷若 127.0.0.1:6379> sdiff 武林 江湖 张三丰 杨逍 127.0.0.1:6379> sadd 武当 张三丰 张无忌 2 127.0.0.1:6379> sdiff 武林 江湖 武当 杨逍
sinter key [key ,,]
对多个集合执行交集运算127.0.0.1:6379> sinter 江湖 武林 赵敏 张无忌 127.0.0.1:6379> sinter 江湖 武林 武当 张无忌
sunion key [key ,,]
对多个集合执行并集运算127.0.0.1:6379> sunion 江湖 武林 周芷若 张无忌 赵敏 杨逍 张三丰
3.5.3实践
-
存储文章标签
文章的所有标签互不相同,且对排序没有要求
对每篇文章使用键名为post:文章ID:tags
的键存储该文章的标签
伪代码:# 给ID为42的文章增加标签 sadd post:42:tags,闲言碎语,技术文章,java # 删除标签 srem post:42:tags,闲言碎语 # 显示所有的标签 $tags = smembers post:42:tags print $tags
- 使用集合类型键存储标签适合需要单独增加或删除标签的场合
-
通过标签搜索文章
列出某个标签下的所有文章,甚至需要获得属于几个标签的文章列表
现有3张表
表3-5 posts表结构字段名 说明 post_id 文章ID post_title 文章标题 表3-6 tags表结构
字段名 说明 tag_id 标签ID tag_name 标签名称 表3-7 posts_tags表结构
字段名 说明 post_id 对应的文章ID tag_id 对应的标签ID 图3-18和标签有关部分的存储结构
键 集合值 post:1:tags java post:2:tags java mysql post:3:tags java mysql redis tag:redis:posts 3 tag:mysql:posts 2 3 tag:java:posts 1 2 3 当需要获取'mysql'标签的文章,只需要使用命令
smembers tag:mysql:posts
如果要实现找到同时须臾java,mysql,redis的文章,
将其三个键取并集
3.5.4命令拾遗
- 获得集合中元素的个数:scard key
127.0.0.1:6379> sadd foo 1 2 3 4 5 5 127.0.0.1:6379> scard foo 5
- 进行集合运算并将结果存储
sdiffstore destination key [key ...]
sinterstore destination key [key ...]
sunionstore destination key [key ...]
127.0.0.1:6379> sadd bar 1 3 5 7 9 5 127.0.0.1:6379> sdiffstore baz foo bar 2 127.0.0.1:6379> smembers baz 2 4 127.0.0.1:6379> sinterstore baz foo bar 3 127.0.0.1:6379> smembers baz 1 3 5 127.0.0.1:6379> sunionstore baz foo bar 7 127.0.0.1:6379> smembers baz 1 2 3 4 5 7 9
- 随机获得集合中元素:
srandmember key [count]
- count为正数时,从集合中获取count个不重复元素
如果count大于集合元素,则返回集合所有元素 - count为负数时,从集合中获取|count|个元素,
这些元素有可能重复
127.0.0.1:6379> sadd foo book look good 3 127.0.0.1:6379> srandmember foo book 127.0.0.1:6379> srandmember foo 2 book look 127.0.0.1:6379> srandmember foo 5 book look good 127.0.0.1:6379> srandmember foo -5 book look book book look
- count为正数时,从集合中获取count个不重复元素
- 从集合中弹出一个元素:
spop key
127.0.0.1:6379> spop foo book 127.0.0.1:6379> smembers foo good look