Jive源码分析:tree树形数据结构
Jive源码分析:tree树形数据结构 |
Jive是著名的open source论坛,这次我们来研究其帖子结构,论坛是由一个个帖子组成,一个帖子后跟一个或几个回帖,这是一个典型的树形结构,有枝有叶,如下:
1 树形结构的应用是非常广泛的,如目录分类系统,菜单系统等等,所以,理解了Jive的应用原理,我们就可以在我们自己的系统中灵活对付树形结构. 这里主要是谈使用关系数据库如Mysql存放树形结构数据,然后我们再在内存中将其展开;以后我们尝试使用XML来对树形结构数据的存储. Jive中有三个基本对象: 在外部,Thread和Messages一样,是作为一个独立的Object存在,可以象创建查询帖子一样创建查询它,因此数据库中对应有ThreadID。 在Thread内部,有两种办法访问它里面的messages: 1.TreeWalker 提供了一种树形结构的视图,这是我们下面要详细讨论的; 我们知道,关系数据库是不擅长存放树形结构数据的,因此,一旦使用关系数据库存放树形结构数据,以后访问查询时,免不了有N多SQL查询语句,降低了系统速度;一般最原始的解决办法是在代号上做文章,代号上分几个部分,每个部分用几位数,这种办法局限性显然很大,(可惜写这篇文章时发现就有 易趣 等著名网站使用这种办法。) 而Jive中是使用TreeWalker是将数据库中的数据在内存中建立起树形结构,同时又实现了缓冲,从而大大加快了数据的访问速度。 这里关键是它的一个util类:LongTree 就是这个类提供了对数据的树形结构建立 修改访问等功能: public final class LongTree implements Cacheable { // Pointer to next available slot. /** //新Tree,第一个元素当然存放我们提供的参数:根数据ID :rootKey /** // Create record for new key.加入数组 前后关系暂时设定为0 // Adjust references. Check to see if the parent has any children. // Finally, increment nextIndex so it's ready for next add. ........... } 从上面简单的分析LongTree的加入儿子的方法,我们大概理解这个类的原理和使用方法,让我们来看看TreeWalker是怎么使用LongTree的。 TreeWalker有个子类DbTreeWalker: 我们先看看存放树形结构数据的数据库: CREATE TABLE jiveMessage ( .... ) 我们看到其数据库主要用两个字段来指明这种树形结构数据的之间的关系。 再看看DbTreeWalker是怎么使用LongTree把存放在这个数据库中数据展现开来的。 public class DbTreeWalker implements TreeWalker { ........ private long threadID; /** ForumMessage root = thread.getRootMessage(); // Create the tree, set the root.创建一个新的Tree // Now, build the rest of the tree.建立完整这个树 。。。。。 ....... //可以很方便的得到一个帖子的父亲 //可以很方便的得到一个帖子的儿子 Jive中使用Cache技术,保证了经常访问的那些Tree能够放置在内存中,这是另外篇幅需要研究的。 总之,我们找到了一套树形结构数据+关系数据库+面向对象语言三者结合的一种办法,这种办法无论从理论上 以及实用性上,都是值得我们在实践中借鉴的。 出处:www.jdon.com |
Jive源码分析:tree树形数据结构相关推荐
- mysql源码分析——索引的数据结构
引子 说几句题外话,在京被困三个月之久,不能回家,所以这个源码分析就中断了.之所以在家搞这个数据库的源码分析,主要是在家环境齐全,公司的电脑老旧不堪.意外事件往往打断正常的习惯和运行轨迹,但这却是正常 ...
- Nginx源码分析:核心数据结构ngx_cycle_t与内存池概述
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> 核心数据结构与内存池概述 在Nginx中的核心数据结构就是ngx_cycle_t结构,在初始 ...
- JNI实现源码分析【二 数据结构】
正文 在展开深入讨论之前,先说一下Dalvik中和JNI相关的数据结构,是很有必要的. 在Object.h中定义了很多的数据结构: 0x01: 虚拟机中的对象 我们知道,Java是面向对象的,Java ...
- [flite源码分析一]常用数据结构cst_val
flite里的基础数据结构,最常见的是cst_val.这个结构设计的很巧妙. 有如下特点 最基础的数据结构,可以用于存储int,float,string,和其他对象.同样可以存放列表和树. cst_v ...
- libev源码分析(一)libev数据结构整理
这里选取的版本为最新版:libev-4.04.libev的代码很简练,除了对高效I/O模型等的封装文件,核心文件就两个:ev.h和ev.c,其中ev.c大概4000行左右.代码大量用到了宏,并且宏还嵌 ...
- 鸿蒙轻内核M核源码分析:数据结构之任务就绪队列
摘要:本文会给读者介绍鸿蒙轻内核M核源码中重要的数据结构,任务基于优先级的就绪队列Priority Queue. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列三 数据结构-任务就绪队列> ...
- 集合底层源码分析之HashMap《上》(三)
集合底层源码分析之HashMap<上>(三) 前言 源码分析 HashMap主要属性及构造方法分析 tableSizeFor()方法源码分析 Node类源码分析 TreeNode类源码分析 ...
- JNI实现源码分析【三 间接引用表】
在JNI实现源码分析[二 数据结构]的参数传递一节中,我们提到,JNI为了安全性的考虑使用了形如jobject的结构来传递参数.而jobject被表述为指针,但又不是直接指向Object的指针那么jo ...
- pppoe协议和pppd源码分析
原文链接:http://blog.chinaunix.net/uid-26675482-id-4133784.html pppoe协议简介 (一)发现(Discovery)阶段 在发现(Discove ...
- 【esp32-adf】按键服务源码分析
一.adc按键 二.源码分析 2.1 数据结构 设备集合 typedef struct esp_periph_sets {EventGroupHandle_t state_event_bits;xSe ...
最新文章
- .svn文件夹_新建SVN仓库并上传项目
- 高通linux内核目录,高通 android 源代码以及目标系统目录结构
- 内核中修改和保存defconfig的方法
- 博图如何读取mysql数据_博途使用小结:从SQL中读取数据并给变量赋值
- consul历史版本下载地址
- cassandra_Spring Boot Cassandra的第一步
- php 数据类型转换与比较
- sql 账号查询一个表查询权限_一个查询语句引发的问题以及巨型表相关操作探索与思考...
- c语言词典课程设计报告,C语言课程设计英语词典排版系统
- 【转载】通往性能优化的天堂-地狱 JOIN方法说明
- 查看loadrunner代码行号
- 一个较好的基础的数据库连接池知识
- 搭建webservice服务报错求解
- informatic对表的增量抽取机制
- 计算机程序运行异常处理,Win7电脑运行程序出现appcrash错误怎么解决?
- C语言数据结构与算法-------查找(二)哈希法
- html隐藏不占位置,css中隐藏不占空间怎么设置?
- Java调用阿里云OSS下载文件
- linux删除的快捷键
- 从raspberry pi OS 64-bit lite开始安装图形界面(icewm ,dwm)