Redis--list类型

本文涉及的产品
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 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
相关文章
|
6天前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
7天前
|
SQL 机器学习/深度学习 算法
【python】python指南(五):静态类型注解之List
【python】python指南(五):静态类型注解之List
16 0
【python】python指南(五):静态类型注解之List
|
2月前
|
NoSQL Redis C语言
[hiredis 的Redis执行语句返回结果类型全说明
[hiredis 的Redis执行语句返回结果类型全说明
28 1
|
2月前
|
存储 NoSQL Redis
蓝易云 - Redis之bitmap类型解读
需要注意的是,虽然bitmap可以高效地存储和计算大量的位,但是它也有一些局限性,例如,它不能直接获取或设置某一范围内的所有位,也不能直接获取或设置多个不连续的位。
17 2
|
1月前
|
Java
Redis19----RedisTemplate操作Hash类型
Redis19----RedisTemplate操作Hash类型
|
1月前
|
NoSQL Redis
Redis11-----Sortedset类型,SortedSet底层是由数据树实现的,SortedSet删除同学,获取Amy同学分数,获取Rose同学排名,查询80分以下的学生,给Amy同学加2分
Redis11-----Sortedset类型,SortedSet底层是由数据树实现的,SortedSet删除同学,获取Amy同学分数,获取Rose同学排名,查询80分以下的学生,给Amy同学加2分
|
1月前
|
存储 NoSQL Java
Redis10------Set类型,存在着无序的特征存储的顺序和插入的顺序是无关的,set集合的一大特点是不可重复,在redis中支持交集插集等特殊功能,好友列表,共同关注等等
Redis10------Set类型,存在着无序的特征存储的顺序和插入的顺序是无关的,set集合的一大特点是不可重复,在redis中支持交集插集等特殊功能,好友列表,共同关注等等
|
1月前
|
NoSQL Java Redis
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
|
1月前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
1月前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX