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

news2024/11/14 18:47:53

文章目录

    • 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 main

import (
    "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 set
    DB:       0,  // use default DB
})

type Order struct {
    ID     string
    Amount 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 Order
    err = 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 Order
    err = 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 Order
    err = 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 main

import (
    "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 set
    DB:       0,  // use default DB
})

type Article struct {
    ID    string
    Score 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.coloradmin.cn/o/2122436.html

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

相关文章

SprinBoot+Vue小区车辆管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

国内智能运维厂商月度动态 202408

作为市场人员,虽然也添加了各类行业媒体、同行厂商的关注,但被同事问起业内动向时,常常也是记忆模糊、拍破脑袋也说不完整一件事。 所以找机会翻看了一下各大厂商的公号,先做个简单的8月汇总。 格式暂时是这样的: 整…

SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)

文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道,用ResponseBody注解标注的接口,默认返回给页面的是json数据。 其实,也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…

【GoMate框架案例】讯飞大模型RAG智能问答挑战赛top10 Baseline

【RAG框架】GoMate:RAG Framework within Reliable input,Trusted output 【项目链接】:https://github.com/gomate-community/GoMate 一、赛题背景 RAG(检索增强生成)是一种结合了检索模型和生成模型的技术,它通过检…

电竞社交平台

#计算机项目设计#vue项目实战 #java项目 #计算机项目 #电竞 #支付宝沙箱支付 #邮件发送 电竞社交平台 技术栈 开发工具:IDEA , VsCod 程序框架:SpringBoot、Mybatis、Vue 运行环境:Windows 数 据 库:MySQL 8.0.32 支付宝沙箱and邮…

2024最新FL Studio24.1.1.4285破解版中文安装包百度云网盘下载地址

大家好,今天我要给大家介绍一款音乐制作神器——FL Studio 24.1.1.4285中文版。这款软件可是音乐制作界的翘楚,无论是专业人士还是音乐爱好者,都会为它的强大功能和易用性所折服。 我们来看看FL Studio的特点。 这是一款全能型的音乐工作站&…

你的个人敏感信息是怎么泄露的?

你肯定经历过各种骚扰电话,房产中介、信用卡中心、贷款等等,在你不胜其烦挂断这些电话的同时,你有没有想过一个问题:这些骚扰电话都是怎么来的 ? 举个例子,著名的万豪酒店,在 2018 年发生了一次…

Leetcode 只出现一次的元素

题目要求我们找到数组中只出现了一次的元素,而其他元素都出现了两次。 解题思路: 我们可以使用位运算中的异或操作(XOR)。异或操作有以下两个特性: 相同的两个数字异或结果为0,例如:a ^ a 0…

使用Flask框架构建RESTful API:从基础到实践

随着移动设备和Web应用的普及,API(应用程序接口)的重要性日益凸显。RESTful API因其简洁的设计和广泛的支持成为构建现代Web服务的标准。Flask是一个轻量级且灵活的Python Web框架,非常适合用来快速搭建RESTful API。本文将详细介…

亿发:信息化智能化需求大幅提升,企业信息化建设又迈出关键一步

在全球数字经济蓬勃发展的背景下,企业信息化建设正成为推动生产力提升、增强市场竞争力的关键引擎。随着企业对信息化和智能化的需求大幅提升,越来越多的企业加速了数字化转型的步伐,通过信息技术优化业务流程、提高运营效率、增强客户体验。…

官网下载easyx压缩包,如何在devc++配置easyx

视频教程 官网下载easyx压缩包,如何在devc配置easyx EasyX Graphics Library for C 安装指南 1. 访问官网 官网 2. 下载 EasyX 在官网上找到下载区域,点击下载按钮以获取 EasyX 安装包。 3. 访问更多下载选项 点击页面上的“more”链接&#xff0…

伟易特发布全新一代便携式反无人机装备

伟易特电子便携式反无人机系统突破技术创新,在大量实战应用中获得广泛好评,获得广大用户认可发布全新一代便携式反无人机装备

路径规划——D*算法

路径规划——D*算法 D Star算法是一种用于动态环境下的算法,它可以在环境变化时快速更新路径。 算法原理 D Star算法是一种反向增量式搜索算法,反向即算法从目标点开始向起点逐步搜索;增量式搜索,即算法在搜索过程中会计算每一…

锋哥写一套前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt 视频教程 ,帅呆了~~

大家好,我是java1234_小锋老师,最近写了一套【前后端分离Python权限系统 基于Django5DRFVue3.2Element PlusJwt 】视频教程,持续更新中,计划月底更新完,感谢支持。 视频在线地址: 打造前后端分离Python权…

Java超详细知识点——I/O流(字节流和字符流)

File类: Java API:java.io.File 类 是用来操作文件或文件夹的,无法用来读写 1.首先创建一下file的对象: 里面可以写相对路径或者绝对路径 File file new File("CCC.java"); 也可以使用其他构造方法 //String path …

【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析以及计算机网络的分类

【计算机网络】电路交换、电报交换、分组交换 目录 【计算机网络】电路交换、电报交换、分组交换1. 电路交换2. 电报交换3. 分组交换4. 基于分组交换~“虚电路交换”技术 【计算机网络】电路交换、报文交换和分组交换——三种交换方式性能分析电路交换性能分析报文交换性能分析…

在AD域中恢复被删除的账户(LDP.EXE)

在域账户被不小心删除后,客户端使用域账号登陆会失败,账号不存在; 为了客户端登陆回原来账户文件下面,重新创建一个相同账户,域中此新账号的ID是新的,客户端登陆也会按新用户生成用户文件;同样复…

只用一个 HTML 元素可以写出多少形状?——动画篇

为期一个多月,我们针对只用一个 div 元素一共可以写出多少种形状的话题,通过六个篇章(分了八篇文章)进行了详细的展开。 其中,前三个篇章,我们主要围绕欧几里得几何中的基本形状做的展开,其中蕴…

基于Matlab和OpenCV的双目测距(标定和代码教程)

基于Matlab和OpenCV的双目测距研究 *摘要*:双目测距的原理是利用左右两个摄像机拍摄同一物体形成的视差来确定物体距摄像机的距离。这其中需要通过标定得出的参数包括内参(焦距fc, 主点Principal point, 径向畸变Radial Distortion, 切向畸变Tangential…

828华为云征文 | 使用Flexus云服务器X实例部署Kubernetes图形化管理平台

828华为云征文 | 使用Flexus云服务器X实例部署Kubernetes图形化管理平台 1. 基础部署环境说明2. 部署Kubernetes环境3. 部署Kubernetes Dashboard4. 创建登录账号token5. 访问Kubernetes Dashboard 1. 基础部署环境说明 Kubernetes作为当今最流行的容器编排平台,随着…