Redis 中 List 数据结构详解

目录

List

用法

1. 增

2. 删

3. 查

内部编码

应用场景


前言

Redis 中的 List 和 Set 数据结构各有特点,适用于不同的应用场景。List 提供了有序的列表结构,适合用于消息队列和任务列表等场景;Set 提供了无序且不重复的集合结构,适合用于标签系统和唯一性检测等场景。通过合理选择和使用 Redis 的数据结构,可以有效提升系统的性能和扩展能力。


List

用法

List 是一个简单的链表,支持从两端进行插入和删除操作。


常见命令:

1. 增

插入一个或多个元素到列表的左端。

lpush key value [value ...]

lpushx key value [value ...]( key存在时插入 )

返回值 :list 的长度 

插入一个或多个元素到列表的右端。

rpush key value [value ...]

rpushx key value [value ...]( key存在时插入 )

返回值: list的长度

在指定位置插入元素

linsert key <before | after> pivot element

进行插入的时候,从左往右找到第一个基准值进行插入

返回值:新的 list 的长度 

2. 删

删除并返回列表的左端元素。

lpop key

lpop key [count]( 6.2版本在后面可以设置删除的个数)

返回值: 被删除的元素/nil(空)

删除并返回列表的右端元素。

rpop key

返回值:  被删除的元素/nil(空)

删除指定的元素

lrem key count(要删除的数量) element(要删除的值)

count > 0 : 从左往右找,删除

count < 0 : 从右往左找,删除

count = 0 : 删除所有的

删除范围外的元素 

ltrim key start stop(前闭后闭)

阻塞删除 

brpop / blpop key [key ...] timeout(秒)


当 list 为空的时候,会进行阻塞(等待),但是这个期间 Redis 可以执行其他命令!!!

返回值:

1. 非空时,会返回删除的是哪个key的哪个值

eg:blpop key 0

(1)"key"

(2)"1"

2. 为空时,会进行阻塞,当有数据的时候,进行 pop

3. 查

返回列表中指定范围内的元素。

lrange key start stop(前闭后闭)

超过范围的话,只会返回范围内的元素,不会报错。 

返回列表的长度。 

llen key

根据下标获取元素 

lindex key index


内部编码

以前的Redis编码

ziplist:当列表中的元素数量较少且每个元素都比较小时,Redis 使用紧凑的 ziplist 结构。ziplist 是一种连续内存块,存储在一个数组中,可以有效减少内存占用。

linkedlist:当列表变大或元素变复杂时,Redis 会自动切换到 linkedlist 编码。这是一种双向链表,适合频繁的插入和删除操作。

如今的Redis编码

quicklist:取其精华,去其糟粕!!!整体是一个链表,但是每个节点是一个不是很大的压缩列表(ziplist)。


应用场景

消息队列:可以利用 LPUSHBRPOP 命令实现一个简单的消息队列,生产者通过 LPUSH 插入消息,消费者通过 BRPOP 获取消息。

微博Timeline:每个用户都有属于⾃⼰的 Timeline(微博列表),现需要分页展示文章列表。此时可以考虑使⽤列表,因为列表不但是有序的,同时⽀持按照索引范围获取元素。

1. 每篇微博使⽤哈希结构存储,例如微博中 3 个属性:title、timestamp、content:

hmset mblog:1 title xx timestamp 1476536196 content xxxxx

2. 向用户 Timeline 添加微博,user:<uid>:mblogs 作为微博的键:

lpush user:1:mblogs mblog:1 mblog:3

3. 分页获取用户的 Timeline,例如获取用户 1 的前 10 篇微博:

keylist = lrange user:1:mblogs 0 9
for key in keylist {hgetall key
}

问题:

1. 当每次分页过多的时候,需要进行多次 hgetall 操作,这是可以考虑进行 pipeline (流水线)进行批量进行提交命令。

2. 分裂获取文章时,lrange 在列表两端表现比较好,但是中间比较差,此时可以考虑进行拆分。

同侧存取(lpush + lpop 或者 rpush + rpop)为栈
异侧存取(lpush + rpop 或者 rpush + lpop)为队列

任务列表:在任务处理系统中,可以使用 List 存储待处理的任务,工作线程从列表中获取任务进行处理。

最新消息:将最新消息存储在 List 中,通过 LRANGE 命令获取最新的 N 条消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/843413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis常用命令——Hash篇

前面我们讲述了String的相关操作命令。本篇文章主要讲解Redis中数据结构Hash的相关操作命令。希望会对你有所帮助。 目录 一、Hash哈希 二、命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX HINCRBY 和 HINCRBYFLOAT 三、小结 &#x1f64b;‍♂️ 作者&a…

React 供应商选择组件 - 使用Ant Design渲染Select并与父组件Form同步数据

1、安装Ant Design的相关依赖&#xff1a; npm install antd ant-design/icons2、编写SupplierSelect组件的代码如下&#xff1a; import React, { useEffect, useState } from react; import { Select } from antd; import axios from axios;const { Option } Select;const…

Spring的FactoryBean多例问题

关于spring bean&#xff0c;我们了解的最多的还是单例&#xff0c;而多例bean,除了平时我们自己new的那些多实例外&#xff08;但不属于IOC管理了&#xff09;&#xff0c;几乎很少能用到&#xff0c;而在spring 层面&#xff0c;FactoryBean刚好是多例的一个体现&#xff0c;…

【介绍下如何在SQL中添加数据】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

淘宝扭蛋机小程序:探索未知,扭出惊喜

在数字时代&#xff0c;我们一直在寻找一种新颖、有趣且充满惊喜的购物方式。淘宝扭蛋机小程序正是为了满足这一需求而诞生的创新之作&#xff0c;它将传统扭蛋机的乐趣与淘宝的丰富商品库完美结合&#xff0c;为您带来前所未有的购物体验。 打破传统&#xff0c;创新玩法 淘…

ABB焊接功能介绍

1.基本配置 1.2配置Robot Ware Arc 2.焊接语句 2.1直线焊接语句 过渡点指令必须位于起弧指令与熄弧指令之间&#xff0c;不能单独使用。 2.2直线焊接示例 2.3圆弧焊接语句 2.4圆弧焊接示例 2.5摆动参数 关于ABB焊接机器人摆动参数设定 一般情况下&#xff0c;主要设置以…

养老院管理系统基于springboot的养老院管理系统java项目

文章目录 养老院管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 养老院管理系统 一、项目演示 养老院管理系统 二、项目介绍 基于springboot的养老院管理系统 角色&#xff1a;超级…

再创佳绩丨达梦数据库一体机荣获2024数字中国创新大赛·信创赛道总决赛一等奖

5月24日&#xff0c;第七届数字中国建设峰会在福州盛大开幕&#xff0c;峰会内容安排包含开幕式、主论坛、分论坛、数字中国创新大赛、现场体验区及成果发布和专业工作会议等。武汉达梦数据库股份有限公司(以下简称达梦数据)受邀参加并在展、会、赛等多个环节深度参与。达梦全栈…

【数据结构与算法 | 基础篇】力扣232, 225

1. 力扣232 : 用栈实现队列 (1). 题 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移…

dolphinscheduler standalone安装

官方文档&#xff1a;https://dolphinscheduler.apache.org/en-us/docs/3.1.3/guide/installation/standalone 1.安装&#xff08;以放在/home为例&#xff09; 下载见&#xff1a;https://download.csdn.net/download/taotao_guiwang/89311365 tar -xvzf apache-dolphinsche…

pytorch比较操作

文章目录 常用的比较操作1.torch.allclose()2.torch.argsort()3.torch.eq()4.torch.equal()5.torch.greater_equal()6.torch.gt()7.torch.isclose()8.torch.isfinite()9.torch.isif()10.torch.isposinf()11.torch.isneginf()12.torch.isnan()13.torch.kthvalue()14.torch.less_…

学习前端第四十一天(节点属性,特性和属性)

一、节点属性 1、nodeType属性&#xff0c;获取 DOM 节点类型 对于元素节点 elem.nodeType 1&#xff0c; 对于文本节点 elem.nodeType 3&#xff0c; 对于注释节点 elem.nodeType 8&#xff0c; 对于 document 对象 elem.nodeType 9&#xff0c; 2、nodeName和tagNa…

NLP技术发展和相关书籍分享

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是计算机科学领域和人工智能领域的重要研究方向之一&#xff0c;旨在探索实现人与计算机之间用自然语言进行有效交流的理论与方法。它融合了语言学、计算机科学、机器学习、数学、认知心理学等…

C++中的异常处理

文章目录 前言一、异常处理的代码实现二、异常规范总结 前言 异常处理是一种在软件开发中用于处理程序运行时错误的机制。在C中&#xff0c;异常处理的基本思想是将异常情况与正常情况进行区分&#xff0c;当异常情况发生时&#xff0c;程序不会继续执行下去&#xff0c;而是转…

外卖系统源码解读:校园外卖APP开发全攻略

外卖系统源码解读&#xff1a;校园外卖APP开发全攻略 今天&#xff0c;小编将深入解读外卖系统的源码&#xff0c;详细介绍如何开发一款功能齐全的校园外卖APP&#xff0c;帮助开发者快速上手&#xff0c;打造出高质量的外卖应用。 一、需求分析 应具备以下基本功能&#xff…

idea的project structure下project [lauguage ]()level 没有java的sdk17选项如何导入

idea的project structure下project lauguage level 没有java的sdk17选项如何导入 别导入了&#xff0c;需要升级idea版本。idea中没有project language level没有17如何添加 - CSDN文库 别听这文章瞎扯淡 2021版本就是没有&#xff0c;直接卸载升级到最新版本就可以了。没办法…

关系型数据库的三范式理解

关系型数据库的三范式&#xff08;Third Normal Form&#xff0c;3NF&#xff09;是数据库设计中的一种规范化理论&#xff0c;用于减少数据冗余和提高数据一致性。三范式是建立在第一范式&#xff08;1NF&#xff09;和第二范式&#xff08;2NF&#xff09;的基础上的。以下是…

MySQL之创建高性能的索引(四)

创建高性能的索引 空间数据索引(R-Tree) MyISAM表支持空间索引&#xff0c;可以用作地理数据存储。和B-Tree索引不同&#xff0c;这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时&#xff0c;可以有效地使用任意维度来组合查询。必须使用MySQL的GIS相关函数如…

AcWing 2568:树链剖分 ← 线段树+DFS

【题目来源】https://www.acwing.com/problem/content/2570/【题目描述】 给定一棵树&#xff0c;树中包含 n 个节点&#xff08;编号 1∼n&#xff09;&#xff0c;其中第 i 个节点的权值为 ai。 初始时&#xff0c;1 号节点为树的根节点。 现在要对该树进行 m 次操作&#xf…

5.28总结

HTML 三剑客&#xff1a; JS CSS HTML 入门实例 新建一个test.html文件&#xff0c;内容如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…