例如现有如下树形结构:
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
总结:此种方案不适合对树形结构查询。