使用 Redis 解決“樹”形資料的複雜查詢

發表於2017-09-04

最近因業務需要,研究了一下樹資料結果的儲存及查詢解決方案。 最初的想法是使用neo4j,可是在網上看了一下開源的不支援叢集,感覺用的人不多。

網上也查了一些 樹形結構資料儲存方案 但每種實現方案都有它的一定侷限性。

想了一短時間後,想出了下面的方案:

一、 因為複雜的查詢都由Redis來處理,所以資料庫表的設計就變得非常簡單:tree 表

| 欄位名稱 | 資料型別 | 備註說明 | | —- | —- | —- | | id | int | 主鍵 | | parent_id | int | 上級節點ID |

二、Redis的資料儲存方案:

把表的資料儲存到一個Hash表中,使用表中的id值做為此hash表的key, value值為:

程式碼實現

為了簡化測試,這裡只演示Redis相關的操作

  1. Tree 類定義
  2. 往Redis中新增測試資料:
  3. Lua 程式碼的實現

在Lua中使用遞迴時,需要使用“尾呼叫”來優化程式碼。關於尾呼叫的知識,大家可以上網去搜尋。

獲取所有子節點 get-tree-childs.lua

獲取所有子節點數目 get-tree-childs-cnt.lua

獲取所有子節點數目 get-tree-parent.lua

獲取所有子節點數目 get-tree-parent-cnt.lua

以上程式碼因為使用了“尾呼叫”,所以變得相對比較複雜

總結

此方案相對比較靈活,能支援相對比較大量的資料。

缺點:過於依賴Redis。資料同步會麻煩些,好在操作不是很複雜。

相關文章