Redis--基礎知識點--27--redis緩存分類樹

在 Redis 中存儲分類樹,通常需要選擇合適的數據結構來表現層級關系。以下是使用 字符串(String)哈希(Hash) 兩種常見方案的舉例說明,結合電商分類場景(如 電子產品 > 手機 > 智能手機 > 品牌)展開:


方案一:字符串(String)存儲路徑

數據結構設計
  • 鍵名category:path:{node_id}
    • 例如:category:path:1001
  • :完整分類路徑(用分隔符連接)
    • 例如:電子產品>手機>智能手機>蘋果
操作示例
  1. 添加分類

    # 添加根節點(電子產品)
    SET category:path:1001 "電子產品"# 添加子節點(手機)
    SET category:path:1002 "電子產品>手機"# 添加葉節點(蘋果)
    SET category:path:1005 "電子產品>手機>智能手機>蘋果"
    
  2. 查詢分類

    # 獲取蘋果的完整路徑
    GET category:path:1005  # 返回 "電子產品>手機>智能手機>蘋果"# 查詢所有手機相關分類(通過模式匹配)
    KEYS category:path:1002*  # 返回匹配的鍵(需謹慎使用 KEYS 命令)
    
  3. 刪除分類

    # 刪除蘋果分類(需同時處理其子節點,此處假設無子節點)
    DEL category:path:1005
    
  4. 遍歷分類樹

    # 查詢所有根節點(假設根節點路徑不含 ">")
    SCAN 0 MATCH category:path:* COUNT 100  # 遍歷所有鍵,過濾不含 ">" 的值
    
優缺點
  • 優點:實現簡單,路徑直觀。
  • 缺點
    • 查詢子節點需解析路徑字符串(如通過 STRSPLIT 拆分 >)。
    • 更新路徑需級聯修改所有子節點(如重命名“手機”為“移動設備”,需更新所有子節點路徑)。

方案二:哈希(Hash)存儲層級關系

數據結構設計
  • 鍵名category:node:{node_id}
  • 字段
    • name: 分類名稱
    • parent_id: 父節點 ID(根節點為 0nil
    • level: 層級深度(可選)
操作示例
  1. 添加分類

    # 添加根節點(電子產品)
    HSET category:node:1001 name "電子產品" parent_id 0 level 1# 添加子節點(手機)
    HSET category:node:1002 name "手機" parent_id 1001 level 2# 添加葉節點(蘋果)
    HSET category:node:1005 name "蘋果" parent_id 1003 level 4
    
  2. 查詢分類

    # 獲取蘋果的父節點 ID
    HGET category:node:1005 parent_id  # 返回 "1003"# 查詢手機的所有子節點(需遞歸查詢)
    # 步驟1:找到手機的節點ID(假設為1002)
    # 步驟2:查詢所有 parent_id=1002 的節點
    SCAN 0 MATCH category:node:* COUNT 100 | xargs -I{} redis-cli HGET {} parent_id | grep 1002
    
  3. 刪除分類

    # 刪除蘋果分類(需同時刪除其子節點,此處假設無子節點)
    DEL category:node:1005
    
  4. 遍歷分類樹

    # 查詢所有根節點(parent_id=0)
    SCAN 0 MATCH category:node:* COUNT 100 | xargs -I{} redis-cli HGET {} parent_id | grep 0
    
優缺點
  • 優點
    • 結構清晰,便于查詢父子關系。
    • 修改分類名稱無需級聯更新子節點(僅修改當前節點 name 字段)。
  • 缺點
    • 查詢子節點需遞歸或多次訪問 Redis。
    • 需維護 parent_idlevel 字段,增加數據一致性風險。

方案三:優化方案 - 路徑枚舉 + 哈希

結合兩種方案優點,使用 哈希存儲屬性 + 字符串存儲路徑枚舉

數據結構設計
  • 哈希category:node:{node_id} 存儲 nameparent_id
  • 字符串category:path:{node_id} 存儲完整路徑(如 電子產品>手機>蘋果)。
操作示例
  1. 添加分類

    # 添加蘋果分類
    HSET category:node:1005 name "蘋果" parent_id 1003
    SET category:path:1005 "電子產品>手機>智能手機>蘋果"
    
  2. 查詢路徑

    # 獲取蘋果的完整路徑
    GET category:path:1005
    
  3. 查詢子節點

    # 通過哈希查詢父節點 ID,再通過路徑枚舉匹配子節點
    HGET category:node:1003 parent_id  # 假設1003是智能手機的節點ID
    KEYS category:path:1003*  # 匹配所有以智能手機路徑開頭的節點
    
優缺點
  • 優點
    • 路徑查詢高效(直接通過字符串匹配)。
    • 屬性修改靈活(通過哈希單獨更新)。
  • 缺點
    • 數據冗余(同時存儲哈希和字符串)。
    • 需維護兩種數據結構的一致性。

方案四:使用 RedisJSON 存儲樹形結構

如果 Redis 版本支持 RedisJSON 模塊,可直接存儲 JSON 樹形結構:

數據結構設計
  • 鍵名category:tree
  • :JSON 對象,例如:
    {"id": 1001,"name": "電子產品","children": [{"id": 1002,"name": "手機","children": [{"id": 1003,"name": "智能手機","children": [{"id": 1004, "name": "蘋果"},{"id": 1005, "name": "華為"}]}]}]
    }
    
操作示例
  1. 添加分類

    JSON.SET category:tree . '{"id":1001,"name":"電子產品","children":[{"id":1002,"name":"手機","children":[]}]}'
    
  2. 查詢子節點

    JSON.GET category:tree $.children[0].children  # 返回手機分類的子節點
    
  3. 更新分類

    JSON.SET category:tree $.children[0].children[0].name '移動設備'  # 重命名手機為移動設備
    
優缺點
  • 優點
    • 結構自然,支持嵌套查詢。
    • 減少數據冗余(單個鍵存儲完整樹)。
  • 缺點
    • 需 Redis 版本 ≥ 4.0 且安裝 RedisJSON 模塊。
    • 修改深層節點需精確 JSON 路徑(如 $.children[0].children[0].name)。

總結與選型建議

方案適用場景優點缺點
字符串路徑簡單分類樹,查詢需求少實現簡單,路徑直觀更新路徑需級聯修改
哈希層級需頻繁查詢父子關系結構清晰,修改靈活查詢子節點需遞歸
路徑枚舉+哈希平衡路徑查詢與屬性修改路徑查詢高效,屬性修改靈活數據冗余,維護復雜
RedisJSON 樹形復雜分類樹,需嵌套查詢結構自然,支持復雜操作依賴模塊,路徑操作復雜

推薦方案

  • 簡單場景:使用 字符串路徑哈希層級
  • 中等復雜度:使用 路徑枚舉+哈希
  • 復雜場景:使用 RedisJSON 樹形(需確保環境支持)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80043.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++】匯編角度分析棧攻擊

棧攻擊 介紹原理示例代碼匯編分析 介紹原理 核心原理是通過 緩沖區溢出(Buffer Overflow) 等漏洞,覆蓋棧上的關鍵數據(如返回地址、函數指針),從而改變程序執行流程; 在 C 中,每個…

訪問 Docker 官方鏡像源(包括代理)全部被“重置連接”或超時

華為云輕量應用服務器(Ubuntu 系統) 遇到的問題是: 🔒 訪問 Docker 官方鏡像源(包括代理)全部被“重置連接”或超時了,說明你這臺服務器的出境網絡對這些國外域名限制很嚴格,常見于華…

Java語言

本文來源 : 騰訊元寶 Java是一種面向對象、跨平臺的高級編程語言,最初由Sun Microsystems(現為Oracle公司所有)于1995年推出,廣泛應用于Web開發、移動應用、大數據處理、嵌入式系統等領域。以下是其核心特點和應用概述…

無償幫寫畢業論文(看不懂的可以私信博主)

以下教程教你如何利用相關網站和AI免費幫你寫一個畢業論文。畢竟畢業論文只要過就行,脫產學習這么多年,終于熬出頭了,完成畢設后有空就去多看看親人好友,祝好! 一、找一個論文模板 廢話不多說,先上干貨Ov…

python打卡day26

函數、參數、變量 知識點回顧: 函數的定義變量作用域:局部變量和全局變量函數的參數類型:位置參數、默認參數、不定參數傳遞參數的手段:關鍵詞參數傳遞參數的順序:同時出現三種參數類型時 def function_name(parameter…

LeetCode 熱題 100 437. 路徑總和 III

LeetCode 熱題 100 | 437. 路徑總和 III 大家好,今天我們來解決一道經典的二叉樹問題——路徑總和 III。這道題在 LeetCode 上被標記為中等難度,要求計算二叉樹中節點值之和等于給定目標值 targetSum 的路徑數目。 問題描述 給定一個二叉樹的根節點 ro…

vue3學習-局部使用vue框架案例

目錄 局部使用vue框架步驟 簡單案例1 簡單案例2【 結構化賦值語法】 簡單案例3【使用模塊化開發模式】 基本數據的簡單應用,對象的簡單應用 數組的簡單應用 局部使用vue框架步驟 1 引用 vue框架的核心文件和 涉及ES6語法的文件 注意:這里文件&am…

初識Linux · IP分片

目錄 前言: IP分片 分片vs不分片 如何分片 分片舉例 三個字段 前言: 前文IP協議上和IP協議下我們已經把IP協議的報頭的大多數字段介紹了,唯獨有三個字段現在還有介紹,即16位標識,8位協議,13位片偏移…

u3d 定義列表詳細過程

層級結構 - Canvas - Scroll View - Viewport - Content (Vertical Layout Group) - Item1 (Prefab) - Item2 (Prefab) ... 詳細設置步驟 1. 創建 Canvas 2. 添加 Scroll View 組件 3. 在 Scroll View 下創建 Content 子對象 4. 添加 …

產品方法論與 AI Agent 技術的深度融合:從決策智能到價值創造

一、引言:智能化時代的產品范式革命 在數字化轉型的深水區,產品開發正經歷著從 “功能定義” 到 “體驗設計” 再到 “智能演化” 的范式躍遷。麥肯錫 2024 年報告指出,采用 AI 驅動產品方法論的企業,新品研發周期平均縮短 40%&a…

力扣.1471數組的k個最強值,力扣.1471數組的k個最強值力扣1576.替換所有的問號力扣1419.數青蛙?編輯力扣300.最長遞增子序列

目錄 力扣.1471數組的k個最強值 力扣1576.替換所有的問號 力扣1419.數青蛙?編輯 力扣300.最長遞增子序列 力扣.1471數組的k個最強值 class Solution {public static int[] getStrongest(int[] arr,int k) {if(karr.length){return arr;}int []retnew int[k];int narr.lengt…

使用docker安裝clickhouse集群

1、簡介 clickhouse 作為大數據場景中,實現快速檢索的常用列式存儲數據庫,采用物理機部署,會在數據量大的場景中,物理機器存儲達到閾值需要擴容,會帶來比較大的問題,因此,使用docker部署clickho…

package-lock.json能否直接刪除?

package-lock.json能否直接刪除? package-lock.json 生成工具:由 npm 自動生成。 觸發條件:當運行 npm install 時,如果不存在 package-lock.json,npm 會創建它;如果已存在,npm 會根據它精確安…

如何在 Windows 命令提示符中創建多個文件夾和多個文件

如何在 Windows 命令提示符中創建多個文件夾和多個文件 雖然大多數用戶習慣使用 Windows 圖形界面來創建文件夾,但如果你需要一次性創建多個文件夾或文件,如同在類Unix系統中可以使用mkdir和touch命令一樣,windows下也有創建目錄和文件的對應…

leetcode - 滑動窗口問題集

目錄 前言 題1 長度最小的子數組: 思考: 參考代碼1: 參考代碼2: 題2 無重復字符的最長子串: 思考: 參考代碼1: 參考代碼2: 題3 最大連續1的個數 III: 思考&am…

Ubuntu20.04下如何源碼編譯Carla,使用UE4源碼開跑,踩坑集合

一、簡介 作為一個從事算法研究的人員,無人駕駛仿真一直是比較重要的一部分,但是現在比較常見的算法驗證都是在carla這個開源仿真平臺上做的,所以我有二次開發carla的需求,今天就來講講編譯CARLA。 網上的教材很多,但還是推薦大家看官網教程:Linux build - CARLA Simul…

Linux云計算訓練營筆記day09(MySQL數據庫)

Linux云計算訓練營筆記day09(MySQL數據庫) 目錄 Linux云計算訓練營筆記day09(MySQL數據庫)外鍵約束數據的導入和導出數據的導出數據的導入 DQL 數據查詢語言查指定字段查所有字段where 過濾條件and 和 orin 和 not inbetween...an…

對心理幸福感含義的探索 | 幸福就是一切嗎?

注:機翻,未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切嗎?對心理幸福感含義的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …

零基礎學Java——第十一章:實戰項目 - 微服務入門

第十一章:實戰項目 - 微服務入門 隨著互聯網應用的復雜性不斷增加,單體應用(Monolithic Application)在可擴展性、可維護性、技術棧靈活性等方面逐漸暴露出一些問題。微服務架構(Microservices Architecture&#xff…

git 本地提交后修改注釋

dos命令行進入目錄,idea可以點擊Terminal 進入命令行 git commit --amend -m "修改內容"