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

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

相关推荐
王强你强几秒前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子1 分钟前
brew 安装mysql,启动,停止,重启
数据库·mysql
用户6279947182628 分钟前
南大通用GBase 8c分布式版本gha_ctl 命令-HI参数详解
数据库
斯汤雷16 分钟前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
SQLplusDB23 分钟前
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到数据库示例,以及常见错误
数据库·oracle·embedding
喝醉酒的小白44 分钟前
SQL Server 可用性组自动种子设定失败问题
数据库
chem41111 小时前
Conmon lisp Demo
服务器·数据库·lisp
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
m0_555762901 小时前
QT 动态布局实现(待完善)
服务器·数据库·qt
松韬2 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存