Redis緩存樹形結構

 例如現有如下樹形結構:

id

name

path

root

Root

''

1

Node1

'root/'

11

Node11

'root/1/'

111

Node111

'root/1/11/'

112

Node112

'root/1/11/'

12

Node12

'root/1/'

2

Node2

'root/'

21

Node21

'root/2/'

211

Node211

'root/2/21'

22

Node22

'root/2/'

現採用redis緩存如上數據,方案爲使用hash緩存具體節點信息,使用set緩存節點的子節點信息。如下:

1. 先緩存節點信息:key:tree:{id}  value:屬性值

hmset tree:root name "Root" path ''

hmset tree:1 name "Node1" path 'root/'

hmset tree:11 name "Node11" path 'root/1/'

hmset tree:111 name "Node111" path 'root/1/11/'

hmset tree:112 name "Node121" path 'root/1/11/'

hmset tree:12 name "Node12" path 'root/1/'

hmset tree:2 name "Node2" path 'root/'

hmset tree:21 name "Node21" path 'root/2/'

hmset tree:211 name "Node211" path 'root/2/21/'

hmset tree:22 name "Node22" path 'root/2/'

 

2. 然後緩存節點的子節點id  tree:{parentId}:heirs value: {childId}

sadd tree:root:heirs 1     //id爲root的子節點有1,11,111,112,12,2,21,211,22

sadd tree:root:heirs 11

sadd tree:root:heirs 111

sadd tree:root:heirs 112

sadd tree:root:heirs 12

sadd tree:root:heirs 2

sadd tree:root:heirs 21

sadd tree:root:heirs 211

sadd tree:root:heirs 22



sadd tree:1:heirs 11    //id爲1的子節點有11,111,112,12

sadd tree:1:heirs 111

sadd tree:1:heirs 112

sadd tree:1:heirs 12

...

 

3. 在redis內查詢節點個數

scard tree:root:heris

 

4. 根據id查詢子節點

sort tree:root:heirs get # get tree:*->name get tree:*->path

獲取到的是List<String>集合,需要解析

如果需要排序,需要加上在節點加上排序字段orderBy

sort tree:root:heirs by orderBy get # get tree:*->name get tree:*->path

 

5. 添加節點

例如我們要在節點Node21下再添加加一個子節點Node212,redis操作步驟如下:

① 先增加節點信息:id:212  name:Node212  path:'root/2/21/'

hmset tree:212 name "Node212" path 'root/2/21/'

② 再在節點Node21下添加子節點

sadd tree:root:heirs  212         Node212是Root的子節點

sadd tree:2:heirs  212            Node212是Node2的子節點

sadd tree:21:heirs  212           Node212是Node21的子節點

 

6.刪除子節點

如何刪除一個子節點呢?例如我們要刪除子節點Node111的話,有如下步驟:

① 先檢查該節點是否存在子節點

smembers tree:111:heirs    //沒有子節點

② 然後刪除上級節點的引用

hmget tree:111 path        //先獲取Node111節點的路徑   root/1/11/

srem tree:root:heirs 111   //然後根據節點id刪除上級節點的引用

srem tree:1:heirs 111

srem tree:11:heirs 111

③ 最後刪除自己

del tree:111

 

總結:此種方案不適合對樹形結構查詢。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章