例如現有如下樹形結構:
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
總結:此種方案不適合對樹形結構查詢。