初始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 整体是一个链表,链表的每一个节点都是一个压缩列表。

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

相关推荐
Tapdata6 分钟前
《实时分析市场报告 2025》上线 | 从批处理到实时洞察,2025 年全球实时分析市场全景解读
数据库
海梨花17 分钟前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
代码的余温2 小时前
SQL性能优化全攻略
数据库·mysql·性能优化
手把手入门4 小时前
★CentOS:MySQL数据备份
数据库·mysql·adb
SelectDB4 小时前
5000+ 中大型企业首选的 Doris,在稳定性的提升上究竟花了多大的功夫?
大数据·数据库·apache
路多辛4 小时前
Golang database/sql 包深度解析(二):连接池实现原理
数据库·sql·golang
SimonKing5 小时前
Mybatis批量插入,形式不同性能也不同
数据库·后端·程序员
杰克尼6 小时前
MYSQL-175. 组合两个表
数据库·mysql
DemonAvenger6 小时前
MySQL索引原理深度解析与优化策略实战
数据库·mysql·性能优化
189228048616 小时前
NY270NY273美光固态闪存NY277NY287
服务器·网络·数据库·科技·性能优化