Redis中的List类型

目录

List类型的命令

lpush

lpushx

rpush

lrange

lpop

rpop

lindex

linsert

llen

lrem

ltrim

lset

阻塞命令

阻塞命令的使用场景

1.针对一个非空的列表进行操作

2.针对一个空的列表进行操作

3.针对多个key进行操作.

内部编码

lisi类型的应用场景

存储(班级)信息

消息队列

分频道的消息队列

微博Timeline


列表(List)相当于是数组或者是顺序表.

结构示意图

约定最左侧的元素下标是0,redis的下标支持负数下标.

注意list内部的编码方式并非是一个简单的数组,而是更接近于双端队列.

列表中的元素是有序的,指的并不是其按照元素的数据大小进行排列,而是意味着当你向列表中插入元素时,它们会按照插入的顺序进行排序(比如尾插abc,得到的列表也是abc),并且每个元素都有一个关联的索引值来表示其位置。

列表中的元素是允许重复的.

List类型的命令

lpush

将一个或者多个元素从左侧放入到list中.(头插)

LPUSH key element [element ...]
返回的是插入后list的长度.

时间复杂度是O(N),N代表插入元素的个数.

lpushx

当key存在时,将一个或者多个元素从左侧放入到list中,不存在则直接返回.

x->exists.

LPUSHX key element [element ...]
返回的是插入后list的长度.
时间复杂度是O(N),N代表插入元素的个数.

rpush

将一个或者多个元素从右侧放入到list中,尾插.

RPUSH key element [element...........]
返回的是插入后list的长度.

时间复杂度是O(N),N代表插入元素的个数.

rpushx,类似与lpushx,尾插,不存在直接返回.

lrange

LRANGE key start stop
获取从start到end区间的所有元素,闭区间.下标是支持负数的.
返回的是指定区间的元素.

对于超出下标的情况,redis会尽可能的获取对应的内容.

lpop

LPOP key

从list左侧取出元素,即头删.

返回的是取出的元素或者nil.

rpop

从list右侧取出元素,尾删.

RPOP key
返回的是取出的元素或者nil.

lindex

LINDEX key index

获取从左数第index位置的元素.

时间复杂度是O(N),N指的是list中元素的个数.

返回的是取出的元素或者是nil.

linsert

LINSERT key <BEFORE | AFTER> pivot element

返回的是插入后list的长度.

时间复杂度是O(N).N代表列表的长度.

如果进行插入的时候,基准值有多个,redis是从左往右找,找到第一个符合基准值的位置.

llen

获取list的长度.

LLEN key

时间复杂度是O(1).

时间复杂度为什么是O(1):这是因为Redis将列表的长度存储在列表对象的内部数据结构中,并且在每次插入或删除元素时都会更新该长度。因此,当执行LLEN命令时,Redis可以直接返回列表的长度,无需遍历整个列表,所以时间复杂度是固定的,与列表的长度无关。

lrem

lrem key count element

count表示要删除的个数,element表示要删除的值.

 当count>0时表示从左向右删除元素.

当count<0时表示从右向左删除元素.

当count=0时表示删除全部指定元素.


ltrim

LTRIM key start stop

保留start和stop之间区间内的元素,区间外面的元素就直接被删除了.

lset

LSET  key index element

根据下标修改元素.

时间复杂度:O(N).

如果下标越界会直接报错.


阻塞命令

blpop key [key.....] timeout

brpop key [key.....] timeout

blpop和brpop是lpop和rpop的阻塞版本.

相当于我们之前学习的阻塞队列一样.

当队列元素为满的时候,在往里插入元素会阻塞;当队列元素为空的时候,往外取元素也会阻塞.

redis只针对队列为空往外取的时候做了阻塞.因为redis中对于list什么时候为满没有明确的要求.

所以blpop和brpop.

blpop和brpop是lpop和rpop的阻塞版本,和对应的非阻塞版本的作用基本一致,除了:

1.在列表有元素的情况下,阻塞和非阻塞版本表现一致.但是如果列表为空,非阻塞版本会立即执行并返回nil,但阻塞版本会根据timeout阻塞一段时间,期间redis可以执行其他命令,但执行阻塞命令的客户端会表现为阻塞状态.

2.命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表可以弹出元素,命令立即返回.

3.如果多个客户端对一个键执行brpop或blpop,最先执行命令的客户端会得到弹出的元素.


阻塞命令的使用场景

1.针对一个非空的列表进行操作

返回的结果是一个二元组,一方面告诉我们当前的数据来自哪个key,一方面告诉我们取到的数据是什么.

2.针对一个空的列表进行操作

返回二元组并且显示阻塞时间.

3.针对多个key进行操作.


内部编码

之前的版本list的内部编码是ziplist(压缩列表)和linkedlist(链表).

和hash类型的类似,当元素个数过多的时候,ziplist会转换为linkedlist;当某个value过长的时候,ziplist也会转换为linkedList.

同样也存在两个配置项:list-max-ziplist-entries和list-max-ziplist-value.

而现在的版本list的内部编码只有一个quicklist.

quicklist相当于是结合了链表和压缩列表.

整体还是一个链表,但是链表的每一个节点是一个压缩列表.

每个压缩列表都不要太大,同时再把多个压缩列表通过链式结构的方式连接起来.


lisi类型的应用场景

存储(班级)信息

用list作为像数组这样的结构,来存储多个元素.

用mysql表示两个表,一个学生表一个班级表.

通过这样的表结构,可以很方便的实现查询指定班级中有哪些同学.

而redis中没有这么强调的查询功能,我们只能设置合适的键值对来实现对应的效果.

学生的个人信息用hash表示,而班级信息我们就可以使用list类型来表示.

通过classStudent:1来获取对应的学生id.


消息队列

redis阻塞消息的队列模型

在当前的场景下,如果列表为空,消费者就会阻塞等待,直到有了数据或者到了timeout时间.

谁先执行brpop命令,谁就可以先拿到新来的数据.

如果消费者不停的brpop,这样的设定就能构成一个轮询的效果.

分频道的消息队列

多个频道的场景非常常见,比如一个短视频,可以有一个频道来传输短视频数据,还可以有一个频道来传输弹幕数据,还可以有一个频道来传输点赞,转发和收藏的数据,可以有一个频道来传输评论数据.

设置成多个频道,就可以在某种数据发生问题的时候,不会对其他数据造成影响.


微博Timeline

1.每篇微博使用hash结构存储.

2.向用户的timeline添加微博.user:<uid>:myblogs作为键.

3.分页获取用户的timeline,例如获取用户1的10篇微博.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端vue,后端springboot。如何防止未登录的用户直接浏览器输入地址访问

前端&#xff0c;使用Vue框架来实现前端路由拦截&#xff1a; 设置需要登录校验的页面&#xff1a; 登录成功后&#xff0c;去设置LocalStorage里面的IsLogin为true:

MATLAB颜色索引表---持续更新中--各个平台都可使用

MATLAB颜色索引表—持续更新中–各个平台都可使用

2023.11.2事件纪念

然而造化又常常为庸人设计,以时间的流逝,来洗涤旧迹,仅以留下淡红的血色和微漠的悲哀。 回顾这次事件&#xff0c;最深的感触就是什么是团队的力量&#xff01; 当我们看到希望快要成功的时候&#xff0c;大家洋溢出兴奋开心的表情&#xff0c;一起的欢声笑语&#xff1b;但看…

ElasticSearch集群环境搭建

1、准备三台服务器 这里准备三台服务器如下: IP地址主机名节点名192.168.225.65linux1node-1192.168.225.66linux2node-2192.168.225.67linux3node-3 2、准备elasticsearch安装环境 (1)编辑/etc/hosts&#xff08;三台服务器都执行&#xff09; vim /etc/hosts 添加如下内…

电源管理(PMIC)MAX20428ATIA/VY、MAX20428ATIC/VY、MAX20428ATIE/VY适合汽车ADAS应用的开关稳压器

一、概述 MAX20428是一款高效率、八路输出、低压PMIC。OUT1将输入电源升压至5V&#xff0c;电流高达500mA&#xff0c;而三个同步降压转换器的输入电压范围为3.0V至4.2V&#xff0c;输出电压范围为0.8V至3.9875V&#xff0c;峰值电流分别高达1.3A、1.3A和3.5A。三个300mA pMOS…

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…

论文阅读—— BiFormer(cvpr2023)

论文&#xff1a;https://arxiv.org/abs/2303.08810 github&#xff1a;GitHub - rayleizhu/BiFormer: [CVPR 2023] Official code release of our paper "BiFormer: Vision Transformer with Bi-Level Routing Attention" 一、介绍 1、要解决的问题&#xff1a;t…

【入门Flink】- 05Flink运行时架构以及一些核心概念

系统架构 Flink运行时架构Standalone会话模式为例 1&#xff09;作业管理器&#xff08;JobManager&#xff09; JobManager 是一个 Flink 集群中任务管理和调度的核心&#xff0c;是控制应用执行的主进程。每个应用都应该被唯一的 JobManager 所控制执行。 JobManger 又包含…

网络安全(网络安全)小白自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

selenium自动化测试入门 —— 操作浏览器!

1、启动浏览器&#xff08;实例化浏览器&#xff09; 启动Chrome浏览器&#xff08;驱动已放入path环境变量下&#xff09; driver webdriver.Chrome() 指定驱动路径驱动Chrome 浏览器 # .\driver\chromedriver.exe 为驱动存放位置,可以是相对路径或者绝对路径 driver we…

UNI-APP_ios自动适应底部安全区背景,修改安全区背景

自动适应&#xff08;推荐&#xff09; 将所有 iPhone X&#xff08;刘海屏) 底部安全区域背景颜色 自动适应&#xff0c;当前页面什么颜色会自动调整。 1.打开 manifest.json &#xff0c;打开源码视图 2.找到 app-plus 配置项&#xff0c;添加以下代码 "safearea&quo…

VBA之正则表达式(44)-- 拆分商品和规格

实例需求&#xff1a;商品组清单保存在A列中&#xff0c;现需要将其拆分为商品名称&#xff0c;保存在从B列开始的后续单元格中&#xff0c;部分商品包含规格&#xff0c;并且多种规格属性使用了逗号分隔&#xff0c;因此无法直接使用Excel分列功能完成数据拆分。 示例代码如下…