`
woshizn
  • 浏览: 209778 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

网络爬虫 (spider) 中 LRU算法的设计与实现

阅读更多
转自:《程序员》 文/ 洪伟铭

cache的所有位置都用双向链表链接起来,当一个位置被命中后,就将通过调整链表的指向将该位置调整到链表的头位置,新加入的内容直接放在链表的头上。这样,在进行过多次查找操作后,最近被命中过的内容就向链表的头移动,而没有被命中的内容就向链表的后面移动。当需要替换时,链表最后的位置就是最近最少被命中的位置,我们只需要将新的内容放在链表前面,淘汰链表最后的位置就是想了LRU算法。

LRU算法的实现

对象设计

对于Cache的每个位置,我们设计一个对象来储存对象的内容,并实现一个双向链表。

其中属性next和prev时双向链表的两个指针,key用于存储对象的键值,value用户存储要cache的对象本身。

我们使用hash算法来从cache中查找对象。

我们使用一个hashmap作为cache,用hashmap的检索机制来实现cache查找;并用head和last两个属性来记录链表的头和尾。并提供put(),getEntry()方法来操作该cache。

算法实现

cache的put()方法可将要缓存的内容放到cache中,在该方法中,对象调用私有方法insert(),将内容放到双向链表的头位置,如果cache满了,则将链表最后的位置淘汰掉:
pubilc boolean put(Object key,Object value){

      boolean res = false;

      HashLinkEntry en = new HashLinkEntry(key , value);

      if(map.isEmpty()) {

          this.head = en;

          this.last = en;

           map.put(en.key,en);

          res = true;

} else {

        HashLinkEntry point = this.getEntry(key);

          if(point = null) {

                  point.value = value;

             } else {

                    this.insert(en);

                    res = true;

             }

     }

     return res;

}

private void insert(HashLinkEntry en) {

             if(map.size() >= this.maxsize) {

                   HashLinkEntry lastprev = last.prev;

                   if(lastprev != null) {

                                map.remove(last.key);

                                lastprev.next = null;

                               last = null;

                               last = lastprev;

                         } else {

                                  log.error("hashlist get a null point\n" + this.toString());

                         }

            }

            map.put(en.key,en );

             ent.next = head;

             head.prev = en;

            head = en;

}

   cache的getEntry()方法可根据输入的内容键值key来查找内容是否存在于cache中,如果命中,这个内容就是最新被使用过的,就需要放到双向链表的头位置。

   结束语

    LRU算法是cache最常用的算法之一,基于双向链表的实现方式比较容易,并可满足大容量cache的需求,在对系统性能要求越来越高的今天,良好的cache算法有着非常广泛的用途和实现意义。
分享到:
评论

相关推荐

    JAVA基于网络爬虫的搜索引擎设计与实现.pdf

    "JAVA基于网络爬虫的搜索引擎设计与实现" 本文档主要讨论了基于Java的网络爬虫搜索引擎的设计和实现。以下是从该文档中提炼出的相关知识点: 一、搜索引擎概述 * 搜索引擎是指通过网络爬虫或蜘蛛来收集、处理和...

    基于Web的网络爬虫的设计与实现.pdf

    ### 基于Web的网络爬虫的设计与实现 #### 一、引言 随着互联网信息的爆炸式增长,搜索引擎成为人们获取信息不可或缺的工具。搜索引擎通过特定的策略收集、整理互联网上的信息,并提供给用户高效的信息检索服务。在...

    网络爬虫之Spider

    本项目“网络爬虫之Spider”正是基于Java实现的一个小型爬虫测试软件。 **1. Java语言基础** Java是一种面向对象的、跨平台的编程语言,以其强大的类库和良好的可移植性被广泛应用于各种领域,包括网络爬虫的开发。...

    网络爬虫Spider

    宽度优先搜索策略通常是实现爬虫的最佳策略,因为它容易实现,而且具备大多数期望的功能。但是如果要遍历一个指定的站点或者深层嵌套的HTML文件集,用宽度优先搜索策略则需要花费比较长的时间才能到达深层的HTML文件...

    spider网络爬虫 c++

    在C++中实现网络爬虫,需要掌握以下几个关键知识点: 1. **HTTP协议理解**:网络爬虫是基于HTTP/HTTPS协议与服务器交互的,因此你需要了解请求方法(GET、POST等)、请求头、状态码以及响应内容的基本结构。 2. **...

    网络爬虫的设计和实现

     网络爬虫是通过网页的链接地址来寻找网页,从网站某一个页面(设置为主页)开始,读取网页的内容,找到网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到这个网站所有的网页都...

    一个信息网络爬虫算法

    文章中提到的研究表明,探索更高效、更智能的网络爬虫算法,对于搜索引擎和相关信息服务的发展具有极其重要的意义。随着Web爬虫技术的不断进步,新的算法和优化方法将不断涌现,以应对网络环境的变化和搜索需求的...

    网络爬虫程序spider

    网络爬虫,也被称为Web Spider或Web Crawler,是一种自动浏览互联网并收集信息的程序。在信息技术领域,网络爬虫是数据挖掘的重要工具,广泛应用于搜索引擎优化、市场分析、社交媒体监控、网站性能评估等多个场景。 ...

    基于多线程的网络爬虫设计与实现.pdf

    ### 基于多线程的网络爬虫设计与实现 #### 概述 网络爬虫作为一种高效的数据抓取工具,在大数据时代扮演着极其重要的角色。通过对互联网网页内容的自动检索与下载,网络爬虫为数据挖掘、搜索引擎优化等工作提供了强...

    从零开始学Python网络爬虫_源代码,介绍爬虫Spider框架及爬虫内容

    本资源包“从零开始学Python网络爬虫_源代码”提供了学习爬虫技术的基础,特别关注了Spider框架及其在爬虫内容处理中的应用。在这里,我们将深入探讨Python爬虫的关键概念和实践技巧。 首先,理解什么是网络爬虫至...

    基于Java的强力爬虫Spiderman设计源码

    本项目是基于Java的强力爬虫Spiderman设计源码,包含223个文件,其中114个Java文件,93个XML文件,6个gitignore文件,3个Properties文件,1个LICENSE文件,1个Markdown文件,1个bak2文件,1个YAML文件,1个EXE文件和...

    python实现爬虫算法

    **Python实现爬虫算法** Python作为一种高级编程语言,以其简洁明了的语法和丰富的库支持,在网络爬虫领域中占据着重要地位。Scrapy是一个基于Python的开源框架,专为爬虫项目设计,它提供了强大的数据抓取和处理...

    一种新型网络爬虫的设计与实现

    ### 一种新型网络爬虫的设计与实现 #### 引言 随着互联网的飞速发展,万维网成为了海量信息的载体。在这个过程中,如何高效地提取并利用这些信息成为了一个重要的研究课题。搜索引擎作为一种帮助人们检索信息的...

    网络爬虫,spider

    网络爬虫,也被称为蜘蛛(Spider),是互联网上一种自动浏览和抓取网页信息的程序。它是搜索引擎背后的重要技术之一,也是数据挖掘和数据分析的重要工具。通过网络爬虫,我们可以批量获取网页上的文本、图片、视频等...

    网络爬虫 C++ Crawler Spider

    在C++中实现一个网络爬虫,需要掌握一系列的技术和概念,包括HTTP协议、HTML解析、数据存储以及多线程等。 首先,理解HTTP协议是至关重要的。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于从...

    Spider用c#实现 的爬虫算法的实现

    用c#实现 的爬虫算法的实现,并用C# while (flag == 0) { uritemp = uritext + "&start=" + intstart.ToString() + "&sa = N"; MyInfo = ""; HttpWebRequest MyPageRequest = (HttpWebRequest)WebRequest....

    网络爬虫spider

    网络爬虫,也被称为Web Spider或Web ...总的来说,网络爬虫是一个涉及网络通信、数据解析、文件处理等多个领域的复杂工程,通过编写像`spider.cpp`这样的程序,我们可以自动化地从海量的网络信息中获取我们需要的数据。

    Spider_java.zip_Java spider_java 爬虫_spider_搜索引擎 爬虫_网络爬虫

    【描述】提到的"Java spider_java 爬虫"表明这个项目是用Java语言编写的,专门设计用来抓取网络上的信息,特别是与搜索引擎相关的数据。网络爬虫是通过模拟浏览器行为,发送HTTP请求到服务器,然后接收返回的HTML...

Global site tag (gtag.js) - Google Analytics