背景:
数据示例:中国行政区树形结构,一直到街道(乡村)
使用MySQL作为存储,字段如下:
为减少对数据库的请求量,需要将这些数据存储在Cache中,比如Redis、Memcache等。
大家可以忽略level、usetype、path字段
操作:
问题:
如果存储整表到一条Cache中,这是最省事的方法,如果仅仅是浪费内存空间则是其次,
主要问题是网页(PHP)需要每次都去读取如此大的数组,然后再解析、读取、取用。
如果访问庞大的情况下,每次占用的内存是非常可观的,当然使用「共享内存」的方式,肯定是最好的方式,但是条件不太允许。
猜想方案:
有没从事过相关数据结构研究的朋友?
给个结构的思路,如果实现了肯定共享代码!
我的思路是:
所有的ID按照Tree结构建立一个索引(比如HashMap方式,查找快),如果有移动、删除等操作更改,更新整个索引
将名称等其它数据按照Tree结构分块存储(这块暂时没有好的思路,但是需要尽量减少载入次数,比如可以将一些有关系的数据放在一起,便于更新和读取Cache)
节点毕竟还是有限的,我的做法是把所有节点都一次性取出来成为一个 List,然后在程序里根据节点之间的父子关系变成 Tree。
这样的缓存做起来非常简单,缓存 List 就好了
######这点我考虑过,但是因为数据过于庞大,单PHP线程(也就是用户访问一次),就需要加载整个数据,就是都要无故增加这样无聊的读取、解析、内存占用成本。 对于一些小型的数据,可以一次性写入Cache,大的真不能!###### 假如考虑nosql解决方案,neo4j可能比较适合这种节点形式的数据处理,毕竟是个图数据库######嗯?######可以参考淘宝 省市区 直接前端list 街道数据 nosql 查询
######按节点层级分别存储,访问A级节点就加载A级的子节点(不加载子孙节点),其他一样,另外,中间再使用缓存,访问顺序:缓存->db,每次有新的节点就加入缓存,定时更新缓存,释放空间,当然使用NoSQL作为DB会更好些。实话说,数据真心不大######这个得关注一下!版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。