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

  • 相关阅读:
    Photosynth Deep Zoom 3D 应用演示效果~~酷!
    Python自由之路(四)变量作用域
    Python自由之路(二)Unittest Framework
    经典绚丽的JS特效收藏
    Helloworld Structs2 注意事项
    Blend 3.0 入门之数据绑定(How to Create SampleData)
    Python自由之路(三) 多线程处理
    Nutch 1.0 完全配置笔记
    Probems for Hosted ADO.NET Data Services & Silverlight
    如何开发你的第一个Java Google App Engine 程序
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11216089.html
Copyright © 2011-2022 走看看