9.Redis之list类型

list相当于链表、数据表

1.list类型基本介绍

  • 列表中的元素是有序的
  • "有序"的含义,要根据上下文区分~~
  • 有的时候,谈到有序,指的是"升序","降序”
  • 有的时候,谈到的有序,指的是, 顺序很关键~~
  • 如果把元素位置颠倒,顺序调换.
  • 此时得到的新的 List 和之前的 List 是不等价的!!
  • 同样一个词,怎么理解,务必要结合上下文,结合具体场景~~
  • 栈/堆.(数据结构的,操作系统的,M 的)
  • 同步(同步和互斥的同步,还是同步和异步的同步)

1.区分获取和删除的区别

lindex 能获取到元素的值
lrem 也能返回被删除元素的值.

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

像 hash 这样的类型, field 是不能重复的

因为当前的 List,头和尾都能高效的插入删除元素, 就可以把这个 List 当做一个 栈/队列 来使用了

Redis 有一个典型的应用场景,就是作为消息队列

最早的时候, 就是通过 List 类型~.

后来 Redis 又提供了 stream 类 (用于消息队列)

2.list相关命令

2.1 LPUSH

将⼀个或者多个元素从左侧放⼊(头插)到 list 中。
语法:
LPUSH key element [element ...]
命令有效版本:1.0.0 之后
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的长度。
⽰例:
redis> LPUSH mylist "world"
(integer) 1
redis> LPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "hello"
2) "world"
//按照顺序,依次头插这几个元素.
//全都插入完毕,4 是在最前面的!!!
//如果 key 已经存在, 并且 key 对应的 value 类型,不是 list
//此时 lpush 命令就要报错.
//此处的序号与下标无关,序号只是标识项,描述一下顺序

2.2 LPUSHX

在 key 存在时,将⼀个或者多个元素从左侧放⼊(头插)到 list 中。不存在,直接返回
语法:
LPUSHX key element [element ...]
命令有效版本:2.0.0 之后
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
示例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSHX mylist "Hello"
(integer) 2
redis> LPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "Hello"
2) "World"
redis> LRANGE myotherlist 0 -1
(empty array)

2.3 RPUSH

将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。
语法:
RPUSH key element [element ...]
命令有效版本:1.0.0 之后
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
⽰例:
redis> RPUSH mylist "world"
(integer) 1
redis> RPUSH mylist "hello"
(integer) 2
redis> LRANGE mylist 0 -1
1) "world"
2) "hello"

 2.4 RPUSHX

在 key 存在时,将⼀个或者多个元素从右侧放⼊(尾插)到 list 中。
语法:
RPUSHX key element [element ...]
命令有效版本:2.0.0 之后
时间复杂度:只插⼊⼀个元素为 O(1), 插⼊多个元素为 O(N), N 为插⼊元素个数.
返回值:插⼊后 list 的⻓度。
⽰例:
redis> RPUSH mylist "World"
(integer) 1
redis> RPUSHX mylist "Hello"
(integer) 2
redis> RPUSHX myotherlist "Hello"
(integer) 0
redis> LRANGE mylist 0 -1
1) "World"
2) "Hello"
redis> LRANGE myotherlist 0 -1
(empty array)

2.5 LRANGE

获取从 start 到 end 区间的所有元素,左闭右闭。
语法:
//此处的l不是left,而是list
LRANGE key start stop
命令有效版本:1.0.0 之后
时间复杂度:O(N)
返回值:指定区间的元素。
⽰例:
redis> RPUSH mylist "one"
(integer) 1
redis> RPUSH mylist "two"
(integer) 2
redis> RPUSH mylist "three"
(integer) 3
redis> LRANGE mylist 0 0
1) "one"
redis> LRANGE mylist -3 2
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist -100 100
1) "one"
2) "two"
3) "three"
redis> LRANGE mylist 5 10
(empty array)

2.6 LPOP

从 list 左侧取出元素(即头删)。
语法:
LPOP key
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:取出的元素或者 nil。
⽰例:
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> LPOP mylist
"one"
redis> LPOP mylist
"two"
redis> LPOP mylist
"three"
redis> LRANGE mylist 0 -1
1) "four"
2) "five"

2.7 RPOP

从 list 右侧取出元素(即尾删)。
语法:
RPOP key
我们所用的版本是5 不考虑
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:取出的元素或者 nil。
⽰例:
redis> RPUSH mylist "one" "two" "three" "four" "five"
(integer) 5
redis> RPOP mylist
"five"
redis> LRANGE mylist 0 -1
1) "one"
2) "two"
3) "three"
4) "four"

Redis 中的 list 是一个双端队列~~

从两头插入/删除元素都是非常高效 O(1)
搭配使用 rpush 和 lpop, 就相当于队列了

搭配使用 rpush 和 rpop, 就相当于栈了,

2.8 LINDEX

获取从左数第 index 位置的元素。
语法:
  LINDEX key index
命令有效版本:1.0.0 之后
时间复杂度:O(N),此处的N是list中元素的个数
返回值:取出的元素或者 nil。
⽰例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LINDEX mylist 0
"Hello"
redis> LINDEX mylist -1
"World"
redis> LINDEX mylist 3
(nil)

2.9 LINSERT

在特定位置插⼊元素。
语法:
LINSERT key <BEFORE | AFTER> pivot element
pivot 以该元素为基准
命令有效版本:2.2.0 之后
时间复杂度:O(N)
返回值:插⼊后的 list ⻓度。
⽰例:
redis> RPUSH mylist "Hello"
(integer) 1
redis> RPUSH mylist "World"
(integer) 2
redis> LINSERT mylist BEFORE "World" "There"
(integer) 3
redis> LRANGE mylist 0 -1
1) "Hello"
2) "There"
3) "World"

//基准不是下标,而是元素

万一要插入的列表中,基准值,存在多个,咋办?
linsert 进行插入的时候,要根据基准值, 找到对应的位置,从左往右找,找到第一个符合基准值的位置即可.
O(N),N 表示列表的长度

2.10 LLEN

获取 list ⻓度。
语法:
LLEN key
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:list 的⻓度。
⽰例:
redis> LPUSH mylist "World"
(integer) 1
redis> LPUSH mylist "Hello"
(integer) 2
redis> LLEN mylist
(integer) 2

2.11 LREM

count>0,从左往右找

count<0,从右往左找

count=0,全部删除

 2.12 LRIM

只保留区间内的数

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

2.13 LSET 

 3.阻塞版命令

  • redis 中的 list 也相当于 阻塞队列 一样
  • 线程安全是通过单线程模型支持的.
  • 阻塞,则只支持"队列为空"的情况,不考虑"队列满”
  • 但阻塞版本会根据 timeout,阻塞一段时间,期间 Redis 可以执行其他命令使用 brpop 和 blpop 的时候,这里是可以显式设置阻塞时间的!!!(不一定是无休止的等待!!)【此处的 blpop 和 brpop 看起来好像耗时很久,但是实际上并不会对 redis 服务器产生负面影响!!】
  • 命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回。
    blpop 和 brpop 都是可以同时去尝试获取多个 key 的列表的元素的~~
    多个 key 对应多个 list这多个 |ist 哪个有元素了,就会返回哪个元素,
    如果多个客户端同时多一个键执行 pop,则最先执行命令的客户端会得到弹出的元素。
  • 区别
blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致,除了:
在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,⾮阻塞版本会理
解返回 nil,但阻塞版本会根据 timeout,阻塞⼀段时间,期间 Redis 可以执⾏其他命令,但要求执
⾏该命令的客⼾端会表现为阻塞状态(如图 2-22 所⽰)。
命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元
素,命令⽴即返回。
如果多个客⼾端同时多⼀个键执⾏ pop,则最先执⾏命令的客⼾端会得到弹出的元素。

3.1 BLPOP

LPOP 的阻塞版本。
语法:
BLPOP key [key ...] timeout
  • 此处 可以指定一个 key 或者 多个 key
  • 每个 key 都对应一个 list.
  • 如果这些 list 有任何一个非空,blpop 都能够把这里的元素给获取到. 立即返回如果这些 list 都为空, 此时就需要阻塞等待, 等待其他客户端往这些 list 中插入元素了
  • 单位是 秒(Redis 6, 超时时间允许设定成小数.Redis 5 中,超时时间,得是整数)
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:取出的元素或者 nil。
⽰例:
redis> EXISTS list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BLPOP list1 list2 0
1) "list1"
2) "a"
当插入任何一个元素都会返回

3.2 BRPOP

RPOP 的阻塞版本。
语法:
BRPOP key [key ...] timeout
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:取出的元素或者 nil。
⽰例:
redis> DEL list1 list2
(integer) 0
redis> RPUSH list1 a b c
(integer) 3
redis> BRPOP list1 list2 0
1) "list1"
2) "c"

4.命令小节 

操作类型命令时间复杂度
添加rpush key value [value ...]O(k),k 是元素个数
lpush key value [value ...]O(k),k 是元素个数
linsert key before | after pivot valueO(n),n 是 pivot 距离头尾的距离
查找lrange key start end
O(s+n),s 是 start 偏移量,n 是 start 到 end 的范围
lindex key indexO(n),n 是索引的偏移量
llen keyO(1)
删除lpop keyO(1)
rpop keyO(1)
lremkey count valueO(k),k 是元素个数
ltrim key start endO(k),k 是元素个数
修改lset key index valueO(n),n 是索引的偏移量
阻塞操作blpop brpopO(1)

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

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

相关文章

新闻稿海外媒体投稿,除了美联社发稿(AP)和彭博社宣发(Bloomberg),还有哪些优质的国外媒体平台可以选择

发布高质量的新闻稿到海外媒体&#xff0c;除了美联社发稿&#xff08;AP&#xff09;和彭博社发稿&#xff08;Bloomberg&#xff09;&#xff0c;还有许多其他优质的媒体平台可以选择。以下是一些受欢迎和高效的海外媒体发布平台&#xff1a; 路透社 (Reuters) 路透社是全球最…

IIC通信(STM32)

一、IIC概念 &#xff11;、两根通信线&#xff1a;SCL&#xff08;Serial Clock&#xff09;、SDA&#xff08;Serial Data&#xff09; 同步&#xff0c;半双工 2、带数据应答 3、支持总线挂载多设备&#xff08;一主多从、多主多从&#xff09;一般使用一主多从。一主多从的…

【深度学习】paddlets,时序数据预测

文章目录 一、环境二、题目1三、题目2四、题目3五、函数参数 资料&#xff1a; https://paddlets.readthedocs.io/zh-cn/latest/source/api/paddlets.models.base.html#paddlets.models.base.BaseModel.recursive_predict https://aistudio.baidu.com/projectdetail/5866171?…

陪跑真正值钱的不是教程,是你遇到那个挡住你的问题时,身边有个靠谱的人

今天分享两个概念&#xff0c;一个是意识决定一切&#xff0c;一个是大道至简&#xff0c;做项目就是按部就班的遵循事情发展规律去做。 先说第一个概念&#xff0c;意识决定一切。我们说的凡事预则立不预则废&#xff0c;就是计划了去做就会有结果。 给你们一个表&#xff0c;…

MySQL——索引与事务

目录 前言 一、索引 1.索引概述 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;索引作用 &#xff08;3&#xff09;索引特点 &#xff08;4&#xff09;适用场景 2.索引的操作 &#xff08;1&#xff09;查看索引 &#xff08;2&#xff09;创建索引…

文科论文,使用AI写作时能够提供实证数据吗?

人工智能时代&#xff0c;为了撰写论文提供思路及高效&#xff0c;利用AI撰写论文已是常态&#xff0c;可撰写文科论文通常研究中都需要实证数据&#xff0c;而AI撰写论文时能够提供这样的数据吗&#xff1f; 一、什么是实证数据 实证数据是指从研究报告、财务报表、新闻报道…

计算机网络——TCP 协议的三次握手 / 四次挥手

简述 TCP / UDP 协议都是传输层的协议。 UDP 是面向无连接的协议&#xff0c;就是说发送端不在乎消息数据是否传输到接收端了&#xff0c;所以会出现数据丢失的情况&#xff0c;所以可靠性也不高。 TCP 是面向连接的、可靠的、基于字节流的传输层协议。所谓面向连接的&#…

Flink-cdc更好的流式数据集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一种数据变更捕获技术&#xff0c;用于从数据源&#xff08;如数据库&#xff09;中捕获和处理数据的变更事件。CDC技术允许实时地捕获数据库中的增、删、改操作&#xff0c;将这些变更事件转化为流式数据&#xff0c;并能够…

Windows平台C#版RTSP转RTMP直播推送定制版

技术背景 前几年我们发布了C版的多路RTMP/RTSP转RTMP转发官方定制版。在秉承低延迟、灵活稳定、低资源占用的前提下&#xff0c;客户无需关注开发细节&#xff0c;只需图形化配置转发等各类参数&#xff0c;实现产品快速上线目的。 如监控类摄像机、NVR等&#xff0c;通过厂商…

【启程Golang之旅】深入解析函数的奥秘与技巧

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

【全开源】海报在线制作系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化创意海报的利器 引言 在数字化时代&#xff0c;海报作为一种重要的宣传媒介&#xff0c;其设计质量和效率直接影响着宣传效果。为了满足广大用户对于个性化、高效制作海报的需求&#xff0c;海报在线制作系统源码应运而生。本文将详细介绍海报在线制作系统源码的特…

AbMole - 肿瘤发展与免疫器官的“舞蹈”:一场细胞层面的时间赛跑

在生物医学领域&#xff0c;肿瘤与免疫系统之间的相互作用一直是研究的热点话题。肿瘤细胞不是孤立存在的&#xff0c;它们与宿主的免疫系统进行着一场复杂的“舞蹈”。 最近&#xff0c;一项发表在《Molecular & Cellular Proteomics》杂志上的研究&#xff0c;为我们揭开…

【C++】二分查找算法

1.题目 2.算法思路 暴力解法&#xff1a;可以将数组遍历一遍&#xff0c;就可以找到。时间复杂度为O(n)。不算太差&#xff0c;可以接受。 但是有更优秀的解法&#xff1a; 就是二分查找算法。 算法的特点&#xff1a;我们所查找的“数组”具有二段性。这里的二段性不一定有…

Oracle 并行和 session 数量的

这也就是为什么我们指定parallel为4&#xff0c;而实际并行度为8的原因。 insert create index&#xff0c;发现并行数都是加倍的 Indexes seem always created with parallel degree 1 during import as seen from a sqlfile. The sql file shows content like: CREATE INDE…

滑不动窗口的秘密—— “滑动窗口“算法 (Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

《python编程从入门到实践》day39

# 昨日知识点回顾 创建主页、继承模版、显示特定主题页面 # view.py from django.shortcuts import render# 导入所需数据相关联的模型 from .models import Topic# Create your views here. def index(request):"""学习笔记的主页"""#…

Java进阶学习笔记13——抽象类

认识抽象类&#xff1a; 当我们在做子类共性功能抽取的时候&#xff0c;有些方法在父类中并没有具体的体现&#xff0c;这个时候就需要抽象类了。在Java中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff0c;而类中如果有抽象方法&#xff0c;该类就定义为抽象类…

ISCC2024个人挑战赛WP-迷失之门

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 迷失之门 方法一&#xff1a; IDA看一下 check函数逻辑 进入到check2函数 R键将ascii码转字符&#xff0c;写出逆向脚本 #include <stdio.h> #include &l…

Linux C++ Socket 套接字、select、poll、epoll 实例

文章目录 1. 概述2. TCP 网络编程实例2.1 服务器端2.2 客户端2.3 运行截图 3. I/O 模型3.1 阻塞式I/O模型3.2 非阻塞I/O模型3.3 I/O 复用模型3.4 信号驱动式I/O3.5 异步I/O模型 4. I/O复用之 select4.1 select 函数描述4.2 服务端代码4.3 客户端代码4.4 运行截图 5. I/O复用之 …

RocketMq局部顺序消息

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/5/26* Time: 15:09* Description: 局部顺序消…