Redis:list类型
Redis:list类型
- list命令
- 非阻塞
- LPUSH
- LRANGE
- LPUSHX
- RPUSH
- RPUSHX
- LPOP
- RPOP
- LINDEX
- LINSERT
- LLEN
- LREM
- LTRIM
- LSET
- 阻塞
- BLPOP
- BRPOP
- 内部编码
- ziplist
- linkedlist
- quicklist
几乎每种语言都有顺序表
、数组
、链表
这样的顺序结构,Redis
也做出了相应的支持。
如图,Redis
的value
值可以是一个列表list
,其支持头尾的插入删除,下标访问等功能。也支持正负数下标,正数下标从0
开始,负数下标从-1
开始。
list命令
非阻塞
LPUSH
- 头插元素到
list
中,如果key
不存在就创建
lpush key element [element ...]
返回list
插入后的长度。如果一开始key
不存在,就创建一个key
。
LRANGE
- 获取指定范围的
list
元素
lrange key start stop
访问区间为[start, end]
的闭区间,支持负数下标。
示例:
接下来通过lrange
测试刚刚的lpush
接口:
由于lpush
是头部插入,所以按顺序插入1 2 3 4 5
,最后存储顺序为5 4 3 2 1
。
如果在Redis
中数组越界,Redis
不会报错,而是尽可能输出范围内存在的数据。
第一次查询0 - 100
,但是list
中只有0 - 4
,那么此时把0 - 4
全部输出。第二次查询50 -60
,list
内没用这部分数据,但是它不报错,而是输出empty
表示空。
LPUSHX
- 当
key
存在,头插元素到list
中
lpushx key element [element ...]
返回插入后,list
中元素的个数。
示例:
第一次插入list1
,由于已经存在,此时插入成功,返回9
表示当前有九个元素。第二次插入了一个不存在的list2
,但是它不存在,返回0
表示插入后一个元素也没有,也就是插入失败。
RPUSH
- 尾插元素到
list
中,如果key
不存在就创建
rpush key element [element ...]
返回插入后list
元素个数。
示例:
同样插入1 2 3 4 5
,顺序与之前lpush
插入刚好是反着的,因为rpush
是尾插。
此处list
有一个命名上的注意点:
lpush
:left push
,从左侧插入,即头插rpush
:right push
,从右侧插入,即尾插lrange
:list range
,输出列表指定范围
同样是l
开头,有时候表示list
,有时候表示left
,这个要注意。
另外的:
lpushx
:left push exists
,存在时插入
此处的x
是选用了exsis
中的一个字母,表示只有key
存在才插入。
RPUSHX
- 当
key
存在,尾插元素到list
中
rpushx key element [element ...]
返回插入后,list
中元素的个数。
LPOP
- 头删
list
元素
lpop key [count]
返回被删除的头部count
个元素,如果list
为空,没有可以删的元素了,返回nil
。
示例:
先创建一个1 2 3 4 5
的列表,第一次lpop
不带任何参数,只输出一个头部元素。第二次带参数4
,此时输出剩余的四个元素。最后一次lpop
,由于已经没有元素了,返回nil
。
RPOP
- 尾删
list
元素
rpop key [count]
返回被删除的尾部count
个元素,如果list
为空,没有可以删的元素了,返回nil
。
LINDEX
- 获取指定下标的元素
lindex key index
返回指定下标的元素,支持负数下标。
示例:
LINSERT
- 在指定位置插入元素
linsert key before|after pivot element
在元素pivot
的前面或者后面插入element
元素。
示例:
此处指令的作用是,在元素c
前面插入hello
。
如果有多个pivot
元素,那么只在第一个元素的位置插入。
LLEN
- 获取
list
的长度
llen key
返回list
长度,如果不存在则返回0
。
LREM
- 删除元素
lrem key count element
删除count
个element
元素。
此处count
的取值有三种:
count > 0
:从左往右删除count < 0
:从右往左删除count = 0
:删除所有元素
示例:
此处插入了1 2 3 hello
循环四次,删除3 hello
,即从左往右删除三个hello
每次出只有最后一个hello
被保留。
如果传入-3 hello
,此时从右往左删除,只有第一个hello
被保留。
LTRIM
- 指定范围内元素保留,剩余的元素删除
ltrim key start stop
只保留[start, stop]
闭区间内部的元素,其余的元素全部删除。
示例:
LSET
- 修改指定下标的元素
lset key index element
将下标为index
的元素改为element
,支持负数下标。如果下标越界,会返回一个报错。
示例:
第一次修改,将下标为3
的元素修改为666
。第二次插入,操作下标为100
的元素,由于不存在,报错了。
阻塞
先前的所有的命令,都是非阻塞的,直接操作就可以得到结果,而list
还提供了一些阻塞性质的命令。
在多线程中,有一个生产消费模型,其可以基于阻塞队列实现,主要满足以下两个性质:
- 如果阻塞队列满了,那么生产者阻塞
- 如果阻塞队列空了,那么消费者阻塞
在Redis
中,list
只考虑队列为空的情况,也就是消费者。用户读取数据时,队列为空,那么用户陷入阻塞,直到队列有数据。
BLPOP
- 读取并删除
list
头部元素,如果没有元素则陷入阻塞
blpop key [key ...] timeout
blpop
可以同时指定多个key
,也就是多个list
,只要任何一个list
有数据,就返回结果。还可以设置超时时间timeout
,以秒为单位,如果超过时间了,返回nil
。
如果超时时间设置为0
,则一直阻塞,不会超时。
另外的,此处的阻塞不是Redis
阻塞,而是客户端阻塞。如果阻塞,Redis
将指令放到后台去等待,自己去执行其他指令。
示例:
此处list8
有元素,而list9
为空,返回了list8
的元素。此时会同时返回两个内容,list8
表示该数据是从哪一个列表中拿到的,3
则是拿到的数据。
此处启用了两个客户端,左侧客户端blpop
一个空列表,等待20s
,随后陷入阻塞。接着右侧客户端插入一个元素到list9
,随后左侧客户端立刻拿到数据并输出,并且输出了自己的阻塞市场18.15s
。
BRPOP
- 读取并删除
list
尾部元素,如果没有元素则陷入阻塞
brpop key [key ...] timeout
总结:
操作类型 | 命令 |
---|---|
添加 | rpush 、lpush 、insert |
查找 | lrange 、lindex 、llen |
删除 | lpop 、rpop 、lrem 、ltrim |
修改 | lset |
阻塞 | blpop 、brpop |
内部编码
ziplist
压缩列表是一种内存紧凑的存储方式,适合存储数量较少且元素较小的列表。具体来说,当list
类型的元素个数小于 list-max-ziplist-entries
(默认 512 个),并且所有值的长度都小于 list-max-ziplist-value
(默认 64 字节)时,Redis
会使用 ziplist
作为列表的内部实现。
这些配置在/etc/redis/redis.conf
内修改。
优点:
- 内存节省:
ziplist
使用连续的内存块来存储数据,这种紧凑的存储方式可以有效地减少内存碎片和开销。 - 结构简单:适合小规模数据,尤其是在内存资源有限的情况下。
缺点:
- 操作效率:随着数据量的增加,
ziplist
的读写效率会下降。尤其是在需要频繁更新的场景中,ziplist
的线性查找特性使得操作复杂度较高。 - 扩展性差:不适合大规模数据存储。
linkedlist
当列表类型无法满足ziplist
的条件时,会使用linkedlist
链表作为list
的内部实现。这就是一个基本的双向链表。
优点:
- 头尾的插入删除非常高效
缺点:
- 中间部分的插入删除时间复杂度较高
quicklist
linkedlist
与 ziplist
编码在 Redis 4.0 版本之后不再是默认的列表编码方式,因为引入了更高效的 quicklist
编码,它是基于压缩列表和双向链表的组合,旨在结合两者的优点。
对于quicklist
,其外层列表依然是linkedlist
双链表结构,但是每一个链表节点都是一个quicklist
,对于中间部分的节点,会进行一定程度的压缩,提高效率。
相关文章:

Redis:list类型
Redis:list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构,Redis也做出了相应的支持。 如图ÿ…...
政府采购方式有哪些,竞争性谈判和竞争性磋商的区别
政府采购的方式主要包括公开招标、邀请招标、竞争性谈判、竞争性磋商、询价、单一来源采购和框架协议采购等几种。以下是对这些方式的具体介绍: 公开招标 定义:公开招标是指采购单位依法以招标公告的方式邀请不特定的供应商参与投标的采购方式。适用情形…...
【JavaScript】移动色块案例 实现一个可以拖动并且在拖动过程中会自动改变颜色的色块(JS 事件监听器)
移动色块案例 实现一个可以拖动并且在拖动过程中会自动改变颜色的色块。 移动色块:用户可以通过鼠标按住并拖动页面上的红色方块(#blocks)。当用户按下鼠标左键时,色块开始跟随鼠标的移动而移动;当用户释放鼠标左键时…...

[Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制
目录 一. 认识TCP协议的报头 1.TCP头部格式 2. TCP协议的特点 二. TCP如何封装与分用 TCP 报文封装与解包 如何封装解包,如何分用 分离有效载荷 隐含问题:TCP 与 UDP 报头的区别 封装和解包的逆向过程 如何分用 TCP 报文 如何通过端口号找到绑…...
【中短文】区分神经网络中 表征特征、潜层特征、低秩 概念
1. 表征特征(Representational Feature): 表征特征通常指的是输入数据经过NN处理就得到的中间表示或输出表示。 这些特征由NN经学习过程自动提取,能更好捕捉输入数据的本质属性。 例如:在图像识别任务中&…...

MySQL8.0环境部署+Navicat17激活教程
安装MySQL 下载MySQL MySQL官网下载当前最新版本,当前是8.0.39。 选择No thanks, just start my download等待下载即可。 安装MySQL 下载完成后,双击安装进入安装引导页面。选择Custom自定义安装。 选择MySQL Server 8.0.39 - X64安装。 点击Execute执…...

每日读则推(十)——Elon Musk‘s speech on self-driving at Tesla‘s annual meeting
Elon Musk: You cant solve self-driving unless you have millions of cars on the road. n.自动驾驶 v.限制,约束,强迫,迫使“We are no longer compute-constrained for training. 不再 n/v.估算,计…...
C++新特性——外部模板
1、What C++11标准引入的一种机制,允许在头文件中声明模板,但仅在一个单独的源文件中显式实例化这些模板。这一机制使得编译器只需要在源文件中实例化模板一次,其它源文件引用已经实例化的模板,从而减少编译时间和生成的二进制文件大小。 2、Why 2.1 优化编译时间 模板实…...

字节跳动青训营开始报名了!
关于青训营: 青训营是字节跳动技术团队发起的技术系列培训 &人才选拔项目;面向高校在校生,旨在培养优秀且具有职业竞争力的开发工程师。 本次技术训练营由掘金联合豆包MarsCode 团队主办课程包含前端、后端和 A 方向,在这个飞速发…...

从SQL Server过渡到PostgreSQL:理解模式的差异
前言 随着越来越多的企业转向开源技术,商业数据库管理员和开发者也逐渐面临向PostgreSQL迁移的需求。 虽然SQL Server和PostgreSQL共享许多数据库管理系统(RDBMS)的基本概念,但它们在处理某些结构上的差异可能会让人感到困惑&…...

刷题 排序算法
912. 排序数组 注意这道题目所有 O(n^2) 复杂度的算法都会超过时间限制,只有 O(nlogn) 的可以通过 快速排序空间复杂度为 O(logn)是由于递归的栈的调用归并排序空间复杂度为 O(n) 是由于需要一个临时数组 (当然也需要栈的调用,但是 O(logn) < O(n) 的…...
【python3】tornado高性能编程
使用多进程充分利用cpu使用异步编程 asyncio import asyncio import time from abc import ABC from concurrent.futures import ProcessPoolExecutor from tornado import web, ioloop, genasync def async_task(name):print(f"start: {name}")st int(time.time()…...

构建高效购物推荐系统:SpringBoot实战
1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…...
docker tar包安装 docker-26.1.4.tgz
一、docker安装 1.先将docker安装包(docker-26.1.4.tgz)拷贝到DM系统中。 下载地址 Index of linux/static/stable/x86_64/ 1.先将docker安装包(docker-26.1.4.tgz)拷贝到DM系统中。 2.解压docker安装包 tar zxf docker-26.1.…...

Github 2024-10-12 Rust开源项目日报 Top10
根据Github Trendings的统计,今日(2024-10-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10JavaScript项目1Svelte项目1TypeScript项目1Rust: 构建可靠高效软件的开源项目 创建周期:5064 天开发语言:Rust协议类型:OtherSta…...
Spring Cloud 微服务架构及其应用:设计、实现与优化
引言 随着互联网技术的不断发展,传统的单体应用架构逐渐暴露出了一些问题,如扩展性差、维护复杂、部署不灵活等。为了解决这些问题,微服务架构应运而生。微服务是一种将应用程序分解为一组小的、自治的服务的架构模式,服务之间通过轻量级的通信协议(如HTTP)进行交互。Sp…...

Rider + xmake DX12 开发环境
Rider xmake DX12 开发环境 背景 如题,想要接近 UE 的开发流程 正文 大的流程就是 xmake 生成 vs 的 sln,用 Rider 进行开发 intellisense,断点调试 加了个脚本手动刷新 sln xmake project -k vsxmake -m "debug;release" -…...

控制台java原生工具打包jar文件
1、进入java源代码所在路径,或者包起始文件的所在路径 2、编译为class文件 我没配全局变量,这里使用jdk的完整路径来调用 3、jar命令进行打包 -cfe后面: svnHook.jar 指定jar包文件名 Request 包名入口类名,如果有包含包的话,应…...
MySQL主从同步
MySQL主从同步 作用 减少单台服务器的压力,防止单点故障 部署 主库 编辑/etc/mysql/mysql.conf.d/mysqld.cnf log_binmysql-bin server-id1 #服务器的id,再主从数据库里不能重复重启MySQL服务器 systemctl restart mysql连接mysql,并创建用于主从…...
ansible 学习之变量
参考文档: http://www.ansible.com.cn/docs/playbooks_variables.html#variables 合法的变量 ansible变量是有数字,字母,下划线组成并且变量始终应该以字母开头。 “foo_port”是个合法的变量名.”foo5”也是. “foo-port”, “foo port”, …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...
HTML中各种标签的作用
一、HTML文件主要标签结构及说明 1. <!DOCTYPE html> 作用:声明文档类型,告知浏览器这是 HTML5 文档。 必须:是。 2. <html lang“zh”>. </html> 作用:包裹整个网页内容,lang"z…...
STL 2迭代器
文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器? 1.迭代器…...