Redis常见基本类型(5)-List, Set

List

命令小结

命令及解释时间复杂度
lpush/rpush key value[key value...](向右/左端插入元素)O(k), k是元素个数
linsert key before | after pivot value(在某个坐标之前/右插入元素)O(n), n是pivot距离头尾的距离
lrange start end(获取从start到end部分的元素)O(s + n): s是start的偏移量, n是end-start
llen key(求当前列表的长度)O(1)
lindex key index(求列表中某一个下标的元素)O(n), n 是索引的偏移量
lpop/rpop key(删除左/右侧元素)O(1)
lrem key count value(从value开始, 删除count个元素)O(k), k是元素个数
ltrim key start end(截取(并留下)start到end部分的列表元素,闭区间)O(k), k是元素个数
lbpop/rbpop(删除左/右侧元素阻塞版)O(1)

内部编码

现在主要是使用quicklist的方式: 相当于链表和压缩列表的结合. 整体还是链表, 链表中的每个元素是一个压缩列表, 每个压缩列表都不宜过大(元素数量小于512, 每个元素小于64byte), 再通过链式连接.

使用场景

消息队列

如图所示: Redis可以使用lpush + brpop命令结合形成典型的生产者消费者模型队列. 生产者通过lpush向消息队列中插入元素, 多个客户端在消息队列另一边利用brpop取走数据.

 

分频道的消息队列

就是说不同的消费者在不同的队列中获取元素, 消费者通过brpop不同的键值, 从而在不同频道上获取信息. (比如在b站中, 弹幕信息是一个消息队列, 收藏信息是一个消息队列, 评论信息是一个消息队列).

 

 

Set

集合类型也是用来存储元素的, 与列表不同的是, 集合中的元素不是有顺序的(所谓有顺序, 就比如在列表它是怎么插入的, 就可以以相同的顺序拿出元素), 然后集合不能存储重复元素(列表可以存储重复元素). Redis中除了支持集合内增删查改操作, 同时还支持多个集合取交集, 并集, 差集, 合理地使用好集合类型, 能在实际开发中解决很多问题.

基本指令

sadd

向集合中插入一个/多个元素. 注: 重复的元素无法添加到set中.

语法:

sadd key member [member...]

时间复杂度: O(1)

返回值: 本次添加成功的元素个数.

smembers

获取一个set中的所有元素, 注意: 元素间的排序是无序的.

语法:

smembers key

时间复杂度: O(N)

返回值: 所有元素的列表.

sismember

判断一个元素是否在元素中

语法:

 sismember key member

时间复杂度: O(1)

返回值: 1表示元素在set中, 0表示元素不在set中或者key不存在.

scard

获取set包含的元素数目

语法:

scard key

时间复杂度: O(1)

返回值: set内的元素个数.

spop

从set中删除并返回一个/多个元素. 注意: 由于set内的元素是无序的, 所以取出哪个元素实际是未定义行为, 即可看作随机的

语法:

spop key [count]

时间复杂度: O(count)

返回值: 取出的元素.

 

smove

将一个元素从源set取出并放入目标set中.

 语法:

smove source destination member

时间复杂度:O(1)

返回值: 1表示成功, 0表示失败.

 

srem

将指定元素从set 中删除.

语法:

 srem key member [member ...]

时间复杂度: O(N), N是要删除的元素个数

返回值: 本次操作删除的元素个数.

集合间操作

回顾一下高一学的集合的几个概念:

假设有key1(a, b, c, d, e, f), key2(a, c, f, h, i)两个集合.

交集: a, b中都包含的元素, 即 a, c, f

并集: a, b所有的元素, 即a, b, c, d, e, f, h, i

差集: 两个集合之间的差异, 集合a的差集b(记作a-b), 即属于集合a而不属于集合b的元素

a-b: b, d, e

b-a: h, i

sinter

获取给定set交集中的元素

语法:

sinter key [key ...]

时间复杂度: O(M * N), N是最小的集合元素个数, M是最大的集合元素个数.

返回值: 交集的元素.

 

sinterstore

获取给定set的交集中的元素并保存到目标set中.

 语法:

sinterstore destination key [key ...]

返回值: 交集的元素个数

sunion

获取给定set的并集中的元素

语法:

sunion key [key ...]

时间复杂度: O(N), N为给定的所有集合中总的元素个数.

返回值: 并集元素.

 

sunionstore

与sinterstore使用基本一致, 将并集放入目标set中.

sdiff

 获取给定set的差集中的元素.

语法:

sdiff key [key ...]

时间复杂度: O(N), N为给定的所有集合中总的元素个数.

返回值: 差集的元素.

 

sdiffstore

与sinterstore作用基本一致, 获取给定set中的差集, 并放入目标set中. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644006.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

与用户沟通获取需求的方法

1 访谈 访谈是最早开始使用的获取用户需求的技术,也是迄今为止仍然广泛使用的需求分析技术。 访谈有两种基本形式,分别是正式的和非正式的访谈。正式访谈时,系统分析员将提出一些事先准备好的具体问题,例如&#xff0…

Java使用apache.poi生成excel插入word中

加油,新时代打工人! 工作需求,上个文章我们生成好的word,这次将生成好的excel表格数据,插入word中。需要准备好excle数据,然后插入到word中。 最后个需要,就是把这些生成好的word文档转成pdf进行…

基础技术-ELF系列(1)-ELF文件基础

成就更好的自己 本篇是基础技术系列中ELF相关技术的首篇文章。 尽管网上有许多关于ELF相关内容的文章,但总体而言,要么是一些非常基础且重复性强的内容,要么直接深入探讨相对高深的主题,缺乏系统化分析和解释。 接下来&#xf…

C++技能进阶指南——多态语法剖析

前言:多态是面向对象的三大特性之一。顾名思义, 多态就是多种状态。 那么是什么的多种状态呢? 这里的可能有很多。比如我们去买火车票, 有普通票, 学生票; 又比如我们去旅游, 有儿童票&#xff…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器,可以快速将文本内容转换成极具吸引力的视频。操作简单,用户只需输入文字,选择喜欢的样式和模板, “巨日禄”就会…

Nginx - 安全基线配置与操作指南

文章目录 概述中间件安全基线配置手册1. 概述1.1 目的1.2 适用范围 2. Nginx基线配置2.1 版本说明2.2 安装目录2.3 用户创建2.4 二进制文件权限2.5 关闭服务器标记2.6 设置 timeout2.7 设置 NGINX 缓冲区2.8 日志配置2.9 日志切割2.10 限制访问 IP2.11 限制仅允许域名访问2.12 …

【408真题】2009-16

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

qemu+gdb调试linux内核

打开CONFIG_DEBUG_INFO,编译内核 通过图形菜单配置该宏,执行make menuconfig。 kernel hacking —> compile-time checks and compiler options —> compile the kernel with debug info 验证是否打开成功,grep -nr “CONFIG_DEBUG_INFO” .config。 打开成功,然后…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

【Linux】信号之信号的保存和处理详解

&#x1f916;个人主页&#xff1a;晚风相伴-CSDN博客 &#x1f496;如果觉得内容对你有帮助的话&#xff0c;还请给博主一键三连&#xff08;点赞&#x1f49c;、收藏&#x1f9e1;、关注&#x1f49a;&#xff09;吧 &#x1f64f;如果内容有误或者有写的不好的地方的话&…

仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码

码名称&#xff1a;仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 仿《Q极速体育》NBACBA体育直播吧足球直播综合体育直播源码自动采集 - 我爱模板网源码名称&#xff1a;仿《Q极速体育》NBACBA体育直…

编程实战:自己编写HTTP服务器(系列3:处理框架)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 系列入口&#xff1a;编程实战…

需求分析部分图形工具

描述复杂的事物时,图形远比文字叙述优越得多,它形象直观容易理解。前面已经介绍了用于建立功能模型的数据流图、用于建立数据模型的实体-联系图和用于建立行为模型的状态图,本节再简要地介绍在需求分析阶段可能用到的另外3种图形工具。 1 层次方框图 层次方框图用树形结…

LaTex 模板 - 东北师范大学申研申博推荐信

文章目录 NENU-Letter-Template项目地址示例特性项目结构如何使用main.texletterContent.tex 如何编译方式 1 &#xff1a;在线编译方式 2 &#xff1a;本地编译 参考 NENU-Letter-Template NENU’s recommendation letter template. 东北师范大学推荐信模板 项目地址 GitHu…

Spring框架学习笔记(五):JdbcTemplate 和 声明式事务

基本介绍&#xff1a;通过 Spring 框架可以配置数据源&#xff0c;从而完成对数据表的操作。JdbcTemplate 是 Spring 提供的访问数据库的技术。将 JDBC 的常用操作封装为模板方法 1 JdbcTemplate 使用前需进行如下配置 1.1 在maven项目的pom文件加入以下依赖 <dependencies…

Windows安装并启动Redis服务端(zip包)

一、Redis简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的基于内存的 Key - Value结构的数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;常用于缓存、消息队列、会话存储…

c# sqlite使用

安装包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…

Python小游戏——打砖块

文章目录 打砖块游戏项目介绍及实现项目介绍环境配置代码设计思路代码设计详细过程 难点分析源代码代码效果 打砖块游戏项目介绍及实现 项目介绍 打砖块游戏是一款经典的街机游戏&#xff0c;通过控制挡板来反弹小球打碎屏幕上的砖块。该项目使用Python语言和Pygame库进行实现…

鲁教版七年级数学上册-笔记

文章目录 第一章 三角形1 认识三角形2 图形的全等3 探索三角形全等的条件4 三角形的尺规作图5 利用三角形全等测距离 第二章 轴对称1 轴对称现象2 探索轴对称的性质4 利用轴对称进行设计 第三章 勾股定理1 探索勾股定理2 一定是直角三角形吗3 勾股定理的应用举例 第四章 实数1 …

【实际项目精选源码】ehr人力资源管理系统实现案例(java,vue)

一、项目介绍 一款全源码可二开&#xff0c;可基于云部署、私有部署的企业级数字化人力资源管理系统&#xff0c;涵盖了招聘、人事、考勤、绩效、社保、酬薪六大模块&#xff0c;解决了从人事招聘到酬薪计算的全周期人力资源管理&#xff0c;符合当下大中小型企业组织架构管理运…