关于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中加入锁,当然单线程版本就不用担心这个问题了。

原文地址:https://www.cnblogs.com/lxy-xf/p/11216089.html