3.5集合类型

3.5.1介绍

  • 在集合中的每个元素都是不同的,且没有顺序

    表3-4集合类型和列表类型的对比
- 集合类型 列表类型
存储内容 至多232-1个字符串 至多232-1个字符串
有序性
唯一性
  • 集合类型在redis内部是使用值为空的散列表实现的,所有这些操作的

    事件复杂度都是O(I)

3.5.2命令

  1. 增加/删除元素

    sadd key member [member ...]

    向集合中增加元素,如果键不存在会自动创建

    • 如果加入的元素已经存在域集合,就会忽略这个元素

      返回值是成功加入元素数量

    srem key member [member ...]

    用来从集合删除元素

    返回值是删除成功的个数

  2. 获得集合中的所有元素:smembers key

  3. 判断元素是否在集合: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
  4. 集合间运算

    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实践

  1. 存储文章标签

    文章的所有标签互不相同,且对排序没有要求

    对每篇文章使用键名为post:文章ID:tags的键存储该文章的标签

    伪代码:

    # 给ID为42的文章增加标签
    sadd post:42:tags,闲言碎语,技术文章,java
    # 删除标签
    srem post:42:tags,闲言碎语
    # 显示所有的标签
    $tags = smembers post:42:tags
    print $tags
    • 使用集合类型键存储标签适合需要单独增加或删除标签的场合
  2. 通过标签搜索文章

    列出某个标签下的所有文章,甚至需要获得属于几个标签的文章列表

    现有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命令拾遗

  1. 获得集合中元素的个数:scard key
    127.0.0.1:6379> sadd foo 1 2 3 4 5
    5
    127.0.0.1:6379> scard foo
    5
  2. 进行集合运算并将结果存储

    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
  3. 随机获得集合中元素: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
  4. 从集合中弹出一个元素:spop key
    127.0.0.1:6379>  spop foo
    book
    127.0.0.1:6379> smembers foo
    good
    look

Redis自学笔记:3.5入门-集合类型的更多相关文章

  1. Redis自学笔记:3.2入门-字符串类型

    3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...

  2. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

  3. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  4. Redis自学笔记:3.3入门-散列类型

    3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...

  5. Redis自学笔记:3.1入门-热身

    第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...

  6. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

  7. jQuery:自学笔记(1)——基础入门

    jQuery:自学笔记(1)——基础入门 认识JQuery 1.jQuery概述 jQuery是一个快速.小巧 .功能丰富的JavaScript函数库.它可以实现“写的少,做的多”的目标. jQuer ...

  8. Redis自学笔记:1.简介

    博主教材:李子骅.人民邮电出版社.<redis入门指南> 博主操作系统系统:虚拟机Ubuntu16.04 博主redis版本:3.0.6 第1章:简介 redis是一个开源的.高性能的.基 ...

  9. Redis自学笔记:4.4进阶-消息通知

    4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...

随机推荐

  1. LeetCode(83): 删除排序链表中的重复元素

    Easy! 题目描述: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1-&g ...

  2. 用来表达更复杂的sql语句!!!!!extra 原声sql

    extra 用来表达更复杂的sql语句!!!!! extra可以指定一个或多个 参数,例如 select, where or tables. 这些参数都不是必须的,但是你至少要使用一个!要注意这些额外 ...

  3. 第二周学习总结-Java

    2018年7月22日 暑假第二周马上就要结束了,这一周我继续学习了java. 本周学到了一些Java的修饰词,比如static.private.public等,这些修饰词用法与c++类似,很容易掌握. ...

  4. servlet设置cookie

    Cookie cookie =new Cookie("user","黄花菜");//实例化一个Cookie对象 cookie.setMaxAge(7*24*60 ...

  5. 51Nod 1265 四点共面(计算几何)

    1265 四点共面  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面). ...

  6. jQuery常见案例

    jQuery常见案例 通过jQuery实现全选,反选取消: 选择 地址 端口 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 1.1.1.1 80 代码实现 <body> ...

  7. C/C++内存管理器

    C标准库提供了malloc,free,calloc,realloc,C++标准库还提供了new, new[], delete, delete[].这些用来管理内存,看起来够用了,为啥还要自己写一个内存 ...

  8. Linux系统编程目录

    进程环境 进程控制 1. fork.vfork.clone 2. 回收子进程 3. exec函数族 进程关系 1. 进程组 2. 会话 信号 1. 函数函数sigaction.signal 2.僵尸进 ...

  9. Vs2015 本地git获取的代码目录文件修改后,启动提示error:Unable to start program “C:\Program Files\dotnet\dotnet.exe” 已解决.

    http://stackoverflow.com/questions/39938453/unable-to-start-program-c-program-files-dotnet-dotnet-ex ...

  10. Ncurses-窗口

    前面介绍过标准屏幕 stdscr, stdscr 只是 WINDOW 结构的一个特例. 我们可以使用函数 newwin 和 delwin 来创建和销毁窗口 WINDOW *newwin(int num ...