初始redis:List

列表 List 相当于数组或者顺序表。

对于List来说,两侧都可以插入和删除,时间复杂度是O(1)。

有很多的操作,比如 llen 可以获取List的长度,lrem 可以删除元素 ,lrange可以去一个字符串 , lindex可以根据下标来取到具体的元素。

LPUSH LRANGE

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

LRANGE:查询指定区间中的元素。

复制代码
LPUSH key element [element]

LRANGE key start stop

例如,插入的顺序是,4,3,2,1,那么此时list中的数字顺序为1,2,3,4

查询的时候,查询的是 0 到 -1 ,-1也就是指的是最后一个数字

要是此时只有8个元素,但是我们LRANGE key 0 100的时候,会尽可能的把所有的元素都显示出来,能尽可能获取则获取。

RPUSH

和LPUSH相对,R开头的是尾插。

RPUSHX

检测key是否存在,不存在则插入失败。

LPOP RPOP

删除操作,一个是从头删除,一个是从尾删除

搭配使用 RPUSH LPOP 就相当于队列。

搭配使用 RPUSH RPOP 就相当于栈。

LINDEX

给定下标,获取到对应的元素。

复制代码
LINDEX key index

如果下标非法,返回的就是nil。并且LINDEX支持负数下标。

LINSERT

在指定位置插入元素。返回值是插入之后,得到的新元素的

复制代码
LINSERT key <BEFORE | AFTER > pivot element

要是插入的是before 4,此时list中有两个4,会插入到第一个4的前面。后面的4不会处理。

LLEN

获取到当前key的长度,如果当前key不存在,则返回0。

LREM

复制代码
LREM key count element

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

  1. 如果count > 0 ,代表从左往右删除element,删完count的数量为止
  2. 如果count < 0 ,代表从右往左删除element,删完count的数量为止
  3. 如果count = 0 ,代表删除所有的element

LTRIM

复制代码
LTRIM key start stop

保留start和stop之间的元素,剩下的删除。

LSET

复制代码
LSET key index element

根据下标,修改元素。

BLPOP LPOP

LPOP 在之前已经有过介绍,是删除操作。,那加上了B的是什么操作呢?

BLPOP是 Blocking LPOP的缩写,也就是阻塞删除。要是list中没有元素,BLPOP会一直等待列表中有元素添加后,再删除。因此,这个命令通常实现在生产者 - 消费者模型,消费者等待生产者添加元素后再删除。

  • BLPOP 在列表为空时会阻塞,直到有元素可以被弹出。
  • LPOP 在列表为空时立即返回空值,不会等待。

小结:

操作类型 命令 时间复杂度 说明
添加 rpush O(k),k是元素个数 将一个或多个值插入到列表的尾部
添加 lpush O(k),k是元素个数 将一个或多个值插入到列表的头部
查找 linsert O(n),n是pivot距离头尾的距离 在列表中的元素pivot前或后插入value
查找 lrange O(s+n),s是start偏移量,n是start到end 获取列表中指定范围内的元素
查找 lindex O(n),n是索引的偏移量 获取列表中指定索引的元素
查找 llen O(1) 获取列表的长度
查找 lpop O(1) 移除列表的第一个元素并返回
查找 rpop O(1) 移除列表的最后一个元素并返回
删除 lrem O(k),k是元素个数 根据参数count移除列表中与value匹配的元素
删除 ltrim O(k),k是元素个数 保留列表中指定范围内的元素
修改 lset O(n),n是索引的偏移量 设置列表中指定索引的元素值为value
阻塞 blpop O(1) 阻塞直到列表中有元素可弹出
阻塞 brpop O(1) 阻塞直到列表中有元素可弹出

内部编码

列表类型的内部编码有两种:Ziplist 和 Linkedlist

在redis 3.2版本引入了一种新的列表数据结构,用来替代 Ziplist 和 Linkedlist :

Quicklist,快速列表,是一种双向列表,每一个节点都是一个Ziplist ,并且结合了 Ziplist 的内存效率和 Linkedlist的性能。因为 Quicklist 整体是一个链表,链表的每一个节点都是一个压缩列表。

让每个压缩列表都不会太大,同时再把多个压缩列表通过链表的结构连接起来。

相关推荐
m***119018 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
煎蛋学姐19 小时前
SSM基于J2EE的山西旅游网站的设计与实现iiqmx(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·java-ee·ssm 框架·山西旅游网站·在线预订系统
咸甜适中19 小时前
rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)
数据库·rust·sqlite·json
树下水月19 小时前
python 连接hive2 数据库
开发语言·数据库·python
DARLING Zero two♡19 小时前
用Rust构建一个OCR命令行工具
数据库·rust·ocr
蟹至之20 小时前
增删查改基础(其三)—— 聚合函数、分组查询(group by与having)、内置函数
数据库·mysql·增删查改
一叶飘零_sweeeet20 小时前
2025 年 Redis 面试天花板
redis·缓存·面试
2501_9411112420 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python
Wang's Blog21 小时前
MySQL: 数据库索引深度解析:B树与哈希索引的结构、应用与优化策略
数据库·b树·mysql
2501_9411121421 小时前
Python Web爬虫入门:使用Requests和BeautifulSoup
jvm·数据库·python