Redis之List列表

目录

一.列表讲解

二.列表命令

三.内部编码

四.应用场景


Redis的学习专栏:http://t.csdnimg.cn/a8cvV

一.列表讲解

列表类型是用来存储多个有序的字符串,如下所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素(element),一个列表最多可以存储 2的32次方-1个元素。

在 Redis中,列表的元素是有序并且可重复的,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。

列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用场景。

注:个人认为这是一个队列,并且最长负数下标。

二.列表命令

PUSH命令

一次插入一个或者多个元素,如果想头插法,则LPUSH,尾插法:RPUSH ;返回list长度。如果在末尾添加一个X,则表示,该列表必须存在,不存在则直接返回。

语法:PUSH key element [element ...]
POP命令

出栈一个元素,也分LPOP和RPOP,两者就是左出和右出。注:redis6版本支持添加count 表示出栈多少元素

语法:POP key [count]
LINDEX命令

通过下标值获取元素值

语法: LINDEX key index
LINSERT 命令

在指定元素的位置插入元素,before:前面;after:后面,而pivort表示元素。由于是L开通,所以找到元素是从左边开始找到第一个相同的元素。

语法:Linsert key <BEFORE | AFTER >PIVORT ELEMENT
LLEN

直接获取list的长度

语法:LLEN key
LREM

删除某个值value,并且设置删除的个数。

语法: LREM KEY COUNT VALUE

COUNT:如果小于0,则从右开始删除;例:-1,则从右开始删除1

如果大于0,则从左边开始删除

如果等于0,则将列表的值全删了。
LTRIM命令

对列表(List)进行修剪(Trim)操作的命令。它可以通过移除列表中的一部分元素

语法:LTRIM key start stop
LRANGE命令

用于获取列表(List)中指定范围元素的命令,如果是 0 -1;则是全部元素

语法:LRANGE key start stop
blpop命令和brpop

这两个命令是lpop命令和rpop命令的升级版,为阻塞命令,执行之后,不影响你执行其他命令,他会耐心等待,一旦列表中有值了,就会出队列,返回值。当然也可以设置好等待时间timeout!如果涉及到了多个key,则按优先级弹出。如果多个客户端都执行此命令,谁先执行,谁先获取。

语法:BLPOP key [key ...] timeout

三.内部编码

在 Redis 中,列表(List)是一种数据结构,用于存储多个有序的字符串元素。Redis 使用列表编码来存储列表数据,列表编码有两种形式:压缩列表(ziplist)双端链表(linkedlist)

1. 压缩列表(ziplist)

压缩列表采用情况:个数少于512,长度小于64字节。压缩列表是 Redis 中用于存储较小列表的编码方式,它采用紧凑的内存布局来减少内存使用。压缩列表的特点包括:

  • 紧凑存储: 压缩列表使用一块连续的内存来存储所有元素,每个元素由一个长度前缀和实际数据组成。
  • 灵活大小: Redis 会根据列表的长度和元素的大小动态选择是否使用压缩列表。
  • 快速操作: 压缩列表支持快速的插入和删除操作,因为它可以在不需要重新分配内存的情况下进行元素的添加和删除。

2. 双端链表(linkedlist)

双端链表是 Redis 中用于存储较大列表的编码方式,它具有以下特点:

  • 灵活存储: 双端链表由多个节点组成,每个节点包含一个元素和指向前后节点的指针。
  • 内存动态分配: 双端链表可以动态地增长或缩小,根据元素的数量和大小动态分配内存。
  • 灵活操作: 双端链表支持快速的插入和删除操作,尤其是在大列表中效率比较高。

注:redis版本不是采用linkedlist版本,而是采用链表+压缩列表的方式!整体是一个链表,每个结点是压缩列表。

四.应用场景

1.数据分类

统计班级的分数,例如需要存储每一个班级的学生信息(姓名、年龄、性别、分数)。虽然存储学生信息,我们可以使用Hash结构,但是学生分类到班级呢?

如果将学生信息设置好之后,根据学生的序号,放入列表当中!

2.消息队列

使用Redis作为消息队列,之前我们讲解了两个命令,阻塞命令。blpop和brpop命令

如上图,生成者生产数据,消费者先执行,就拿元素!

相关推荐
卡布奇诺-海晨17 分钟前
MySQL的MVCC机制
数据库·mysql
hao_wujing43 分钟前
攻击模型的恶意行为检测
网络·数据库·php
秃头摸鱼侠2 小时前
MySQL查询语句(续)
数据库·mysql
MuYiLuck2 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机2 小时前
6. MySQL基本查询
数据库·mysql
�FENG2 小时前
Redis 安装配置和性能优化
redis·持久化
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift
大熊猫侯佩3 小时前
用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化
数据库·swiftui·swift
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(一)
数据库·swiftui·swift