开发者社区> 问答> 正文

求Tree的Cache数据结构设计思路:报错

背景:

数据示例:中国行政区树形结构,一直到街道(乡村)

使用MySQL作为存储,字段如下:

为减少对数据库的请求量,需要将这些数据存储在Cache中,比如Redis、Memcache等。

大家可以忽略level、usetype、path字段

操作:

  • 需要快速读取出「北京」下的所有「后代元素」
  • 需要快读读取出「XXX街道」的所有「父级」
  • 需要快速读取出某AID的数据
  • 需要快速的修改、移动、更换父级
  • 需要插入数据
  • 以上MySQL的语句都可以做到,read more大家可以移步http://www.oschina.net/code/snippet_260395_9607

问题:

如果存储整表到一条Cache中,这是最省事的方法,如果仅仅是浪费内存空间则是其次,

主要问题是网页(PHP)需要每次都去读取如此大的数组,然后再解析、读取、取用。

如果访问庞大的情况下,每次占用的内存是非常可观的,当然使用「共享内存」的方式,肯定是最好的方式,但是条件不太允许。

猜想方案:

  • 有无noSQL成熟方案已经解决上述问题
  • 将MySQL数据导入「内存」临时表,仍然使用数据库作为主操作方式
  • 设计一种数据结构,保证
    • 分隔成多个独立小块存储到Cache
    • 每一块占用空间少(这样方便内存的清理),减少访问量大时的内存占用
    • 能快速找到对应的ID、ID的子、孙(后代)、父级等
    • 能快速的修改对应ID的数据(修改数据之后能快速同步到Cache中)
    • 移动某节点到新父级之后,能快速更新Cache
    • 保证排序
    • 查找复杂程度低,减少需要载入的次数

有没从事过相关数据结构研究的朋友?

给个结构的思路,如果实现了肯定共享代码!

我的思路是:

所有的ID按照Tree结构建立一个索引(比如HashMap方式,查找快),如果有移动、删除等操作更改,更新整个索引

将名称等其它数据按照Tree结构分块存储(这块暂时没有好的思路,但是需要尽量减少载入次数,比如可以将一些有关系的数据放在一起,便于更新和读取Cache)


展开
收起
kun坤 2020-06-06 15:33:10 845 0
1 条回答
写回答
取消 提交回答
  • 节点毕竟还是有限的,我的做法是把所有节点都一次性取出来成为一个 List,然后在程序里根据节点之间的父子关系变成 Tree。

    这样的缓存做起来非常简单,缓存 List 就好了

    ######这点我考虑过,但是因为数据过于庞大,单PHP线程(也就是用户访问一次),就需要加载整个数据,就是都要无故增加这样无聊的读取、解析、内存占用成本。 对于一些小型的数据,可以一次性写入Cache,大的真不能!###### 假如考虑nosql解决方案,neo4j可能比较适合这种节点形式的数据处理,毕竟是个图数据库######嗯?######

    可以参考淘宝  省市区 直接前端list   街道数据 nosql 查询

    ######按节点层级分别存储,访问A级节点就加载A级的子节点(不加载子孙节点),其他一样,另外,中间再使用缓存,访问顺序:缓存->db,每次有新的节点就加入缓存,定时更新缓存,释放空间,当然使用NoSQL作为DB会更好些。实话说,数据真心不大######这个得关注一下!
    2020-06-06 15:33:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
如何使用Tair增强数据结构构建丰富在线实时场景 立即下载
Apache Flink 流式应用中状态的数据结构定义升级 立即下载
低代码开发师(初级)实战教程 立即下载