🔥
Caster 開發日誌
  • Java
    • JVM Performance Tool
      • Java Debug Wire Protocol (JDWP) 的詳細介紹
      • JConsole 詳細介紹
    • Spring Boot
      • Spring Security
      • Spring Boot Admin
      • Spring Event
      • Spring AOP
      • Spring Boot JUnit 5
      • Apache Dubbo
    • Reflect 應用
    • ELK + F 建構
    • Socket.IO
    • OCR - 光學字元辨識
    • 讀取JAR resource文件
    • LocalTime & MySQL時間精度
    • Gradle multi module
    • MyBatis-Plus
    • Java Date operation
    • Java IP to Long
    • Apache Commons lang3 應用
      • Function 應用
    • Cloud Platform
      • Amazon S3
        • SDK V1
          • Bucket
        • SDK V2
          • Bucket
      • Google Cloud Platform
      • Azure Cloud
        • Storage
      • OVHcloud
        • Config
    • SSL/TLS工具
    • Util 工具
      • Jackson Json工具
      • Charles應用
      • JMeter – Performing Distributed Load Testing with Docker
    • Redis
      • Stream
      • Redisson 分布式鎖機制
      • Create Redis Cluster Using Docker
      • List Operations
    • Java 8
      • method & constructor Reference
      • CompletableFuture
      • FunctionInterface
      • Stream 應用
      • 繁簡轉換 - 簡易調整
    • MySQL
      • 建立測試用 流水號Table
      • SQL 效能調校 - Explain
      • SQL 效能調校 - Partition
      • 排程 - Event
    • Apache ShardingSphere
  • Kubernetes
    • 初入江湖(K8S)
    • 零中斷服務滾動更新
    • Kubernetes DNS
    • Ingress & Ingress Controller 教學
    • Ingress TLS Easy setup
  • 指令集
  • Telegram
  • SourceTree
    • 踩坑紀錄(ㄧ) - Git Flow
    • 踩坑紀錄(二) - 修改檔名
  • 專案統計
    • Robot
    • Recharge
  • GitHub
    • Actions
  • GitLab
    • 介紹 GitLab
    • 使用 Docker 自架 GitLab
    • 簡介 GitLab CI/CD
      • GitLab Runner 詳細介紹與設定方式
Powered by GitBook
On this page
  1. Java
  2. Redis

List Operations

Redis 的 List 結構是一種靈活且高效的數據結構,支持多種操作和場景。以下是一些常見的 Redis List 操作及其應用場景:

1. 消息隊列

  • 應用場景:Redis 的 List 可以用作消息隊列,實現生產者-消費者模式。生產者使用 LPUSH 或 RPUSH 將消息添加到隊列,消費者使用 LPOP 或 RPOP 從隊列中取出消息。

  • 操作:

    • LPUSH/RPUSH:將消息推送到隊列的頭部或尾部。

    • LPOP/RPOP:從隊列的頭部或尾部彈出消息。

    • BRPOP/BLPOP:阻塞地從隊列的頭部或尾部彈出消息,適合用於等待新消息的場景。

2. 任務隊列

  • 應用場景:可以用 List 存儲任務,按先來先服務(FIFO)或後進先出(LIFO)的方式處理。適用於分佈式任務處理系統。

  • 操作:

    • RPUSH:按順序將任務添加到隊列尾部。

    • LPOP:按順序從隊列頭部取出並處理任務。

3. 日誌系統

  • 應用場景:用來存儲應用程序日誌,或者其他需要按時間順序記錄的數據。每次新增日誌時,使用 LPUSH 將最新的日誌添加到列表中。

  • 操作:

    • LPUSH:將新的日誌添加到列表頭部。

    • LTRIM:只保留最新的 N 條日誌,防止列表過長。

    • LRANGE:查看最近的 N 條日誌。

4. 排行榜(Leaderboards)

  • 應用場景:如果你需要一個簡單的排行榜,可以用 List 存儲用戶 ID 或名稱,按得分排序後依次存入列表。或者可以使用 Redis 的 Sorted Set。

  • 操作:

    • LPUSH:插入新的排行榜數據。

    • LTRIM:只保留前 N 名,確保榜單的數量有限。

    • LRANGE:獲取榜單的某一段範圍的用戶。

5. 分頁數據存儲

  • 應用場景:當你的應用需要分頁顯示數據時,可以將數據存儲在 List 中,並使用 LRANGE 來實現分頁。

  • 操作:

    • LPUSH:將新數據插入列表頭部。

    • LRANGE:根據頁碼和每頁的大小,取出對應範圍的數據。

6. 過濾器

  • 應用場景:用作簡單的過濾器。例如,防止同一個用戶在短時間內多次執行相同操作,可以將用戶的操作存儲在 List 中,並檢查列表中是否已經存在該操作。

  • 操作:

    • LPUSH:記錄新的操作。

    • LRANGE:檢查近期操作記錄。

    • LTRIM:只保留最近的操作記錄。

7. 簡單的會話存儲

  • 應用場景:可以用 List 來存儲用戶的會話歷史,例如聊天記錄、操作歷史等。

  • 操作:

    • LPUSH:新增一條會話記錄。

    • LTRIM:只保留最近 N 條會話記錄。

    • LRANGE:查詢最近的會話記錄。

8. 循環緩衝區(Circular Buffer)

  • 應用場景:用於實現一個固定大小的緩衝區,例如存儲最近 N 條記錄。當緩衝區滿了後,舊的數據會被新數據覆蓋。

  • 操作:

    • RPUSH:插入新數據。

    • LTRIM:保持緩衝區的固定大小。

9. 工作流中的任務狀態管理

  • 應用場景:在一個工作流或多步驟的處理流程中,使用 List 來跟踪任務的狀態變化。

  • 操作:

    • RPUSH:記錄每一步的任務狀態。

    • LRANGE:查看整個工作流的進展。

10. 數據流

  • 應用場景:用於模擬一個數據流,每次新數據進來時插入到 List,並可以按順序消費這些數據。

  • 操作:

    • RPUSH:插入新數據。

    • LPOP:消費數據流。

Redis List 的特性

  • 雙向鏈表:Redis 的 List 本質上是一個雙向鏈表,因此可以高效地從兩端插入和移除元素(O(1))。

  • 高效的範圍查詢:使用 LRANGE 可以高效地獲取列表的子範圍,非常適合分頁場景。

  • 可以阻塞的操作:如 BLPOP 和 BRPOP,這些操作可以阻塞直到有數據可供消費,適合消息隊列或任務隊列的場景。

Redis 的 List 結構簡單而靈活,能夠支持多種應用場景,在需要順序存取、插入和移除操作的情況下尤其適用。Redis 的 List 結構是一種靈活且高效的數據結構,支持多種操作和場景。以下是一些常見的 Redis List 操作及其應用場景:

1. 消息隊列

  • 應用場景:Redis 的 List 可以用作消息隊列,實現生產者-消費者模式。生產者使用 LPUSH 或 RPUSH 將消息添加到隊列,消費者使用 LPOP 或 RPOP 從隊列中取出消息。

  • 操作:

    • LPUSH/RPUSH:將消息推送到隊列的頭部或尾部。

    • LPOP/RPOP:從隊列的頭部或尾部彈出消息。

    • BRPOP/BLPOP:阻塞地從隊列的頭部或尾部彈出消息,適合用於等待新消息的場景。

2. 任務隊列

  • 應用場景:可以用 List 存儲任務,按先來先服務(FIFO)或後進先出(LIFO)的方式處理。適用於分佈式任務處理系統。

  • 操作:

    • RPUSH:按順序將任務添加到隊列尾部。

    • LPOP:按順序從隊列頭部取出並處理任務。

3. 日誌系統

  • 應用場景:用來存儲應用程序日誌,或者其他需要按時間順序記錄的數據。每次新增日誌時,使用 LPUSH 將最新的日誌添加到列表中。

  • 操作:

    • LPUSH:將新的日誌添加到列表頭部。

    • LTRIM:只保留最新的 N 條日誌,防止列表過長。

    • LRANGE:查看最近的 N 條日誌。

4. 排行榜(Leaderboards)

  • 應用場景:如果你需要一個簡單的排行榜,可以用 List 存儲用戶 ID 或名稱,按得分排序後依次存入列表。或者可以使用 Redis 的 Sorted Set。

  • 操作:

    • LPUSH:插入新的排行榜數據。

    • LTRIM:只保留前 N 名,確保榜單的數量有限。

    • LRANGE:獲取榜單的某一段範圍的用戶。

5. 分頁數據存儲

  • 應用場景:當你的應用需要分頁顯示數據時,可以將數據存儲在 List 中,並使用 LRANGE 來實現分頁。

  • 操作:

    • LPUSH:將新數據插入列表頭部。

    • LRANGE:根據頁碼和每頁的大小,取出對應範圍的數據。

6. 過濾器

  • 應用場景:用作簡單的過濾器。例如,防止同一個用戶在短時間內多次執行相同操作,可以將用戶的操作存儲在 List 中,並檢查列表中是否已經存在該操作。

  • 操作:

    • LPUSH:記錄新的操作。

    • LRANGE:檢查近期操作記錄。

    • LTRIM:只保留最近的操作記錄。

7. 簡單的會話存儲

  • 應用場景:可以用 List 來存儲用戶的會話歷史,例如聊天記錄、操作歷史等。

  • 操作:

    • LPUSH:新增一條會話記錄。

    • LTRIM:只保留最近 N 條會話記錄。

    • LRANGE:查詢最近的會話記錄。

8. 循環緩衝區(Circular Buffer)

  • 應用場景:用於實現一個固定大小的緩衝區,例如存儲最近 N 條記錄。當緩衝區滿了後,舊的數據會被新數據覆蓋。

  • 操作:

    • RPUSH:插入新數據。

    • LTRIM:保持緩衝區的固定大小。

9. 工作流中的任務狀態管理

  • 應用場景:在一個工作流或多步驟的處理流程中,使用 List 來跟踪任務的狀態變化。

  • 操作:

    • RPUSH:記錄每一步的任務狀態。

    • LRANGE:查看整個工作流的進展。

10. 數據流

  • 應用場景:用於模擬一個數據流,每次新數據進來時插入到 List,並可以按順序消費這些數據。

  • 操作:

    • RPUSH:插入新數據。

    • LPOP:消費數據流。

Redis List 的特性

  • 雙向鏈表:Redis 的 List 本質上是一個雙向鏈表,因此可以高效地從兩端插入和移除元素(O(1))。

  • 高效的範圍查詢:使用 LRANGE 可以高效地獲取列表的子範圍,非常適合分頁場景。

  • 可以阻塞的操作:如 BLPOP 和 BRPOP,這些操作可以阻塞直到有數據可供消費,適合消息隊列或任務隊列的場景。

Redis 的 List 結構簡單而靈活,能夠支持多種應用場景,在需要順序存取、插入和移除操作的情況下尤其適用。

但是 Redis 5 引入了一個新的數據結構 Stream,這是專門為處理事件流(event streams)和消息隊列設計的。與 List 相比,Stream 提供了更多專門的功能,特別適合處理持續生成的大量數據、實時數據流和消息處理。

下面是 Stream 和 List 的對比說明:

1. 基本概念

Redis List

  • 結構:雙向鏈表。

  • 典型用途:消息隊列、簡單的 FIFO/LIFO 列表、有限數據存儲(如排行榜、最新日誌等)。

  • 操作:

    • LPUSH / RPUSH:在列表的左邊或右邊添加元素。

    • LPOP / RPOP:從列表的左邊或右邊彈出元素。

    • LRANGE:按範圍檢索元素,支持簡單的分頁操作。

    • BLPOP / BRPOP:阻塞地彈出元素,適合簡單的消息隊列。

Redis Stream

  • 結構:日志結構合併樹(Log-Structured Merge Tree,LSM Tree),類似於 Apache Kafka 的消息隊列或消息日誌系統。

  • 典型用途:實時數據流處理、消息隊列、多消費者訂閱、事件溯源。

  • 操作:

    • XADD:向流中添加消息,生成唯一的消息 ID。

    • XRANGE / XREVRANGE:按範圍檢索消息,支持按時間範圍或 ID 範圍查詢。

    • XREAD:讀取流中的消息,可以阻塞讀取,適合消費者拉取消息。

    • XGROUP / XREADGROUP:支持消費者組(consumer group),允許多個消費者安全地共享同一個流。

2. 功能對比

功能

Redis List

Redis Stream

插入

使用 LPUSH 或 RPUSH 插入元素。

使用 XADD 插入消息,帶有自動生成的唯一 ID。

刪除

使用 LPOP 或 RPOP 移除元素。

使用 XDEL 刪除指定 ID 的消息。

範圍查詢

使用 LRANGE 根據索引範圍查詢。

使用 XRANGE 或 XREVRANGE 根據 ID 或時間範圍查詢。

阻塞操作

使用 BLPOP 或 BRPOP 等待新元素插入。

使用 XREAD 阻塞等待新消息。

持久化

數據持久化依賴 Redis 的持久化配置。

持久化的數據結構,類似於消息日誌系統,內建消息 ID。

多消費者模式

不支持多消費者安全共享。

支持消費者組(XGROUP),允許多個消費者安全地共享和處理消息。

消息確認

不支持消息確認。

消費者組支持消息確認(ACK),避免消息丟失。

分區處理

沒有內建分區處理能力。

可以根據消息 ID 進行分區和多消費者組處理。

3. 應用場景

Redis List 的典型應用場景

  1. 簡單的消息隊列:

    • 用於實現生產者-消費者模式,適合簡單的任務隊列或消息隊列。

    • 例如:一個只有一個生產者和一個消費者的情況下,使用 List 是一個簡單有效的解決方案。

  2. 有限數據存儲:

    • 存儲有限的歷史記錄,如最近的日誌條目、聊天記錄、排行榜等。

    • 例如:存儲最近100條日誌,並使用 LTRIM 保持 List 的長度。

  3. 簡單的分頁處理:

    • 使用 LRANGE 根據索引範圍來實現數據的分頁展示。

Redis Stream 的典型應用場景

  1. 實時數據流處理:

    • 適合處理持續生成的大量數據,如 IoT 數據、實時日誌、交易記錄等。

    • 例如:實時收集來自多個設備的感測器數據,並對其進行處理和存儲。

  2. 多消費者消息隊列:

    • 支持多個消費者組的消息隊列,保證消息被安全消費,適合複雜的消息處理流程。

    • 例如:使用 Stream 來實現一個訂單處理系統,允許多個服務對訂單進行處理。

  3. 事件溯源和日誌系統:

    • 適合記錄事件歷史,支持事件的重放和查詢。

    • 例如:使用 Stream 來記錄用戶行為,並允許後續分析或回放。

4. 選擇指南

  • 選擇 List:如果你的應用場景比較簡單,需求僅限於 FIFO/LIFO 消息隊列、有限歷史記錄存儲、簡單的分頁顯示等場景,List 是一個簡單且高效的選擇。

  • 選擇 Stream:如果你的應用需要處理實時數據流、多消費者組消息處理、消息確認與重放、事件溯源等複雜場景,Stream 是一個更適合的解決方案。它提供了更高級的功能來管理和處理大量的消息和事件。

總的來說,Stream 是對 List 功能的一個擴展,針對實時數據流和消息處理提供了更強大的功能。如果你的應用需要更複雜的消息處理能力和多消費者支持,Stream 將是一個更好的選擇。

PreviousCreate Redis Cluster Using DockerNextJava 8

Last updated 9 months ago