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) 1redis> LPUSH mylist "hello"(integer) 2redis> LRANGE mylist 0 -11) "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) 1redis> LPUSHX mylist "Hello"(integer) 2redis> LPUSHX myotherlist "Hello"(integer) 0redis> LRANGE mylist 0 -11) "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) 1redis> RPUSH mylist "hello"(integer) 2redis> LRANGE mylist 0 -11) "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) 1redis> RPUSHX mylist "Hello"(integer) 2redis> RPUSHX myotherlist "Hello"(integer) 0redis> LRANGE mylist 0 -11) "World"2) "Hello"redis> LRANGE myotherlist 0 -1(empty array)![]()
2.5 LRANGE
获取从 start 到 end 区间的所有元素,左闭右闭。
LRANGE key start stop
命令有效版本:1.0.0 之后时间复杂度:O(N)返回值:指定区间的元素。
redis> RPUSH mylist "one"(integer) 1redis> RPUSH mylist "two"(integer) 2redis> RPUSH mylist "three"(integer) 3redis> LRANGE mylist 0 01) "one"redis> LRANGE mylist -3 21) "one"2) "two"3) "three"redis> LRANGE mylist -100 1001) "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 elementpivot 以该元素为基准
命令有效版本: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) 1redis> LPUSH mylist "Hello"(integer) 2redis> 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,则最先执行命令的客户端会得到弹出的元素。- 区别
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) 0redis> RPUSH list1 a b c(integer) 3redis> BLPOP list1 list2 01) "list1"2) "a"![]()
当插入任何一个元素都会返回
3.2 BRPOP
RPOP 的阻塞版本。
BRPOP key [key ...] timeout
命令有效版本:1.0.0 之后时间复杂度:O(1)返回值:取出的元素或者 nil。
redis> DEL list1 list2(integer) 0redis> RPUSH list1 a b c(integer) 3redis> BRPOP list1 list2 01) "list1"2) "c"
4.命令小结
| 操作类型 | 命令 | 时间复杂度 |
| 添加 | rpush key value [value ...] | O(k),k 是元素个数 |
| lpush key value [value ...] | O(k),k 是元素个数 | |
| linsert key before | after pivot value | O(n),n 是 pivot 距离头尾的距离 | |
| 查找 | lrange key start end | O(s+n),s 是 start 偏移量,n 是 start 到 end 的范围 |
| lindex key index | O(n),n 是索引的偏移量 | |
| llen key | O(1) | |
| 删除 | lpop key | O(1) |
| rpop key | O(1) | |
| lremkey count value | O(k),k 是元素个数 | |
| ltrim key start end | O(k),k 是元素个数 | |
| 修改 | lset key index value | O(n),n 是索引的偏移量 |
| 阻塞操作 | blpop brpop | O(1) |
5.内部编码
上述方式为老版本的内部编码,现在用的是quicklistquicklist 相当于是 链表 和 压缩列表 的结合整体还是一个链表,链表的每个节点,是一个压缩列表。
每个压缩列表,都不让它太大同时再把多个压缩列表通过链式结构连起来~~
6.list的应用场景
6.1 存储多个数据
6.2 消息队列(生产者消费模型)(少见)
![]()
- 谁先执行的这个 brpop 命令
- 谁就能拿到这个新来的元素
- 像这样的设定,就能构成一个"轮询"式的效果.
- 假设消费者执行顺序是123当新元素到达之后,首先是消费者1 拿到元素.(按照执行brpop 命令的先后顺序来决定谁获取到的)
- 消费者1 拿到元素之后,也就从 brpop 中返回了(相当于这个命令就执行完了)
- 如果消费者1 还想继续消费,就需要重新执行 brpop.
- 此时, 再来一个新的元素过来, 就是消费者2 拿到该元素也从 brpop 中返回~~ 如果消费者2 还想继续消费也需要重新执行 brpop.
- 再来一个新元素,就是消费者3 拿到这个元素了
分频道的消息队列
6.3 微博 Timeline
相关文章:
9.Redis之list类型
list相当于链表、数据表 1.list类型基本介绍 列表中的元素是有序的"有序"的含义,要根据上下文区分~~有的时候,谈到有序,指的是"升序","降序”有的时候,谈到的有序,指的是, 顺序很关键~~如果把元素位置颠倒,顺序调换.此时得到的新的 List 和之前的 Li…...
Git 的安装和使用
一、Git 的下载和安装 目录 一、Git 的下载和安装 1. git 的下载 2. 安装 二、Git 的基本使用-操作本地仓库 1 初始化仓库 1)创建一个空目录 2)git init 2 把文件添加到版本库 1)创建文件 2)git add . 3)g…...
大模型时代的具身智能系列专题(五)
stanford宋舒然团队 宋舒然是斯坦福大学的助理教授。在此之前,他曾是哥伦比亚大学的助理教授,是Columbia Artificial Intelligence and Robotics Lab的负责人。他的研究聚焦于计算机视觉和机器人技术。本科毕业于香港科技大学。 主题相关作品 diffusio…...
基于springboot+vue的社区医院管理服务系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
车载电子电器架构 —— 智能座舱标准化意义
车载电子电器架构 —— 智能座舱标准化意义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消…...
Compose在xml中使用滑动冲突处理
一、背景 在现有Android项目中使用Compose可能存在滑动冲突问题,例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView这里又是一个LazyColumn) 二、解决方案 官方介绍:https://developer.android.google.cn/develop/ui/compose/touch-inp…...
微信网页版登录插件v1.1.1
说到如今的微信客户端,大家肯定会有很多提不完的意见或者建议。比如这几年体积越来越大,如果使用频率比较高,那占用空间就更离谱了。系统迷见过很多人电脑C盘空间爆满,都是由于微信PC版造成的。 而且,它还加了很多乱七…...
华为实训课笔记 2024
华为实训 5/205/215/225/235/275/28 5/20 5/21 5/22 5/23 5/27 5/28...
HTML静态网页成品作业(HTML+CSS)——宠物狗介绍网页(3个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…...
网络模型-路由策略
一、路由策略 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。目的:设备在发布、接收和引入路由信息时,根据实际组网需要实施一些策略,…...
【MySQL精通之路】InnoDB(7)-锁和事务模型
1.InnoDB锁 【MySQL精通之路】InnoDB(7)-锁和事务模型(1)-锁-CSDN博客 2.InnoDB事务模型 【MySQL精通之路】InnoDB(7)-锁和事务模型(2)-事务模型-CSDN博客 3.InnoDB中不同SQL语句设置的锁 4.幻影行 5.InnoDB中的死锁 5.1InnoDB死锁示例 5.2死锁检测 …...
深度学习创新点不大但有效果,可以发论文吗?
深度学习中创新点比较小,但有效果,可以发论文吗?当然可以发,但如果想让编辑和审稿人眼前一亮,投中更高区位的论文,写作永远都是重要的。 那么怎样“讲故事”才能让论文更有吸引力?我总结了三点…...
【ARM Cache 系列文章 7.1 – ARMv8/v9 MMU 页表配置详细介绍 02 】
文章目录 Translation table descriptorTable descriptor format页面粒度和地址长度粒度(Granules)48位和52位地址TCR_ELx.DSVTCR_EL2.DSFEAT_LPA块描述符|页描述符紧接上篇文章【ARM Cache 系列文章 7 – ARMv8/v9 MMU 页表配置 01 】 Translation table descriptor</...
Mysql搭建主从同步,docker方式(一主一从)
服务器:两台Centos9 用Docker搭建主从 使用Docker拉取MySQL镜像 确保两台服务器都安装好了docker 安装docker请查看:Centos安装docker 1.两台服务器都先拉取mysql镜像 docker pull mysql 2.我这里是在 /opt/docker/mysql 下创建mysql的文件夹用来存…...
【已解决】使用token登录机制,token获取不到,blog_list.html界面加载不出来
Bug产生 今天使用token完成用户登录信息的存储的时候被卡了大半天。 因为登录的功能写的已经很多了,所以今天就没有写一点验一点,而是在写完获取博客列表功功能,验证完它的后端后,了解完令牌的基本使用以及Jwt的基本使用方式——…...
【Linux 网络编程】网络的基础知识详解!
文章目录 1. 计算机网络背景2. 认识 "协议" 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; 🍎局域网(LAN----Local Area Network): 计算机数量更多了, 通过交换机和路由器连接。 🍎 广域网WAN: 将…...
Nacos 2.x 系列【12】配置加密插件
文章目录 1. 前言2. 安装插件2.1 编译2.2 客户端2.3 服务端 3. 测试 1. 前言 为保证用户敏感配置数据的安全,Nacos提供了配置加密的新特性。降低了用户使用的风险,也不需要再对配置进行单独的加密处理。 前提条件: 版本:老版本暂时不兼容&…...
Kubernetes和Docker对不同OS和CPU架构的适配关系
Docker Docker官网对操作系统和CPU架构的适配关系图 对于其他发行版本,Docker官方表示没有测试或验证在相应衍生发行版本上的安装,并建议针对例如Debian、Ubuntu等衍生发行版本上使用官方的对应版本。 Kubernetes X86-64 ARM64 Debian系 √ √ Re…...
LabVIEW机器设备的振动监测
振动监测是工业和机械维护中重要的一部分,通过检测和分析机械振动,提前发现潜在故障,确保设备的可靠运行。LabVIEW是一种强大的图形化编程环境,非常适合用于振动监测系统的开发和实施。以下从多个角度详细介绍LabVIEW在振动监测中…...
FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数
1、FreeRTOS任务相关API函数 函数描述uxTaskPriorityGet()查询某个任务的优先级vTaskPrioritySet()改变某个任务的任务优先级uxTaskGetSystemState()获取系统中任务状态vTaskGetInfo()获取某个任务信息xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值xTaskGetCurrentT…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
















