5、集合

集合(set)类型也是用来保存多个字符串元素,但是与列表不一样的是,集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素。

如图2-22所示,集合user:1:follow的这个key包含着“it”、“music”、“his”、“sports”四个元素(value),一个集合最多可以存储2^32-1个元素。redis除了支持集合内的增删改查,还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决许多问题。

5.1 命令

下面将按照集合内和集合间两个维度对集合的常用命令进行说明。

5.1.1 集合内操作

(1)添加元素

 sadd key element [element ...]

返回结果为添加成功的元素个数,例如:

(2)删除元素

 srem key element [element ...]

返回结果为成功删除元素个数,例如:

(3)计算元素个数

 scard key

scard的时间复杂度为O(1),它不会遍历集合的所有元素,而是直接用redis内部的变量,例如:

(4)判断元素是否在集合中

 sismember key element

如果给定元素element在集合中则返回1,否则返回0,例如:

(5)随机从集合中返回指定个数的元素

 srandmember key [count]

[count]是可选参数,如果不写默认为1,例如:

(6)从集合随机弹出元素

 spop key

spop操作可以从集合中随机弹出一个元素,例如下面代码是一次spop后的结果:

srandmember和spop都是随机从集合中选出元素,两者不同的是spop命令执行后,元素会从集合中删除,而srandmember不会删除。

(7)获取所有元素

 smember key

下面的代码获取集合myset所有元素,并且返回结果是无序的:

smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞redis的可能性,这时可以使用sscan来完成。

5.1.2 集合间操作

现在有两个集合,它们分别是user:1:follow和user:2:follow

(1)求多个集合的交集

 sinter key [key ...]

例如下面代码是求user:1:follow和user:2:follow两个集合的交集,返回结果是sports、it:

(2)求多个集合的并集

 suinon key [key ...]

例如下面代码是求user:1:follow和user:2:follow两个集合的并集,返回结果是sports、it、his、news、music、ent:

(3)求多个集合的差集

 sdiff key [key...]

(4)将交集、并集、差集的结果保存

 sinterstore  destination key [key ...]
suionstore destination key [key ...]
sdiffstore destination key [key ...]

集合间的运算在元素较多的情况下会比较耗时,所以redis提供了上面的3个命令(原始命令+store)将集合间交集、并集、差集的结果保存在destination key中。例如下面操作将user:1:follow和user:2:follow两个集合的交集结果保存在user:1_2:inter中,user:1_2:inter本身也是集合类型。

以下是set的常用命令的时间复杂度:

5.2 内部编码

集合类型的内部编码有两种:

  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-insert-entries配置(默认为512个)时,redis会选用insert来作为集合的内部实现,从而减少内存的使用。
  • hashable(哈希表):当集合烈性无法满足insert的条件时,redis会使用hashtable作为集合的内部实现。

5.3 使用场景

集合类型比较典型的使用场景是标签(tag)。

【redis 学习系列】API的理解与使用(四)的更多相关文章

  1. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  2. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)

    本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...

  3. 分布式缓存技术redis学习系列

    分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...

  4. redis学习系列

    redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...

  5. C# Redis学习系列三:Redis配置主从

    Redis配置主从 主IP :端口      192.168.0.103 6666 从IP:端口       192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...

  6. Python操作redis学习系列之(集合)set,redis set详解 (六)

    # -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...

  7. C# Redis学习系列二:Redis基本设置

    上一篇:C# Redis学习系列一:Redis的认识.下载.安装.使用 一.redis 设置密码 使用下载好的 redis-cli.exe 指令: 1.设置密码: config set require ...

  8. Redis学习系列一Linux环境搭建

    1.简介 Redis是互联网技术架构中在存储系统中用的最广泛的中间件,是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一.所以Redis是.Net技术开发必须掌握的技能之一.所以通过这个系列的随 ...

  9. 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua

    3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...

  10. 【redis 学习系列】API的理解与使用(一)

    Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构 1.预备知识 1.1 全局命令 Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令. (1)查看所 ...

随机推荐

  1. Windows编程 Windows程序的生与死(下)

    再谈程序之“死” 记得在第二回中我对程序的“死”只是一句话带过,因为我还没有铺垫好,好了现在我们可以详细的分析一下这个过程了. 这还要从while消息循环说起,还记得GetMessage函数吗?它是一 ...

  2. ASP.NET-A low-level Look at the ASP.NE

    请求处理模型1: ******** 1.浏览器向服务器发送请求,先到达服务器的http.sys系统文件,进行初步的处理. (服务器分为内核模式和用户模式,http.sys在内核模式种,IIS在用户模式 ...

  3. 分布式全局ID的几种生成方案

    前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等. 那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是 ...

  4. 第五章、前端之JQuery

    目录 第五章.前端之JQuery 一.选择器 二.基本筛选器 三.样式操作 四.位置操作 五.文本操作 六.属性操作 七.文档处理 八.事件 九.动画效果 十.补充 第五章.前端之JQuery 一.选 ...

  5. late_initcall 替换 module_init

    今天在调试pwm驱动程序的时候,在__init函数中调用pwm_init后,则以太网不可用.pwm_init放在设备文件的open函数中,则系统正常运行. 这当中的区别就是硬件初始化函数pwm_ini ...

  6. Java通过JDBC连接SQL Server2017数据库

    一.需要明白的基础知识 数据库名 驱动jar(x表示版本号) 具体驱动类 连接字符串(ip地址,端口号,名字) Oracle ojdbc-x.jar oracle.jdbc.oracleDriver ...

  7. SQLite3学习笔记(2)

      SQLite 创建表 SQLite 的CREATE TABLE 语句用于在任何指定的数据库创建一个新表. 创建新表,涉及到命名表.定义列及每一行的数据类型. CREATE TABLE 的基本语法如 ...

  8. Git---Ubuntu下的安装与使用

    Git---Ubuntu下的安装与使用 注意:学会Git的唯一方式是在实际使用中学习,切记不要尝试先记住一大堆理论知识或者Git命令.

  9. 海康威视面试-java应用开发

    一面:技术面 (1)对着简历问本科学过的java相关课程,都学了哪些东西.很懵逼,很早之前学的东西,我都记不清楚了 (2)网络编程相关知识,我也不太懂,就回答了网络协议这块的知识 (3)线程相关,线程 ...

  10. grep匹配命令

    关于匹配的实例: 统计所有包含“48”字符的行有多少行 grep -c "48" demo.txt   不区分大小写查找“May”所有的行) grep -i "May&q ...