【redis 学习系列】API的理解与使用(四)
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的理解与使用(四)的更多相关文章
- 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 分布式缓存技术redis学习系列
分布式缓存技术redis学习系列(一)--redis简介以及linux上的安装以及操作redis问题整理 分布式缓存技术redis学习系列(二)--详细讲解redis数据结构(内存模型)以及常用命令 ...
- redis学习系列
redis学习系列 基本看完 最近在看redis的代码,简单记录下自己认为重要的点,自己写比较费时间的,我会把查到的资料贴出来方便查看 淘宝的redis内存分析 http://www.searchtb ...
- C# Redis学习系列三:Redis配置主从
Redis配置主从 主IP :端口 192.168.0.103 6666 从IP:端口 192.168.0.108 3333 配置从库 (1)安装服务: redis-server ...
- Python操作redis学习系列之(集合)set,redis set详解 (六)
# -*- coding: utf-8 -*- import redis r = redis.Redis(host=") 1. Sadd 命令将一个或多个成员元素加入到集合中,已经存在于集合 ...
- C# Redis学习系列二:Redis基本设置
上一篇:C# Redis学习系列一:Redis的认识.下载.安装.使用 一.redis 设置密码 使用下载好的 redis-cli.exe 指令: 1.设置密码: config set require ...
- Redis学习系列一Linux环境搭建
1.简介 Redis是互联网技术架构中在存储系统中用的最广泛的中间件,是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一.所以Redis是.Net技术开发必须掌握的技能之一.所以通过这个系列的随 ...
- 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua
3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...
- 【redis 学习系列】API的理解与使用(一)
Redis提供了5种数据结构,以下介绍一些预备知识以及Redis的5种数据结构 1.预备知识 1.1 全局命令 Redis的5种数据结构,它们是键值对中的值,对于键来说有一些通用的命令. (1)查看所 ...
随机推荐
- element-ui 中 table 鼠标悬停时背景颜色修改
样式穿透: /deep/ .el-table tbody tr:hover>td { background-color: #颜色 }
- sql游标循环
DECLARE @begindate DATETIME=CONVERT(DATETIME, '2019.05.06 09:40:50') ,@enddate DATETIME =GETDATE() , ...
- 在QT中添加LIB的方法
注意:-L后面跟着的目录不能用空格,否则会出现读不到的情况. 例如win32下添加D:\app\my.lib 就 pro文件中 LIBS += -LD:\app\debug\ -lmy
- JS闭包的简单理解。优缺点以及垃圾回收机制
闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...
- js获取图片内容上传
<script> $('#pic').change(function(){ var size=document.getElementById('pic').files[0].size va ...
- Java后端开发常用工具
Java后端开发常用工具推荐: 俗话说,工欲善其事,必先利其器.不过初学时候不大建议过度依赖IDE等过多工具,这会让自己的编程基础功变得很差,比如各种语法的不熟悉,各种关键字比如synchronize ...
- PPT 设置幻灯片母版
现在我设计了一个PPT背景,我想新建幻灯片的时候,直接就是以这个背景展现,并把这个背景作用于左右的幻灯片. 1.选中第二页幻灯片,CTRL + C 复制一下 2.点击视图,幻灯片母版,背景样式,点击下 ...
- RobHess的SIFT代码解析步骤三
平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32 主要参考:1.代码:RobHess的SIFT源码 2.书:王永明 ...
- 【异常】azkaban.executor.ExecutorManagerException: No active executors found
1 azkaban启动异常 没有找到活动的executors,需在MySQL数据库里设置端口为12321的executors表的active为1 update azkaban.executors ...
- Oracle笔记(十一) 建表、更新、查询综合练习
有某个学生运动会比赛信息的数据库,保存了如下的表: 运动员sporter(运动员编号sporterid,运动员姓名name,运动员性别sex,所属系号department) 项目item(项目编号it ...