Redis快取樹形結構

2021-08-28 15:17:41 字數 2750 閱讀 9020

例如現有如下樹形結構:

idname

path

root

root''1

node1

'root/'

11node11

'root/1/'

111node111

'root/1/11/'

112node112

'root/1/11/'

12node12

'root/1/'

2node2

'root/'

21node21

'root/2/'

211node211

'root/2/21'

22node22

'root/2/'

現採用redis快取如上資料,方案為使用hash快取具體節點資訊,使用set快取節點的子節點資訊。如下:

1. 先快取節點資訊:key:tree:  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::heirs value:

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集合,需要解析

如果需要排序,需要加上在節點加上排序欄位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

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

快取 Redis 資料結構

redis中的value有五種不同的資料結構 最簡單的redis型別,通過set key value 或者 get key 來操作此類資料,值可以是任務種類的字串 包括二進位制資料 可以保持乙個的二進位製流,但是最大長度不能超過512mb redis lists是基於linked lists實現,鍊...

快取 redis 快取穿透

哪一些因素 考慮使用redis,畢竟 redis 也要增加成本 1 熱點資料 2 讀的成本非常大 3 讀多寫少 4 對資料一致性要求 沒有那麼嚴格 可以出現資料與資料庫不一致 1 秒殺場景 3 物流查詢軌跡 熱點資料 啟用的資料是被快取到redis 當中 快取key 乙個時間點過期的時候,如果快取資...

樹形結構查詢

select id,name from select substr translate sys connect by path translate t.name,tmp tmp 2 name,t.id,t.store id from allocations t where t.store id 23...