现在我将菜单存储在 Redis 中,每个菜单项都是一个单独的条目。每个菜单项与其父菜单(1 到 1)和子菜单(1 到多个)相关联。
创建菜单项如下所示:
我创建菜单项:
HMSET menu_item:1 menu_title 主菜单
HMSET menu_item:2 menu_title 我的个人资料
HMSET menu_item:3 menu_title 我的统计
我告诉每个菜单它的“父”是谁(它总是 1)
SADD 菜单项:1:父 0
SADD 菜单项:2:父项 1
SADD menu_item:3:parent 2
我向菜单项指出他们的“孩子”是谁,如果有的话(可能有几个)
SADD menu_item:1:儿童 2
SADDmenu_item:2:儿童 3
我在这个结构中遇到的问题是:
当我想向用户显示菜单时,我需要获取其父级 == 当前用户菜单项编号的所有菜单项。为此,我使用 获取当前菜单的“子项” SMEMBERS menu_item:1:childs,例如返回,{'4','2','6'}然后我必须创建一个管道,并在内部循环中依次获取每个子项HGETALL,然后排序使用 python 编程语言生成的数组(y 每个菜单项按自己的顺序)。
问题 我是否完全正确地实现了菜单,有没有办法做得更好,例如以某种方式避免管道中的循环,您必须依次选择每个元素?其实我需要经常对存储执行如下查询(我会用SQL举例)
如何在 SQL db 中获取特定菜单项的子项:
1) SELECT * FROM `menu_items` WHERE `parent_id` = 1 ORDER BY `position` ASC
我建议将一个菜单部分的所有项目以json或类似的形式序列化为一个redis key。键本身包含它描述的菜单部分的 id。数组中每个菜单项的描述都包含它的 id 和名称,这使您可以一次显示所有部分,而无需参考其他 redis 键的名称。在菜单元素的描述中,除了其中包含的项目,还值得添加父元素的id,这将简化编辑元素本身名称的任务,因为它是在父元素中描述的。以上述方式存储的一个例子: