Redis自学笔记:3.5入门-集合类型
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 key127.0.0.1:6379> spop foo
book
127.0.0.1:6379> smembers foo
good
look
Redis自学笔记:3.5入门-集合类型的更多相关文章
- Redis自学笔记:3.2入门-字符串类型
3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...
- Redis自学笔记:3.4入门-列表类型
3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...
- Redis自学笔记:3.6入门-有序集合类型
3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...
- Redis自学笔记:3.3入门-散列类型
3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...
- Redis自学笔记:3.1入门-热身
第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...
- JavaScript高级程序设计之自学笔记(一)————Array类型
以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...
- jQuery:自学笔记(1)——基础入门
jQuery:自学笔记(1)——基础入门 认识JQuery 1.jQuery概述 jQuery是一个快速.小巧 .功能丰富的JavaScript函数库.它可以实现“写的少,做的多”的目标. jQuer ...
- Redis自学笔记:1.简介
博主教材:李子骅.人民邮电出版社.<redis入门指南> 博主操作系统系统:虚拟机Ubuntu16.04 博主redis版本:3.0.6 第1章:简介 redis是一个开源的.高性能的.基 ...
- Redis自学笔记:4.4进阶-消息通知
4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...
随机推荐
- mysql where和having的区别
简单描述:需要查询一个数量count,于是做分组查询后,发现有的数据没有过滤掉,于是就想加上过滤条件,就在group by后边写了where ,发现不好使,直接就报错了,查了一下,where只能写在g ...
- java 命令行运行时报错:找不到或无法加载主类
源码如下: 路径目录(...\src\object) //: ch1.10/Command.java /**@author feilong * @version 1.0 */ package obje ...
- js FileReader 笔记
以上传图片为例 通过input type='file' 上传完成图片后,获取图片 $('#input').files[0] var reader = new FileReader(); read ...
- 区分TCP包的顺序
确认TCP包的顺序: 使用抓包工具抓包之后,通常按照时间先后排序的,而不是数据的内容逻辑先后.查找内容的先后的关键在于查看TCP中的Sequence number和Acknowledgment num ...
- JAVA 程序编译过程;编辑器,编译器和解释器
最基本的软件工具包括,编辑器,编译器,解释器; 编译器:编译器就是将一种编程语言代码翻译成另一种语言的等效代码程序. 解释器:解释器将编译和执行交织在一起,即编译一部分代码后执行该部分代码,然后再编译 ...
- 读C#开发实战1200例子记录-2017年8月14日10:03:55
C# 语言基础应用,注释 "///"标记不仅仅可以为代码段添加说明,它还有一项更重要的工作,就是用于生成自动文档.自动文档一般用于描述项目,是项目更加清晰直观.在VisualStu ...
- C++11 中的function和bind、lambda用法
std::function 1. std::bind绑定一个成员函数 #include <iostream> #include <functional> struct Foo ...
- MyBatis - 3.Mapper XML映射文件
SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序): cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂也是 ...
- Oracle数据库表索引失效,解决办法:修改Oracle数据库优化器模式
ALTER SYSTEM SET OPTIMIZER_MODE=RULE scope=both; 其他可以选择的模式还有ALL_ROWS/CHOOSE/FIRST_ROWS/ALL_ROWS. 应用系 ...
- 小改造gotty,使之适合接收经过一层加密的URL
当然,比起密码设置,这个安全性也不是特别高, 但比起直接传参数. 还是要专业一些的. 其实现思路分两种: 第一种是在gotty.js之内加入解url的函数. 第二种在是go源代码时,加入同等的解密函数 ...