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

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

相关推荐
python15612 分钟前
谷歌推出Nano Banana,全新图像编辑模型
数据库
Java 码农16 分钟前
MySQL索引添加与删除方法详解
数据库·mysql
正在走向自律22 分钟前
电科金仓KingbaseES数据库全面语法解析与应用实践
数据库·国产数据库·kingbasees·数据定义语言ddl·数据操作语言dml·kingbasees语法
web安全工具库31 分钟前
Linux进程的:深入理解子进程回收与僵尸进程
java·linux·数据库
麦聪聊数据39 分钟前
大数据与云原生数据库中的 SQL2API:优化跨平台数据访问与查询
数据库·sql·云原生
虚伪的空想家1 小时前
记录次etcd故障,fatal error: bus error
服务器·数据库·k8s·etcd
笨手笨脚の1 小时前
Mysql 的锁机制
数据库·mysql··死锁·间隙锁
老友@1 小时前
一次由 PageHelper 分页污染引发的 Bug 排查实录
java·数据库·bug·mybatis·pagehelper·分页污染
hzk的学习笔记1 小时前
Redisson解锁失败,watchdog会不会一直续期下去?
数据库·redis·缓存
合作小小程序员小小店2 小时前
web网页开发,在线%商城,电商,商品购买%系统demo,基于vscode,apache,html,css,jquery,php,mysql数据库
开发语言·前端·数据库·mysql·html·php·电商