一种基于二叉平衡树的SessionCache方法

文档序号:6555513阅读:261来源:国知局
专利名称:一种基于二叉平衡树的SessionCache方法
技术领域
本发明涉及计算机软件技术领域,尤其涉及一种SessionCache方法,特别涉及一种基于二叉平衡树的SessionCache方法。
背景技术
在服务器设计中,经常会遇到各种需要和时间相关的有效性判断,例如,用户登录某个网页时获得的有效Session只能在一定时间范围内有效,在超过一定时间过后,必须清除。
如何有效Session是否还有效,并对无效的Session进行删除,通常采用以下几种方式1、Hash表(哈希表)这种方式采取的方式是使用索引来作为Search的关键字,从而能够快速的查找到节点,同时将节点的创建时间保存在节点中,从而在Search到保存在节点的数据的时候,能够对节点的有效性(主要是时间有效性)进行判断,Hash算法查找速度最快,满足了速度和超时的有效性。但是由于过期节点数据往往无法采取一种有效的方法来清除(因为每个过期节点都需要通过扫描来判断,这在多线程的环境下非常不可取),因此这容易堆积了大量无用的节点,从而浪费大量的内存.
2、AVL树(二叉平衡树)
二叉平衡树AVL是一种针对查找优化的算法,它的优点是查找速度非常快,同时由于只是保存存在的节点,因而能最大可能地节省内存,但在SessionCache应用中,同样存在无法有效清除失效节点的原因。因为AVL树也同样存在着不能有效删除失效节点的问题,因此删除失效节点对于AVL树来说是一种代价很高昂的操作.
上述所提到的方式中,用Hash(哈希表)表方式需要预先分配节点,占用大量的内存,同时过期节点不能有效的清除。而用AVL树(二叉平衡树)方式则会出现过期节点不能有效的清除的情况。所以,需要一种有效的方案来解决这个问题。

发明内容
本发明的目的是提供一种基于二叉平衡树的SessionCache方法.,该方法结合AVL树的特点,用来解决在服务器中,经常遇到的由于有时间限制的有效性判断而引发的过期节点不能有效删除的问题。
本发明的目的可以通过以下技术方案来实现一种基于二叉平衡树的SessionCache方法,该方法是采用至少两棵以上的二叉树来保存节点,根据时间作为节点,把整个SessionCache的所有保存的节点按照时间段分为至少两段以上,前一颗树上保存了前一个时间段内生成的所有节点,后一棵树上保存了后一段时间生成的所有节点;在搜索到节点时,通过比较所有树上保存节点的创建时间与当前时间之间的比值,判断所有树上的保存的节点是否过期,若某棵树上保存的节点过期,则删除该棵树上保存的节点即可。
本发明的有益效果为本发明方法有效结合AVL树查找数据快,有效利用内存的特点,同时摒弃了二叉树删除其中节点效率低下的缺点,从而达到速度和效率结合的要求。本发明查找的时候需要查找所有树,因为有效节点可能位于所有树上,查找到节点的时候,本发明方法可以结合节点的创建时间与当前时间来准确判断该节点是否过期。对于过期节点,也只需对节点做标记而无需做任何树删除节点处理,因为到树过期后,它会自动随着树的删除自动删除。由于AVL树有一个特点,删除整棵树同样非常有效率,因此,本发明的方法节约了大量的内存。


图1表示Timeout时间为5分钟的Session Tree结构示意图。
具体实施例方式
为使本发明实现的技术手段、创作特征、达成目的与功效易于明白了解,下面结合具体实施方式
,进一步阐述本发明。
一种基于二叉平衡树的SessionCache方法,该方法是采用两棵二叉树来保存节点,根据时间作为节点,把整个SessionCache的所有保存的节点按照时间段分为两段,第一颗树上保存了前一个时间段内生成的所有节点,后一棵树上保存了后一段时间生成的所有节点;例如假设整个SessionCache的过期时间是5分钟,这样第一棵树将保存了前5分钟的数据,在5分钟后,数据将会保存在另外一棵树上,这样就以时间分割的角度将两个时间段的节点分别划分到两棵树上,因此,假设第11分钟生成的节点时,其中一颗树上保存的节点将全部是过期节点(因为它们都是在0-5分钟内生成的),这样只需要删除整个树即可,AVL树有一个特点,删除整棵树同样非常有效率。
因此本发明方法有效结合AVL树查找数据快,有效利用内存的特点,同时摒弃了二叉树删除其中过期节点效率低下的缺点,从而达到速度和效率结合的要求。
而查找的时候需要查找两棵树,因为有效节点可能位于两棵树上,查找到节点的时候,可以结合节点的创建时间来准确判断该节点是否过期。过期节点我们也只需对节点做标记而无需做任何树删除节点处理,因为到树过期后,它会自动随着树的删除自动删除.
参见图1,为了更好的说明本发明,下面结合附图详细说明本发明方法的实施例。
在实施例中,本发明使用一个SESSION_CACHE的结构来代表这个复合结构.以下就是这个结构的组成typedef struct _SESSION_CACHE{Avlnode *first;time_t first_ctime;Avlnode*second;time_t second_ctime;time_t interval;#ifdef USEMMint lock;#elsepthread_mutex_tlock;
#endi}SESSION_CACHE;上述程序段中,SESSION_CACHE有两个成员,first Tree和second Tree。这里,first是第一棵AVL树,second是第二棵平衡树,interval是时间间隔,first_ctime是第一个树所建立的时间,second_ctime是第二棵树建立的时间。Timeout时间为5分钟的Session Tree结构,Lock是在多线程或者多进程环境下的互斥锁.
在实施插入节点的操作过程中,本发明的方法先查看first树的创建时间,如果first树的创建时间还在有效期之内,那就直接将节点插入到first树中,并将First交换到Second,然后新建First树,然后将节点插入到First树中。
如果过期,则删除second树,因为second树全部都是由first交换过去的,也就是second树保存的节点总是当前first树前一个interval时间段的节点,并将first赋值到second树。以下为该操作所实施过程中的程序语言if((nowtime-(cache->first_ctime))>(cache->interval)){avl_free(cache->second,(AVL_FREE)eavl_free);cache->second=cache->first;cache->first=NULL;cache->first_ctime=nowtime;}等上述过程结束后,再插入新建节点到first树。
在实施查找节点的操作过程中,该方法先查first树,在first树节点查不到的情况下,再搜索second树.以下为该操作所实施过程中的程序语言pentry=avl_find(cache->first,&entry,eavl_compare);if(pentry==NULL)
{pentry=avl_find(cache->second,&entry,eavl_compare);}if(pentry){if((nowtime-pentry->last_access_time)>cache->interval){// The Node Has Expiredreturn SEARCH_FAIL;}else{//The Node In Valid Time,It Is Valid}}。
在搜索到节点的时候我们总是比较节点的创建时间与当前时间的比值来确定节点是否准确过期.由于在插入节点的处理,因此树中不会保存太多过期的节点.
综上所述,对于本领域内的一般技术人员,不花费创造性的劳动,在上述实施例的基础上能够做多种变化,同样能够实现本发明的目的。但是,上述各种变化显然应该在本发明的权利要求书的保护范围内。
权利要求
1.一种基于二叉平衡树的SessionCache方法,其特征在于,该方法是采用至少两棵以上的二叉树来保存节点,根据时间作为节点,把整个SessionCache的所有保存的节点按照时间段分为至少两段以上,前一颗树上保存了前一个时间段内生成的所有节点,后一棵树上保存了后一段时间生成的所有节点;在搜索到节点时,通过比较所有树上保存节点的创建时间与当前时间之间的比值,判断所有树上的保存的节点是否过期,若某棵树上保存的节点过期,则删除该棵树上保存的节点即可。
全文摘要
一种基于二叉平衡树的SessionCache方法,其是采用至少两棵以上二叉树来保存节点,根据时间作为节点,把整个SessionCache的所有保存的节点按照时间段分为两段以上,前一颗树上保存了前一个时间段内生成的所有节点,后一棵树上保存了后一段时间生成的所有节点;在搜索到节点时,通过比较所有树上保存节点的创建时间与当前时间之间的比值,判断所有树上的保存的节点是否过期,若某棵树上保存的节点过期,则删除该棵树上保存的节点即可。本发明有效结合AVL树查找数据快,有效利用内存的特点,同时摒弃了二叉树删除其中节点效率低下的缺点,从而达到速度和效率结合的要求,解决了在服务器中,经常遇到的由于有时间限制的有效性判断而引发的过期节点不能有效删除的问题。
文档编号G06F17/30GK101089810SQ200610027658
公开日2007年12月19日 申请日期2006年6月13日 优先权日2006年6月13日
发明者张继军, 郑朝晖 申请人:上海海加网络科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1