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

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

相关推荐
一心只为学3 分钟前
Oracle密码过期问题,设置永不过期
数据库·oracle
小光学长12 分钟前
基于vue框架的宠物销售管理系统3m9h3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库
小菜yh35 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
Microsoft Word1 小时前
数据库系统原理(第一章 数据库概述)
数据库·oracle
问道飞鱼1 小时前
分布式中间件-Pika一个高效的分布式缓存组件
分布式·缓存·中间件
华为云开源1 小时前
openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
数据库·云原生·开源
小安运维日记3 小时前
Linux云计算 |【第四阶段】NOSQL-DAY1
linux·运维·redis·sql·云计算·nosql
kejijianwen4 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七4 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石7 小时前
DB-GPT部署和试用
数据库·gpt