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

 

总结:此种方案不适合对树形结构查询。

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值