Redis--list类型

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis--list类型

Redis–list类型

有点像C++的vector,可以 O(1) 的进行 头插/头删/尾插/尾删,也可以通过下标获取对应的元素(O(N))。可以充当栈和队列,其底层有点像deque。


list里每个元素都是string类型。一个list 里的元素可以重复。


元素是有序的:[1,2,3]和[3,2,1] 是不同的列表。


题外话:很多时候同一个词有很多种理解!!如:栈/堆(数据结构里的,操作系统里的,JVM里的);同步(多线程里的互斥与同步,I/O中的同步与异步)


基本命令

1. lpush && lpop

l:left,从左侧插入删除,也就是头插头删

# 支持头插多个元素,依次头插,最后头插的元素在最前面。key不存在会创建一个
lpush key element [element ...]
# count 表示删除几个元素 redis6.2以后支持
lpop key [count]


2. rpush && rpop

r:right,从右侧插入删除,尾插尾删

# 支持尾插多个元素,依次尾插,最后尾插的元素在最后面。key不存在会创建一个
rpush key element [element ...]
rpop key [count]


3. lrange

l:list


查看某一范围的元素,支持负数。(-1表示倒数第一个元素…)


如果下标非法,就尽可能的满足要求,并不会出错。(更像python)

# [begin, end] 下标从0开始
lrange key begin end


4. lpushx && rpushx

key存在时才插入,否则不会自己创建,直接返回。

lpushx key element [element ...]
rpushx key element [element ...]


5. lindex

通过下标获取元素。O(N) N是list中的元素个数。

lindex key index


6. linsert

在指定位置插入元素。O(N)

# 在指定元素 pivot 前/后 插入元素element
# 当元素 pivot 有多个时,就从左向右找第一个 pivot 进行插入 
linsert key begin|after pivot element


7. llen

获取list的元素个数。

llen key


8. lrem

删除元素。

# count == 0 删除所有的element
# count > 0 从左向右删除count个 element
# count < 0 从右向左删除count个 element
lrem key count element


9. ltrim

按范围删除元素。

# 只保留[start, end] (左闭右闭) 区间的元素,把两边的删除
ltrim key start end


10. lset

根据下标修改元素。O(N)


下标越界就报错。

# 将index下标处的元素修改成 element
lset key index element


11. blpop && brpop (少用)

阻塞式的pop 。当 pop时该list是空的,就会阻塞等待一段时间(可以自己设置)。

主要用来作为 消息队列 使用。

# 可以对多个key进行pop,从第一个key开始找,一旦有一个list里有元素可以pop就返回,后面的key不会进行删除
# 若多个客户端都阻塞等待一个key,那么当key有数据时最先调用的那个客户端会获得pop权,解除阻塞
# timeout 为阻塞时间,单位是秒,redis6以后支持设置成小数。
blpop key1 [key2 ...] timeout
brpop key1 [key2 ...] timeout


list类型内部编码

redis4之前是 ziplist和linkedlist两类。ziplist节省空间,但是操作效率低,当数据较少时使用。


redis4之后合并了,只有一个 quicklist,这整体是一个linkedlist,其中每一个元素是一个 ziplist。保证每个ziplist存储元素不多,再整体连接起来。


list类型的应用场景

1. 作为消息队列(作为 阻塞式生产者消费者模型)

在实际中 消息队列 有专业的软件,即使是用redis来作为消息队列,也不会使用list类型,而是用stream类型。


这里借助 lpush 和brpop (或者反过来) 就可以实现基于轮询方案的 阻塞式生产者消费者模型。


当有多个list作为交易场所时就可以实现分频道的消息队列。



2. 用作数据列表

相当于vector的用处。

者反过来) 就可以实现基于轮询方案的 阻塞式生产者消费者模型。

当有多个list作为交易场所时就可以实现分频道的消息队列。


[外链图片转存中…(img-pS0xiRHE-1700646003032)]


2. 用作数据列表

相当于vector的用处。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
19天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
30天前
|
消息中间件 存储 监控
redis 的List类型 实现 排行榜
【10月更文挑战第8天】
37 2
|
30天前
|
存储 NoSQL Redis
redis-set类型
【10月更文挑战第6天】
36 1
|
1月前
|
存储 分布式计算 NoSQL
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
大数据-40 Redis 类型集合 string list set sorted hash 指令列表 执行结果 附截图
27 3
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
大数据-41 Redis 类型集合(2) bitmap位操作 geohash空间计算 stream持久化消息队列 Z阶曲线 Base32编码
27 2
|
19天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
2月前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
51 2
|
1月前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
130 0
|
3月前
|
SQL 机器学习/深度学习 算法
【python】python指南(五):静态类型注解之List
【python】python指南(五):静态类型注解之List
42 0
【python】python指南(五):静态类型注解之List