【Redis】List 类型的介绍和常用命令

1. 介绍

Redis 中的 list 相当于顺序表,并且内部更接近于"双端队列",所以也支持头插和尾插的操作,可以当做队列或者栈来使用,同时也存在下标的概念,不过和 Java 中的下标不同,Redis 支持负数下标,-1 表示倒数第一个元素,-2 表示倒数第二个元素,和 Java 中的 List 相同的是,列表中的元素是有序的,并且允许重复

2. 常用命令

|-------------------------------|---------------------------------------------------------|--------------------------------------------|
| 命令 | 介绍 | 时间 |
| rpush key value [value ...] | 将一个或多个值插入到列表 key 的表尾(最右边) | O (k),k 是元素个数 |
| lpush key value [value ...] | 将一个或多个值插入到列表 key 的表头(最左边) | O (k),k 是元素个数 |
| linsert key before | 在列表的元素 pivot 之前插入元素 value | O (n),n 是 pivot 距离头的距离 |
| after pivot value | 在列表的元素 pivot 之后插入元素 value | O (n),n 是 pivot 距离头的距离 |
| lrange key start end | 获取列表指定范围内的元素 | O (s+n),s 是 start 偏移量,n 是 start 到 end 的范围。 |
| lindex key index | 通过索引获取列表中的元素 | O (n),n 是索引的偏移量 |
| llen key | 获取列表的长度 | O (1) |
| lpop key | 移除并返回列表 key 的头元素 | O (1) |
| rpop key | 移除并返回列表 key 的尾元素 | O (1) |
| lrem key count value | count 大于 0 时,从左开始搜索,小于 0 时从右开始搜索,删除count 个值等于 value 的元素 | O (k),k 是元素个数 |
| ltrim key start end | 保留 key 对应列表中指定区间 [start, end] 的元素 | O (k),k 是元素个数 |
| lset key index value | 将列表 key 下标为 index 的元素的值设置为 value | O (n),n 是索引的偏移量。 |
| blpop | lpop 的阻塞版本 | O (1) |
| brpop | rpop 的阻塞版本 | O (1) |

3. 内部编码

在 Redis 3.2 之前主要采用linkedlistziplist,3.2 之后主要采用quicklist

linkedlist:双向链表

ziplist:经过特殊编码的连续内存块的顺序存储结构,它将多个元素紧凑地存储在一起,以节省内存空间

quicklist:它是一个双向链表,每个节点是一个 ziplist

4. 应用场景

  1. 消息队列

可以使用 lpush + brpop 来实现生产者-消费者模型队列

  1. 最新消息列表

用于展示最新的一些信息,如社交媒体平台上用户的最新动态、新闻网站的最新消息等,每当有新消息产生时,使用rpush命令将消息添加到 List 的尾部。要获取最新消息,通过lrange命令并设置合适的参数来获取 List 尾部的若干条消息。比如,在一个微博系统中,用户发布的微博可以存储在一个 List 结构中,通过获取 List 的尾部消息来展示用户关注的人发布的最新微博,可以方便地控制显示的消息数量,并且按照消息的发布顺序进行存储和展示,易于实现分页功能,以展示更多的消息

相关推荐
sjjhd65211 分钟前
Python日志记录(Logging)最佳实践
jvm·数据库·python
Configure-Handler16 分钟前
buildroot System configuration
java·服务器·数据库
2301_8213696139 分钟前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
电商API_180079052471 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
2401_832131952 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python
打工的小王2 小时前
redis(四)搭建哨兵模式:一主二从三哨兵
数据库·redis·缓存
Anarkh_Lee3 小时前
【小白也能实现智能问数智能体】使用开源的universal-db-mcp在coze中实现问数 AskDB智能体
数据库·人工智能·ai·开源·ai编程
橘子133 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102163 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋3 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化