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. PDF编辑方法,PDF如何去除数字签名

    有些人会在PDF文件中添加数字签名,但当PDF文件有数字签名的时候就无法对PDF文件进行编辑.添加等操作.这个时候就需要去除PDF文件中的数字签名了,要怎么做呢,就由我来跟大家分享一下小编我的去除数字 ...

  2. noip 2018游记

    憋了好久的游记... 考虑到写游记是oi界的传统,所以还是应该写一篇的. day0: 上午9:30的火车出发,车上颓三国杀! 中午12:00到了大连,下午2:00才开始试机,还是得先去大连大学,在食堂 ...

  3. python datetime.datetime is not JSON serializable

    1.主要是python  list转换成json时对时间报错:datetime.datetime(2014, 5, 23, 9, 33, 3) is not JSON serializable. 2. ...

  4. Linux系统编程目录

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

  5. net core 使用 rabbitmq

    windows环境安装: https://www.cnblogs.com/ericli-ericli/p/5902270.html .NET Core 使用RabbitMQ https://www.c ...

  6. Supervisor Linux程序进程管理

    Supervisor 介绍 在linux或者unix操作系统中,守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.由于在linux中 ...

  7. mysql存储过程的学习(mysql提高执行效率之进阶过程)

    1:存储过程: 答:存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理:存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储类型可以接受 ...

  8. webpack学习笔记--多种配置类型

    除了通过导出一个 Object 来描述 Webpack 所需的配置外,还有其它更灵活的方式,以简化不同场景的配置. 下面来一一介绍它们. 导出一个 Function 在大多数时候你需要从同一份源代码中 ...

  9. functiontools模块

    #!/usr/bin/env python# -*- coding:utf-8 -*-from functools import cmp_to_key a = [1, 6, 4, 5]a.sort(k ...

  10. BZOJ 1706

    题解: 倍增+floyd 首先这题比较容易想到是把每个点拆点做dij 但是这样复杂度是knlogn的 这道题的k较大,所以不行 我们考虑到每走一步,其实就是在进行一次floyd 而这个可以看成矩阵乘法 ...