【Redis】redis5种数据类型(list)

目录

基本介绍

命令

LPUSH

LPUSHX

RPUSH

RPUSHX

LRANGE

LPOP

RPOP

LINDEX

LINSERT

LLEN

LREM

LTRIM

LSET

阻塞版本的命令

BLPOP

内部编码


基本介绍

list相当于c++的双端队列deque

区分获取和删除的区别

  1. lindex能获取到元素的值
  2. lrem也能返回被删除元素的值

命令

LPUSH

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

语法:

LPUSH key element element...

时间复杂度:O(k),k是元素个数

返回值:插入后list的长度 。

如果key已经存在,并且key对应的value类型,不是list,此时lpush命令就要报错

LPUSHX

在key存在时,将一个或者多个元素从左侧放入(头插)到list 中,不存在,则返回

语法:

LPUSHX key element element...

时间复杂度:O(1)

返回值:插入后list的长度 。

RPUSH

将一个或者多个元素从右侧放入(尾插)到list中

语法:

RPUSH key element element...

时间复杂度:O(k),k是元素个数

返回值:插入后list的长度

RPUSHX

在key存在时,将一个或者多个元素从右侧侧放入(尾插)到list 中,不存在,则返回

语法:

RPUSHX key element element...

时间复杂度:O(1)

返回值:插入后list的长度 。

LRANGE

查看list中指定范围的元素

语法:

LRANGE key start stop //此处的区间是闭区间

时间复杂度:O(s+n),s是start的偏移量,n是start到stop

返回值:指定区间元素

LPOP

从list左侧取出元素(即头删)

语法:

LPOP key

时间复杂度:O(1)

返回值:取出的元素或者nil

RPOP

从list右侧取出元素(即尾删)

语法:

RPOP key

时间复杂度:O(1)

返回值:取出的元素或者nil

LINDEX

获取从左数第index位置的元素

语法:

LINDEX key index

时间复杂度:O(N),N是索引的偏移量

返回值:取出的元素或者nil(下标非法返回nil)

LINSERT

在特定位置插入元素

语法:

LINSERT key <BEFORE | AFTER> pivot element

  • <BEFORE | AFTER> 插入指定位置之前还是之后
  • pivot 插入位置的基准值
  • element 插入的值
  • linsert进行插入的时候,要根据基准值,找到对应的位置,从左往右找,找到第一个符合基准值的即可

时间复杂度:O(N),N是pivot距离头尾的距离

返回值:插入后list的长度

LLEN

获取list长度

语法:

LLEN key

时间复杂度:O(1)

返回值:list的长度,不存在的key返回0

LREM

语法:

LREM key count element

  • count 要删除的个数
  • element 要删除的值
  • count是正数从左开始找,负数是从右开始找,0代表符合删除的值的全删除

时间复杂度:O(N+M),N列表长度,M删除元素个数

返回值:删除的个数

LTRIM

语法:

LTRIM key start stop

  • 保留start和stop之间区间内的元素(区间外面两边的元素就直接被删除了)

LSET

根据下标修改元素

语法:

LSET key index element

  • index越界报错

时间复杂度:O(N),N索引的偏移量

阻塞版本的命令

blpop 和brpop是lpop和rpop的阻塞版本,和对应的非阻塞版本的作用基本一致,除了:

  • 在列表有元素的情况下,阻塞和非阻塞的表现是一致的,但如果列表中没有元素,非阻塞版本会立即返回nil;但阻塞版本会根据timeout,阻塞一段时间,期间redis可以执行其他命令,但要求执行该命令的客户端会表现为阻塞状态。
  • 使用brpop和blpop的时候,这里是可以显式设置阻塞时间的。
  • blpop和brpop都是可以同时去获取多个key的列表的元素的,多个key对应多个list,这多个list哪个有元素了,就返回哪个元素。
  • 如果多个客户端同时对一个键执行pop,先执行命令的客户端会得到弹出的元素。

brpop的用法与效果与blpop类似,这里只介绍blpop

BLPOP

LPOP的阻塞版本

语法:

BLPOP key key ... timeout

  • timeout单位是秒

时间复杂度:O(1)。

返回值:当针对一个非空的列表进行操作,返回的结果相当于一个pair,一方面告诉我们当前的数据来自哪个key,另一方面告诉我们取到的数据是啥。若列表为空等待timeout秒,若超过timeout的时间,则返回nil。

内部编码

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

  • ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的长度都小于list-max-ziplist-value配置(默认64字节)时,redis会选用ziplist来作为列表的内部编码实现减少内存消耗。
  • linkedlist(链表):当列表类型无法满足ziplist的条件时,redis会选用linkedlist作为列表的内部实现。

上面两种编码方式是旧版本的实现方式,现在一般使用quikelist,quikelist相当于链表和压缩列表的结合,整体还是一个链表,链表的每个元素是压缩列表,每个压缩列表都不让它太大(通过list-max-ziplist-size来配置)

相关推荐
论迹复利44 分钟前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin1 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
736c1 小时前
C语言-数组 07
c语言·开发语言
宸津-代码粉碎机2 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
倔强的石头_2 小时前
连接数失控排查:从数据库会话、应用线程池到连接池泄漏
数据库
hzxpaipai2 小时前
企业官网技术架构拆解:前端、后台、数据库、服务器如何协同
前端·数据库·架构
爱吃火鸡面呀3 小时前
MySQL DQL 子查询详解:从标量、列、行到表子查询的完整实战
大数据·数据库·mysql
LorryJovens3 小时前
【LAAP科研】CEN因果等价网络理论---从双缝干涉到因果等价
开发语言·php
harmony&3 小时前
OpenStack 云平台管理实战:从 Keystone 认证到 Nova 计算调度
数据库·openstack
Brilliantwxx4 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络