redis的基础数据结构-list列表

文章目录

    • 1. redis的list数据结构
      • 1.1. list结构的特性
      • 1.2. 常用命令
    • 2. 常见业务场景
      • 2.1 消息队列
        • 案例讲解
          • 背景
          • 优势
          • 解决方案
          • 代码实现
      • 2.2 排行榜
        • 案例讲解
          • 背景
          • 优势
          • 解决方案
          • 代码实现
    • 3. 注意事项:

1. redis的list数据结构

参考链接:https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A
Redis 中的 List 数据结构是一个简单的字符串列表,可以在两端快速推入和弹出元素。List 的实现是双向链表,这使得它在插入和删除操作上非常高效。List 的元素可以是字符串类型,且可以重复。

1.1. list结构的特性

  • 有序:List 中的元素有顺序,元素按照插入的顺序进行排列。
  • 支持重复:同一个元素可以出现多次。
  • 双向操作:可以在两端进行插入和删除操作。

1.2. 常用命令

以下是一些常用的 Redis List 命令:

  1. LPUSH key value:在列表的左侧(头部)推入元素。
  2. RPUSH key value:在列表的右侧(尾部)推入元素。
  3. LPOP key:从列表的左侧弹出元素。
  4. RPOP key:从列表的右侧弹出元素。
  5. LRANGE key start stop:获取列表中指定范围的元素。
  6. LLEN key:获取列表的长度。
  7. LREM key count value:移除列表中指定数量的某个元素。
  8. LINSERT key BEFORE|AFTER pivot value:在列表中指定元素之前或之后插入一个新元素。
  9. LSET key index value:通过索引设置列表中的元素。
  10. LTRIM key start stop:修剪列表,只保留指定范围内的元素。
XXXXXX:6379> LPUSH user:1001:orders "order_1" #用户1001创建新订单order_1
(integer) 1
XXXXXX:6379> LPUSH user:1001:orders "order_2" #用户1001创建新订单order_2
(integer) 2
XXXXXX:6379> LPUSH user:1001:orders "order_3" #用户1001创建新订单order_3
(integer) 3
XXXXXX:6379> LRANGE user:1001:orders 0 -1 #用户1001查询所有订单
1) "order_3"
2) "order_2"
3) "order_1"
XXXXXX:6379> LLEN user:1001:orders #用户1001查询所有订单的数量
(integer) 3
XXXXXX:6379> LPOP user:1001:orders #用户1001取消最新的订单
"order_3"
XXXXXX:6379> LRANGE user:1001:orders 0 -1 #用户1001查询所有订单
1) "order_2"
2) "order_1"
XXXXXX:6379> LSET user:1001:orders 1 "order_1_completed" #订单order_1完成
OK
XXXXXX:6379> LRANGE user:1001:orders 0 -1 #用户1001查询所有订单
1) "order_2"
2) "order_1_completed"
XXXXXX:6379> LTRIM user:1001:orders 0 9 #用户修剪订单列表,只保留最近的 10 个订单
OK
XXXXXX:6379> LRANGE user:1001:orders 0 -1 #用户1001查询所有订单
1) "order_2"
2) "order_1_completed"
XXXXXX:6379> LREM user:1001:orders 1 "order_2" #用户移除订单order_2
(integer) 1
XXXXXX:6379> LRANGE user:1001:orders 0 -1 ##用户1001查询所有订单
1) "order_1_completed"
XXXXXX:6379> LINSERT user:1001:orders BEFORE "order_1_completed" "order_4" #用户在order_1前插入order_4
(integer) 2
XXXXXX:6379> LRANGE user:1001:orders 0 -1 ##用户1001查询所有订单
1) "order_4"
2) "order_1_completed"

2. 常见业务场景

2.1 消息队列

消息队列:List类型常用于实现消息队列,用于异步处理任务,如邮件发送队列、任务调度等。

案例讲解
背景

在一个电商平台中,用户下单后,系统需要执行多个异步任务,如订单处理、库存更新、发送确认邮件等
在这里插入图片描述

优势
  1. 异步处理:使用List作为消息队列,可以将任务异步化,提高用户体验和系统响应速度。
  2. 任务管理:方便地对任务进行管理和监控,如重试失败的任务、监控任务处理进度等。
  3. 系统解耦:各个任务处理模块可以独立运行,降低系统间的耦合度。
解决方案

使用Redis List类型存储和管理任务消息队列。

代码实现
package mainimport ("context""encoding/json""fmt""github.com/go-redis/redis/v8""log""time"
)var ctx = context.Background()// Redis 客户端初始化
var redisClient = redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "", // no password setDB:       0,  // use default DB
})type Order struct {ID     stringAmount float64
}func (o Order) ToString() string {orderJSON, _ := json.Marshal(o)return string(orderJSON)
}func addOrderToQueue(order Order) {// 将新订单添加到订单处理队列redisClient.LPush(ctx, "order_queue", order.ToString())
}func getNextOrder() (Order, error) {// 从订单处理队列中获取待处理的订单orderJSON, err := redisClient.RPop(ctx, "order_queue").Result()if err != nil {return Order{}, err}var order Ordererr = json.Unmarshal([]byte(orderJSON), &order)if err != nil {return Order{}, err}return order, nil
}func addInventoryUpdateToQueue(order Order) {// 将库存更新任务添加到库存更新队列redisClient.LPush(ctx, "inventory_update_queue", order.ToString())
}func getNextInventoryUpdate() (Order, error) {// 从库存更新队列中获取待处理的更新updateJSON, err := redisClient.RPop(ctx, "inventory_update_queue").Result()if err != nil {return Order{}, err}var order Ordererr = json.Unmarshal([]byte(updateJSON), &order)if err != nil {return Order{}, err}return order, nil
}func addEmailToQueue(order Order) {// 将邮件发送任务添加到邮件发送队列redisClient.LPush(ctx, "email_queue", order.ToString())
}func getNextEmail() (Order, error) {// 从邮件发送队列中获取待发送邮件的订单emailJSON, err := redisClient.RPop(ctx, "email_queue").Result()if err != nil {return Order{}, err}var order Ordererr = json.Unmarshal([]byte(emailJSON), &order)if err != nil {return Order{}, err}return order, nil
}func processOrder(order Order) {// 处理订单逻辑fmt.Printf("Processing order: %s\n", order.ID)// 添加库存更新任务addInventoryUpdateToQueue(order)// 添加邮件发送任务addEmailToQueue(order)// 模拟处理时间time.Sleep(1 * time.Second)
}func updateInventory(order Order) {// 更新库存逻辑fmt.Printf("Updating inventory for order: %s\n", order.ID)// 模拟更新库存的操作time.Sleep(1 * time.Second)
}func sendEmail(order Order) {// 发送确认邮件逻辑fmt.Printf("Sending confirmation email for order: %s\n", order.ID)// 模拟发送邮件的操作time.Sleep(1 * time.Second)
}

2.2 排行榜

排行榜:使用List类型,可以存储和管理如游戏得分、文章点赞数等排行榜数据。

案例讲解
背景

在一个社交平台中,用户发表的文章根据点赞数进行排名,需要实时更新和展示排行榜。
在这里插入图片描述

优势
  1. 实时性:能够快速响应用户的点赞行为,实时更新排行榜。
  2. 排序功能:利用LRANGE命令,可以方便地获取指定范围内的排行榜数据。
解决方案

使用Redis List类型存储用户的得分或点赞数,并根据需要对List进行排序。

代码实现
package mainimport ("context""fmt""github.com/go-redis/redis/v8""log"
)var ctx = context.Background()// Redis 客户端初始化
var redisClient = redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "", // no password setDB:       0,  // use default DB
})type Article struct {ID    stringScore int64
}// 为文章点赞,更新排行榜
func likeArticle(articleID string) {// 假设每个文章都有一个对应的得分,使用 Sorted Set 来维护redisClient.ZIncrBy(ctx, "article_rankings", 1, articleID)
}// 获取文章排行榜
func getArticleRankings() ([]Article, error) {// 使用 ZREVRANGE 获取得分最高的文章result, err := redisClient.ZRevRangeWithScores(ctx, "article_rankings", 0, -1).Result()if err != nil {return nil, err}articles := []Article{}for _, z := range result {articles = append(articles, Article{ID:    z.Member.(string),Score: int64(z.Score),})}return articles, nil
}

3. 注意事项:

List类型在列表元素数量较大时,操作可能会变慢,需要考虑性能优化。

  • 在使用List实现队列时,要注意处理消息的顺序和丢失问题。
  • 可以使用BRPOP或BLPOP命令在多个列表上进行阻塞式读取,适用于多消费者场景。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java面试篇基础部分-Java创建线程详解

导语   多线程的方式能够在操作系统的多核配置上更好的利用服务器的多个CPU的资源,这样的操作可以使得程序运行起来更加高效。Java中多线程机制提供了在一个进程内并发去执行多个线程,并且每个线程都并行的去执行属于线程处理的自己的任务,这样可以提高程序的执行效率,让…

【算法】-单调队列

目录 什么是单调队列 区域内最大值 区域内最小值 什么是单调队列 说到单调队列,其实就是一个双端队列, 顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指…

2.5 ADC模数转换

文章目录 ADC(Analog-Digital Converter)模拟-数字转换器AD转换的步骤 与 时间stm32ADC的转换模式 ADC框图stm32的ADC引脚配置stm32ADC的步骤 ADC(Analog-Digital Converter)模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转…

c#引用同一命名空间下的其他类

总体结构 Class1的内容 using System.Windows.Forms; namespace demo1 {internal class Class1{public class HelperClass{public void DoSomething(){MessageBox.Show("Doing something useful..."); } }} }Class2的内容 using System.W…

【C++ Primer Plus习题】16.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include <string> #inc…

基于YOLO V8的学生上课行为检测系统【python源码+Pyqt5界面+数据集+训练代码】有报告

目的是利用YOLOV8这一先进的深度学习技术&#xff0c;开发一个自动化的学生上课行为检测系统。通过对上课行为数据集进行深入分析和标注&#xff0c;我们训练了YOLOV8模型&#xff0c;使其能够精确识别学生在课堂上的各种行为状态。这一系统能够实时监控并分析学生的行为&#…

Ruoyi Cloud K8s 部署

参考 https://blog.csdn.net/Equent/article/details/137779505 https://blog.csdn.net/weixin_48711696/article/details/138117392 https://zhuanlan.zhihu.com/p/470647732 https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/morecccc/article/details/1…

北大领衔:多智能体研究登上Nature子刊

这篇笔记可以作为接EoT那篇笔记内容中某种思想内涵的延伸和实践&#xff0c;即均是将智能体之间的关系描述为一种拓扑连接结构下的网络化关系进行研究&#xff08;贴近物理世界更加真实、自然、客观的拓扑结构&#xff09;&#xff0c;在这项研究中&#xff0c;更多的扩展到大规…

关于 vue/cli 脚手架实现项目编译运行的源码解析

1.vue项目运行命令解析 在日常开发中&#xff0c;vue 项目通过vue-cli-service脚手架包将项目运行起来&#xff0c;常用的命令例如&#xff1a; npm run serve npm run build 上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令&#xff0c;在…

解码3D数字人及AIGC产品,如何赋能医美行业全场景业务增长

9月13日&#xff0c;第六届“医美小小聚”暨医美信息与服务创新发展大会在热烈的氛围中拉开帷幕。此次盛会汇聚了医美行业的顶尖精英与前瞻者&#xff0c;他们围绕“聚焦营销&#xff0c;合规增长&#xff0c;融合共创”的主题&#xff0c;深入剖析了行业的新趋势、新机遇与新挑…

【JUC并发编程系列】深入理解Java并发机制:Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)

文章目录 【JUC并发编程系列】深入理解Java并发机制&#xff1a;Synchronized机制深度剖析、HotSpot下的并发奥秘(四、synchronized 原理分析)1. 虚拟机环境2. 基本数据类型占多少字节3. JVM对象头3.1 Klass Pointer3.2 实例属性3.3 对齐填充3.4 查看Java对象布局3.5 论证压缩效…

LeetCode 热题 100 回顾13

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

通信工程学习:什么是TDMA时分多址

TDMA时分多址 TDMA&#xff08;Time Division Multiple Access&#xff0c;时分多址&#xff09;是一种在无线通信中广泛使用的多址接入技术。它通过将时间划分为不重叠的时间帧&#xff0c;并将每个时间帧进一步划分为多个时隙&#xff0c;每个时隙分配给不同的用户或通信系统…

第J3周:DenseNet算法实战与解析(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f4cc; 本周任务&#xff1a; ●1.请根据本文 Pytorch 代码&#xff0c;编写出相应的 TensorFlow 代码&#xff08;建议使用…

Apple M3编译MAVSDK安卓平台SO库

1.克隆MAVSDK源码: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编写Shell脚本用于生成Android平台makefile: 生成前,先编译并安装OpenSSL: Apple M3编译OpenSSL安卓平台SO库-CSDN博客 注释掉openssl自动编译,位于third_party/CMakeLists.txt下

自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(七、CILQR约束条件下的ILQR求解)

&#xff08;七&#xff09;CILQR约束条件下的ILQR求解 CILQR&#xff08;(Constrained Iterative Linear Quadratic Regulator)&#xff09; 是为了在 iLQR 基础上扩展处理控制输入和状态约束的问题。在这种情况下&#xff0c;系统不仅要优化控制输入以最小化代价函数&#x…

GD32F4开发 -- FreeRTOS移植

之前讲过FreeRTOS&#xff0c;参看&#xff1a;FreeRTOS学习 – 再识 讲解了什么是FreeRTOS、FreeRTOS的特点、源码下载和目录文件介绍。 这里就不做更多讲解了&#xff0c;直接介绍怎么移植。 一、下载 官网&#xff1a; https://www.freertos.org/zh-cn-cmn-s/ 源码下载&a…

【C++二分查找 容斥原理】1201. 丑数 III

本文涉及的基础知识点 C二分查找 容斥原理&#xff1a;组合数学汇总 LeetCode1201. 丑数 III 丑数是可以被 a 或 b 或 c 整除的 正整数 。 给你四个整数&#xff1a;n 、a 、b 、c &#xff0c;请你设计一个算法来找出第 n 个丑数。 示例 1&#xff1a; 输入&#xff1a;n …

总结拓展九:SAP数据迁移(2)

第三节 数据迁移工具LTMC实操 1、供应商&#xff08;BP&#xff09;主数据导入 1.1 首先在SAP S 4系统&#xff0c;通过事务代码“LTMC”跳转进入数据迁移控制台&#xff08;网页版&#xff09;&#xff1b; 1.2 点击“创建”按钮&#xff0c;创建迁移项目“NJDHMM-01”; 传…

大模型→世界模型下的「认知流形」本质·下

本篇内容节选自今年初我撰写的那篇10万的文章《融合RL与LLM思想&#xff0c;探寻世界模型以迈向AGI》&#xff0c;其观点也是文章中核心中的核心。 想进一步完整阅读的小伙伴可关注评论&#xff0c;节选内容如下↓ 接上篇..“因此当前无论对先验自回归学习下的LLMs也好还是未来…