• 关于SbWebServer页面缓存的设计


    对于一个网站页面来说,不同的页面被访问的可能性不同,像主页被访问的概率是最大的。

    如果利用这个特点,对高访问概率的页面存入缓存,这样每次连接过来就不用每次都要经历本地找文件,打开这样一个过程。

    对于这个缓存的设计,首先考虑:

    1.主页一定是一直在缓存中的。

    2.用一个哈希表来建立filename--->文件在内存中地址的映射。

    3.用shared_ptr来指向文件地址,这样不用担心内存泄露的问题。

      所以缓存的结构为:unordered_map<string,shared_ptr<FileInfo*> >。

      FileInfo为文件相关类。

    4.FileInfo的设计:1.一个映射向内容的指针addr 2.一个文件大小的衡量size 3.一个统计度count用来统计这个页面被访问的次数。

    5.cache满后的处理:

      首先如果访问次数多了,cache就满了,如果简单的只是erase掉cache头部的FileInfo,这样如果满了后每次来一个链接都可能要erase一下,效率下降,且erase的页面是随机的,并不一定是低访问度的页面,甚至可能erase掉主页。

      因此考虑在缓存类Cache中除缓存成员cache外还加入一个堆用于对不同访问次数的页面进行排序。

      cache满后考虑同时在cache和堆中erase掉低访问度的页面,可以erase掉堆的一半。

    6.堆的处理:

      采用最大堆,这样直接删掉堆的后一半,依然仍是最大堆形式(是这样吗?)。

      可以用STL自带的堆,堆中成员扔是FileInfo*,这个堆使用自定义的仿函数来作为排序的准则,这个仿函数的设计以FileInfo中的count为度量。

      同时对FileInfo,在多线程下,当对count++时要考虑线程安全,考虑FileInfo中加入锁,当然单线程版本就不用担心这个问题了。

  • 相关阅读:
    sqlserver的排序
    tomcat虚拟目录!
    tomcat虚拟主机配置!
    深度优先搜索算法
    java是什么?
    tomcat服务器jar管理!
    广度优先搜索算法
    简单web服务器
    cascade="alldeleteorphan"时容易出现的一个异常
    Hibernate级联删除的一个错误
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11216089.html
Copyright © 2020-2023  润新知