例如現有如下樹形結構:
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...