【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)查看所 ...
随机推荐
- MQTT协议探究(三)
1 回顾与本次目标 1.1 回顾 主题通配符 主题语义和用法 WireShark进行抓包分析了报文 报文分析: SUBSCRIBE--订阅主题 SUBACK--订阅确认 UNNSUBSCRIBE--取 ...
- C#异步编程中的最佳实践(做法)
原文地址Stephen Cleary 写得很详细,尤其讲到了 GUI 上下文调用,在APS.NET中它会阻塞 GUI 线程,从而导致死锁.而控制台中却不存在这个问题. 比如开发过程中本地写控制台程序测 ...
- 搞懂String、StringBuffer、StringBuilder的区别
String.StringBuffer.StringBuilder有什么区别呢? 1.String: 首先String是不可变的这是家喻户晓的,它的底层是用一个final修饰的char数组来保存数据的 ...
- vue网络不好时不间断请求
配置默认参数 const { apiConfig: { timeout, retry, retryDelay } } = config; if(timeout) axios.defaults.time ...
- C++ STL 之 multimap案例之员工分组
#include <iostream> #include <vector> #include <map> #include <string> #incl ...
- 如何用Visual Studio Code远程调试运行在服务器上的nodejs应用
假设我有一个nodejs应用,运行在AWS - 亚马逊云平台上(Amazone Web Service).我想用本地的Visual Studio Code来远程调试服务器端的nodejs应用. Vis ...
- 4.性能下降原因和常见的Join查询
性能下降 SQL慢,执行时间长,等待时间长 1.查询语句写的烂 2.索引失效 单值索引失效 和 复合索引失效 3.关联查询太多join(设计缺陷或不得已的需求) 4.服务器调优及各个参数设置(缓冲.线 ...
- python3 中的cls和self的区别 静态方法和类方法的区别
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某 ...
- Centos安装MySQL5.6并重置密码
数据库配置 如果用的是自带的sqllite那么数据库就可以不动 安装MySQL5.6数据库 这里强烈建议用使用5.6, 5.7版本的数据库遇见了很多BUG 安装MySQL wget http://de ...
- Django_01_创建图书管理项目
在django中,项目的组织结构为一个项目包含多个应用,一个应用对应一个业务模块 示例:创建项目的名称为test1,完成“图书-英雄”信息的维护,创建应用名称为booktest 创建项目:首先进入到虚 ...