一种基于高速缓存的url分类方法和设备的制作方法

文档序号:6374251阅读:155来源:国知局
专利名称:一种基于高速缓存的url分类方法和设备的制作方法
技术领域
本发明涉及一种基于高速缓存的URL分类方法和设备。
背景技术
上网行为管理指帮助互联网用户控制和管理对互联网的使用,包括对网页访问过滤、网络应用控制、带宽流量管理、信息收发审计、用户行为分析等。URL分类是上网行为管理中的一个主要技术。对于一个给定的URL,现有的分类技术需要经过多次MD5哈希运算和数据库查询操作,才能确定其对应的分类。现有的URL分类技术存在两个缺点,一是MD5哈 希运算占用过多CPU资源,经过使用Oprofile评测工具对URL分类操作进行分析,发现MD5运算占据URL分类的1/3时间;二是数据库查询性能不能满足高性能URL分类的要求,随着URL分类数据库规模的扩大,数据库查询性能下降,URL分类的性能将不能满足上网行为设备的需求。经过对一段时间内的共计198118452次URL访问的统计分析,发现绝大部分的URL访问请求是针对小部分的URL进行的,其中,对排名前100000的URL访问次数的总和占总的URL访问次数的83. 47%。通过这个统计数据来看,如果把这部分经常访问的URL分类结果保存在缓存中,就可以减少绝大部分的URL分类操作的MD5哈希运算和数据库查询操作,从而提高URL分类整体的性能。缓存技术是一种通用的技术,从CPU上的L1、L2、L3缓存,到磁盘控制器上的缓存,到操作系统中的文件缓存、到数据库中的各种缓存、到互联网上的Cache Server等等,应用非常广泛,目的都在于用空间换取时间。简言之,如果获取某项数据的开销很大,那么在获取数据后把它暂存一段时间以便能够在后续操作中继续使用它。这样,可以减少后续操作获取这些数据的开销,从总体上看缓存系统能够起到这样的作用,提高数据获取速度。在URL分类缓存方面,现有技术中存在使用TRIE树结构的缓存方法,URL以TRIE树结构组织,在每个树节点存储一个URL字符,从树根到叶子节点的路径对应于一个完整的URL,缓存查询就是从根节点开始递归匹配URL中的字符直至叶子节点的过程。这种分类机制可以表述为,接收到URL分类请求后,首先查询一个小的常用的URL分类数据库,如果没有查到,则查询TRIE树缓存。在查询TRIE树时,如果没有匹配的URL,则调用URL分类接口,对URL进行MD5运算,然后查找数据库,如果在数据库中找到URL对应的分类,则在TRIE树中创建新的节点,保存URL分类结果。TRIE树有容量限制,在每次开始查询TRIE树时,首先检测TRIE树容量是否超过限额,如果超过限额则启动TRIE树淘汰过程,使用LRU算法淘汰不常用的节点。在完成TRIE树淘汰过程后再开始进行查询操作。为了减少标准TRIE树节点分支表的内存占用,因为URL中只使用数字、英文字母和部分特殊字符,通过使用多级映射表把TRIE树节点分支表减小为7个分支,减少了 TRI E树的内存占用。TRIE树结构的缓存不支持多线程并发查询,不支持更新操作,查询性能在5万条/秒左右。现有的URL分类和TRIE树缓存有下列缺点只对主URL数据库进行了缓存,没有对常用的URL数据库进行缓存,在查询TRIE树缓存前需要先查询ー个小的快速分类数据库,而查询这个数据库时也需要进行多次MD5运算。使用缓存并没有减少MD5运算量;TRIE树每个节点只存储ー个字符,需要进行多次分支跳转才能完成URL的查找;缓存淘汰逻辑在查询路径实现,影响查询性能;使用时间戳来标识节点的最近访问,开销较大;查询性能随着TRIE树中缓存的URL数量的增加而下降;查询接ロ不是线程安全的;没有提供増加、删除缓存记录的接ロ ;为了压缩标准TRIE树内存占用而引入的多级映射表技术过于复杂,影响查询性能。

发明内容
本发明的目的是提供ー种能够解决上述问题的基于高速缓存的URL分类方法和设备。在第一方面,本发明提供了一种基于高速缓存的URL分类方法,所述高速缓存中存储索引树,所述索引树的树节点中存储URL分类信息,所述方法包括对所述索引树加上用户态读-拷贝-更新(URCU)读锁;从所述索引树的根节点开始递归匹配所述树节点中 存储的URL分类信息与待分类的URL ;在所述递归匹配完成后释放对所述索引树的URCU读锁,从而确定待分类的URL的类别。在第二方面,本发明提供了一种基于高速缓存的URL分类设备,包括高速缓存存储器,所述高速缓存存储器中存储索引树,所述索引树的树节点中存储URL分类信息;对所述索引树加上用户态读-拷贝-更新(URCU)读锁的模块;从所述索引树的根节点开始递归匹配所述树节点中存储的URL分类信息与待分类的URL的模块;以及在所述递归匹配完成后释放对所述索引树的URCU读锁,从而确定待分类的URL的类别的模块。本发明通过采用RCU机制并结合高速缓存中的索引树和多级淘汰链表,支持并发URL查询和不与查询冲突的缓存更新,在不影响查询性能的情况下增加了缓存淘汰效率,降低了计算开销。


图I是根据本发明实施例的URL分类高速缓存的数据结构的示意图;图2是根据本发明实施例的基于高速缓存的URL分类查询的流程图;以及图3是根据本发明实施例的在高速缓存中添加和删除URL分类的流程图。
具体实施例方式下面通过附图和实施例,对本发明的技术方案做进ー步的详细描述。图I是根据本发明实施例的URL分类高速缓存的数据结构的示意图。在高速缓存中缓存的该数据结构包括索引树和多级LRU淘汰链表。索引树用于存储URL分类信息,从树根至树叶的路径对应ー个URL,在树枝和树叶都可以存储URL分类信息。索引树的根节点不存储字符,每个叶节点存储由ー个或多个URL字符构成的URL片段。这样,可以从根节点递归匹配树节点的URL片段和输入的URL,以进行URL的分类查询、添加和删除操作。多级LRU淘汰链表,如图中所示,分别为第一级LRU、第二级LRU、第三级LRU,一直到第η级LRU,LRU是ー种名为“最近最少使用”(Least Recently Used)的内存管理算法。每一级的LRU淘汰链表都是一个双向循环链表,即每个数据结点中都有两个指针,分别指向该结点的前驱结点和后续结点。每一级LRU淘汰链表的队头还指向下一级的LRU淘汰链表的队头。每一级淘汰链表都预定了不同的命中次数的阈值,所述命中次数是索引树中的叶节点在所述高速缓存中的被命中次数,即访问次数。命中次数通过计数器来实现,与使用时间戳来标识节点的最近访问相比开销大大减小。应当指出,也可以采用最近最少使用(Least Recently Used,LRU)之外的其他各种各样内存算法来实现多级淘汰链表。依据上述树形结构中叶节点的缓存命中次数,每个叶节点与不同级别的LRU淘汰链表中的一个结点相链接,各级淘汰链表中的结点所链接的叶节点的命中次数不超过所述命中次数阈值。如图中所示,存储URL字符“ro. baidu. com/”的叶节点被链接到第一级LRU淘汰链表中的一个结点,存储URL字符“m. js”的叶节点被链接到第二级LRU淘汰链表中的一个结点,存储URL字符baidu. com/ecom"的叶节点被链接到第三级LRU淘汰链表中的一个结点,诸如此类。例如,可以将访问次数小于10的叶子节点链接到第一级链表,访问次数小于100的被链接到第二级链表,访问次数小于1000的被链接到第三级链接,依此类推。这样,在进行缓存回收操作时,可以从最少被访问的LRU淘汰链表开始扫描,以删除其命中次数小于当前一级的淘汰链表的命中次数阈值的一个链表结点及其对应的叶节点,从而快速完成缓存回收操作;另外,在缓存回收过程中,还可以根据树节点的命中次数,调整该节点在多级LRU淘汰链表中的位置。图2是根据本发明实施例的基于高速缓存的URL分类查询的流程图。在步骤201,针对高速缓存获取用户态读-拷贝更新(user read-copyupdate,URCU)读锁,从而使得对高速缓存的读操作不需要任何锁就可以进行,但是对高速缓存的写操作需要先拷贝副本,对副本进行修改,最后在适当的时机把原数据的指针重新指向被修改的数据。“适当的时机”是指所有引用该数据的CPU都退出对共享数据的操作。在步骤202,从索引树的根节点开始递归地匹配树节点的URL片段和输入的URL。在步骤203,在输入的URL在索引树中的匹配最终完成后,释放URCU读锁。通过上述流程,可以为待分类的URL在索引树中找到相应的URL分类。图3是根据本发明实施例的在高速缓存中添加和删除URL分类的流程图。首先,在进行添加、删除URL分类的缓存维护操作时,要从内存中分配一个缓存操作请求结构,然后把这个缓存维护请求插入到无锁请求队列。如果队列中只有一个请求,则使用信号灯通知缓存维护线程开始处理;如果有多个请求,则在队列中按照排队机制等待处理。缓存维护线程被信号灯唤醒后,从无锁请求队列的队头取下一个缓存维护请求。在步骤300,判断取自无锁请求队列的缓存维护请求是缓存添加请求还是缓存删除请求。如果该缓存维护请求是缓存添加请求,流程进行到步骤301。在步骤301,从内存中分配一个新的树节点。在步骤303,在树中查找与输入的URL最长匹配的树节点,在步骤305,拷贝一份该树节点的分支表,拷贝形成的分支表为分支表副本,被拷贝的分支表为分支表正本。在步骤307,把新的树节点添加到分支表副本,其中,在新的树节点中拷贝所述输入的URL在索引树中尚未匹配的URL片段。
在步骤309,调用URCU进行树节点分支表指针替换,即高速缓存的所有读者都释放URCU读锁,高速缓存的写操作(这里所指的缓存添加)才可以进行指针替换/数据修改。在步骤311,等待ー个RCU宽限期,删除该树节点的分支表正本所占用的内存。如此完成一个树节点的添加操作。如果该缓存维护请求是缓存删除请求,流程进行到步骤302。在步骤302,查找与待删除的URL完全匹配的最后树节点。在步骤304,拷贝该最后树节点的父节点的分支表。拷贝形成的分支表为分支表副本,被拷贝的分支表为分支表正本。在步骤306,从分支表副本中删除该最后树节点。

在步骤308,调用URCU将所述父节点的分支表指针重新指向分支表副本,即高速缓存的所有读者都释放URCU读锁,高速缓存的写操作(这里所指的缓存删除)才可以进行指针替换/数据修改。在步骤310,等待ー个RCU宽限期,删除分支表正本所占用的内存,删除所述最后树节点所占用的内存。在本发明的一个实施例中,如果缓存维护请求是缓存添加请求,缓存维护线程还可以在处理该请求之前检查当前索引树中叶节点的数量。如果叶子节点的数量没有超过限额,则直接开始处理;如果叶节点的数量超过限额,则要先从多级LRU淘汰链表中删除不满足条件的叶节点及其对应的链表结点,再进行如图3中所述的缓存添加处理。同时,在检查过程中,还可以对链表结点的位置进行调整,将满足一定条件的链表结点移动到上ー级链表中。本领域技术人员应当理解,所述的删除和移动处理不一定是在缓存添加请求之前进行的,也可以定时进行以进行缓存回收和链表调整。在此,对上一段落所述的从多级LRU淘汰链表中删除不满足条件的叶节点的处理流程做更具体的描述。首先,扫描LRU淘汰链表,从第一级扫描至最高级,在每ー级链表中从队头扫描至队尾,依次检查每个链表结点所链接的树节点的访问次数。请注意,无论以何种方式定义/排列多级淘汰链表的级别,扫描顺序始终是从所链接的叶子节点的访问次数少的链表级到所链接的叶子节点的访问次数多的链表级。在扫描中,如果发现某链表结点所链接的树节点的访问次数小于那ー级链表允许的次数,则从LRU淘汰链表中删除该链表结点,然后从索引树中删除其对应的叶节点。另外,如果在扫描中发现某链表结点所链接的树节点的访问次数大于该级LRU淘汰链表允许的访问次数,则从该级LRU淘汰链表中删除该节点,然后将其插入上级LRU淘汰链表,即允许访问次数更多的LRU淘汰链表级。从上文所述可以看出,由于缓存维护操作是在单个维护线程中进行的,所有针对缓存的添加和删除操作都是串行进行的,不需要使用互斥锁;另外,缓存维护请求的入队、出队操作是在无锁队列上进行的,也不需要使用互斥锁。对索引树的更新和对树的查询是使用URCU锁来同步的,由于URCU的存在,从而允许读操作在任何时候都可以无阻碍访问数据,读-拷贝-更新的机制通过延迟写操作实现了缓存查询和缓存维护更新的同歩。因此,总体上看本发明的高速URL缓存是用无锁数据结构实现的,系统伸縮性高,系统性能随着CPU个数的增加呈线性增长。在本发明的一个实施例中,提供了一种基于高速缓存的URL分类设备。该设备包括高速缓存存储器,所述高速缓存存储器中存储索引树,所述索引树的树节点中存储URL分类信息;对所述索引树加上用户态读-拷贝-更新(URCU)读锁的模块;从所述索引树的根节点开始递归匹配所述树节点中存储的URL分类信息与待分类的URL的模块;以及在所述递归匹配完成后释放对所述索引树的URCU读锁,从而确定待分类的URL的类别的模块。所述设备还可以包括缓存维护模块,用于对所述高速缓存进行缓存维护,所述缓存维护遵循URCU机制,在所述释放对所述索弓I树的URCU读锁之后对所述索弓I树进行修改。缓存维护模块包括缓存添加模块,用于遵循URCU机制在所述高速缓存中存储的索引树上添加URL分类信息,所述添加对索引树的修改是在所述释放对所述索引树的URCU读锁之后进行的;和/或缓存删除模块,用于遵循URCU机制在所述高速缓存中存储的索引树上删除URL分类信息,所述添加对索引树的修改是在所述释放对所述索引树的URCU读锁之后进行的。遵循URCU机制在所述高速缓存中存储的索引树上添加URL分类信息的具体流程可以如下从内存中分配一个新的树节点,在所述索引树中查找与待分类URL最长匹配的树节点并拷贝所述树节点的分支表,拷贝形成的分支表为分支表副本,被拷贝的分支表为·分支表正本,把所述新的树节点添加到所述分支表副本,调用URCU将所述最后匹配的树节点的分支表指针指向所述分支表副本,等待一个RCU宽限期,删除所述分支表正本占用的内存。遵循URCU机制在所述高速缓存中存储的索引树上删除URL分类信息的具体流程可以如下在所述索引树中查找与待删除URL完成匹配的最后树节点并拷贝其父节点的分支表,拷贝形成的分支表为分支表副本,被拷贝的分支表为分支表正本,从所述分支表副本中删除所述最后树节点,调用URCU将所述父节点的分支表指针指向所述分支表副本,等待一个RCU宽限期,删除所述分支表正本占用的内存,删除所述最后树节点占用的内存。所述高速缓存存储器还可以存储一个多级淘汰链表和计数器。多级淘汰链表的各级淘汰链表可以是双向循环链表并且预定不同的命中次数阈值,索引树的各叶节点分别与所述淘汰链表的一个链表结点相链接,叶节点在所述高速缓存中的被命中次数不超过其链接的当前级链表的命中次数阈值。例如,可以将访问次数小于10的叶子节点链接到第一级链表,访问次数小于100的被链接到第二级链表,访问次数小于1000的被链接到第三级链接,依此类推。叶节点在所述高速缓存中的被命中次数通过计数器计数得到,与使用时间戳来标识节点的最近访问相比开销大大减小。在这种情况下,根据本发明的设备还可以包括通过扫描所述多级淘汰链表,根据所述被命中次数和所述命中次数阈值的关系在所述高速缓存中进行缓存回收和链表结点位置调整的模块。应当指出,可以采用诸如最近最少使用(Least Recently Used,LRU)之类的各种各样内存算法来实现多级淘汰链表。在所述高速缓存中进行缓存回收和链表结点位置调整的具体流程如下可以从最少被访问(其命中次数阈值最小)的淘汰链表开始扫描,检查所述索引树的叶节点的数量;如果所述数量超过预定阈值,则通过扫描所述淘汰链表,依次检查所述淘汰链表中每个链表结点所链接的叶节点的被命中次数;如果当前链表结点所链接的叶节点的被命中次数不超过当前级链表的命中次数阈值,则删除当前链表结点并且从所述索引树中删除当前链表结点所链接的叶节点,从而快速完成缓存回收操作;另外,在缓存回收过程中,如果发现前链表结点所链接的叶节点的被命中次数超过当前级链表的命中次数阈值,则可以将所述当前链表结点的位置移动到上ー级淘汰链表。专业人员应该还可以进ー步意识到,结合本文中所公开的实施例描述的各示例的単元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互換性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。

以上所述的具体实施方式
,对本发明的目的、技术方案和有益效果进行了进ー步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式
而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种基于高速缓存的URL分类方法,所述高速缓存中存储索引树,所述索引树的树节点中存储URL分类信息,所述方法包括对所述索弓I树加上用户态读-拷贝-更新(URCU)读锁;从所述索引树的根节点开始递归匹配所述树节点中存储的URL分类信息与待分类的URL ;在所述递归匹配完成后释放对所述索引树的URCU读锁,从而确定待分类的URL的类别。
2.根据权利要求I所述的方法,还包括 对所述高速缓存进行缓存维护,所述缓存维护遵循URCU机制,在所述释放对所述索引树的URCU读锁之后对所述索引树进行修改。
3.根据权利要求2所述的方法,其中,对所述高速缓存进行缓存维护之前先发出缓存维护请求,将所述缓存维护请求插入无锁请求队列中等待处理。
4.根据权利要求2所述的方法,所述缓存维护包括 遵循URCU机制在所述高速缓存中存储的索引树上添加URL分类信息,所述添加对索引树的修改是在所述释放对所述索引树的URCU读锁之后进行的;和/或 遵循URCU机制在所述高速缓存中存储的索引树上删除URL分类信息,所述添加对索引树的修改是在所述释放对所述索引树的URCU读锁之后进行的。
5.根据权利要求4所述的方法,其中,遵循URCU机制在所述高速缓存中存储的索引树上添加URL分类信息的步骤包括 从内存中分配一个新的树节点,在所述索引树中查找与待分类URL最长匹配的树节点并拷贝所述树节点的分支表,拷贝形成的分支表为分支表副本,被拷贝的分支表为分支表正本,把所述新的树节点添加到所述分支表副本,调用URCU将所述最后匹配的树节点的分支表指针指向所述分支表副本,等待一个RCU宽限期,删除所述分支表正本占用的内存。
6.根据权利要求4所述的方法,其中,遵循URCU机制在所述高速缓存中存储的索引树上删除URL分类信息的步骤包括 在所述索引树中查找与待删除URL完成匹配的最后树节点并拷贝其父节点的分支表,拷贝形成的分支表为分支表副本,被拷贝的分支表为分支表正本,从所述分支表副本中删除所述最后树节点,调用URCU将所述父节点的分支表指针指向所述分支表副本,等待一个RCU宽限期,删除所述分支表正本占用的内存,删除所述最后树节点占用的内存。
7.根据权利要求I所述的方法,其中,所述分类信息是URL字符,所述索引树的根节点不存储URL字符,其他树节点存储一个或多个URL字符。
8.根据权利要求I所述的方法,其中,所述高速缓存中还存储多级淘汰链表,多级淘汰链表中的各级淘汰链表是双向循环链表并且预定不同的命中次数阈值,索引树的各叶节点分别与所述淘汰链表的一个链表结点相链接,叶节点在所述高速缓存中的被命中次数不超过其链接的当前级链表的命中次数阈值,所述方法还包括通过扫描所述多级淘汰链表,根据所述被命中次数和所述命中次数阈值的关系在所述高速缓存中进行缓存回收和链表结点位置调整。
9.根据权利要求8所述的方法,其中,在所述高速缓存中进行缓存回收和链表结点位置调整的步骤包括 检查所述索引树的叶节点的数量; 如果所述数量超过预定阈值,则从命中次数阈值最小的一级淘汰链表开始扫描所述多级淘汰链表,依次检查所述淘汰链表中每个链表结点所链接的叶节点的被命中次数; 如果当前链表结点所链接的叶节点的被命中次数不超过当前级链表的命中次数阈值,则删除当前链表结点并且从所述索引树中删除当前链表结点所链接的叶节点; 如果当前链表结点所链接的叶节点的被命中次数超过当前级链表的命中次数阈值,则将所述当前链表结点的位置移动到上一级淘汰链表。
10.一种基于高速缓存的URL分类设备,包括 高速缓存存储器,所述高速缓存存储器中存储索引树,所述索弓I树的树节点中存储URL分类信息; 对所述索引树加上用户态读-拷贝-更新(URCU)读锁的模块; 从所述索引树的根节点开始递归匹配所述树节点中存储的URL分类信息与待分类的URL的模块;以及 在所述递归匹配完成后释放对所述索引树的URCU读锁,从而确定待分类的URL的类别的模块。
11.根据权利要求10所述的设备,还包括 缓存维护模块,用于对所述高速缓存进行缓存维护,所述缓存维护遵循URCU机制,在所述释放对所述索引树的URCU读锁之后对所述索引树进行修改。
12.根据权利要求10所述的设备,其中,所述缓存维护模块包括 缓存添加模块,用于遵循URCU机制在所述高速缓存中存储的索引树上添加URL分类信息,所述添加对索引树的修改是在所述释放对所述索引树的URCU读锁之后进行的;和/或 缓存删除模块,用于遵循URCU机制在所述高速缓存中存储的索引树上删除URL分类信息,所述添加对索引树的修改是在所述释放对所述索引树的URCU读锁之后进行的。
13.根据权利要求10所述的设备,其中,所述高速缓存存储器还用于存储多级淘汰链表,多级淘汰链表中的各级淘汰链表是双向循环链表并且预定不同的命中次数阈值,索引树的各叶节点分别与所述淘汰链表的一个链表结点相链接,叶节点在所述高速缓存中的被命中次数不超过其链接的当前级链表的命中次数阈值,所述设备还包括通过扫描所述多级淘汰链表,根据所述被命中次数和所述命中次数阈值的关系在所述高速缓存中进行缓存回收和链表结点位置调整的模块。
14.根据权利要求10所述的设备,还包括 计数器,用于对叶节点在所述高速缓存中的被命中次数进行计数。
全文摘要
本发明涉及一种基于高速缓存的URL分类方法和设备,所述高速缓存中存储索引树,所述索引树的树节点中存储URL分类信息,所述方法包括对所述索引树加上用户态读-拷贝-更新(URCU)读锁;从所述索引树的根节点开始递归匹配所述树节点中存储的URL分类信息与待分类的URL;在所述递归匹配完成后释放对所述索引树的URCU读锁,从而确定待分类的URL的类别。本发明通过采用RCU机制并结合高速缓存中的索引树和多级淘汰链表,支持并发URL查询和不与查询冲突的缓存更新,在不影响查询性能的情况下增加了缓存淘汰效率,降低了计算开销。
文档编号G06F17/30GK102819586SQ20121026979
公开日2012年12月12日 申请日期2012年7月31日 优先权日2012年7月31日
发明者刘立公 申请人:北京网康科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1