• 2008-07-14

    DJANGO中如何实现局部缓存(上) - [PYTHON/DJANGO]

    网页缓存的两种方法 :整页缓存、页内局部缓存

    整页缓存:

    适用于大多数动态网站,这类网页一旦发布,后续的主要动作就是提供浏览访问,对数据交互的需求很少,适合采用整页缓存方案。网页的整体缓存方案已经非常成熟,这方面的介绍也很多,架设方便、不需要对网站程序做改动。主要方案是upstream缓存,通过修改HTTP headers来控制网页的有效期,一般将缓存服务器架设在WEB服务器之前,对于内容类网站性能提升明显,也越来越多地被网站管理员采用。这方面的优秀产品为 squid。

    局部缓存:

    对于web2.0的网站,更注重交互性,但同时也需要考虑到访问速度,如果每次请求都需要从数据库中提取数据生成网页再返回到浏览器端,势必对数据库服务器形成较大压力,也会影响整站的访问效率。既然网页内的数据为交互式动态数据,采用整页缓存是不现实的方案,但若放弃缓存,对于优化服务器的访问效率具有不可逾越的瓶颈,无论如何优化算法,在和数据库交互阶段损失的运算时间是无法弥补的,为此我们可以尝试使用局部缓存方案。

    一个网页包含的动态数据分很多类,不同的网页又各不相同。 以这个丽江指南页面为例:

    http://www.walkr.cn/destination/丽江/

    经分析我们可以将页面的数据分为三类:

    1、登录用户信息

    2、指南概要信息

    3、和丽江相关的附加信息(照片、文章、收藏、计划、周边等,这类数据牵涉数据表查询较多,是消耗效率的主要部分)

    分析后我们发现,登录用户信息是不能进行缓存的,每个用户需要具有单独的登录信息;而指南概要信息因为每次该地点维基编辑后就跟着变动,也不适合进行缓存,或只适合进行短时间的缓存;但其他和丽江相关的附加信息则对时效性要求不高,可以允许1-2天的延迟。

    对于这样的网页我们就可以采用 局部缓存的方案,对1和2仍然采用动态数据,而仅对3数据进行缓存,既然确定了局部缓存,则接下来只考虑缓存的实现即可。

    局部缓存的实现:

    方法一:内存缓存

    当你的缓存量不大而服务器内存足够大时可以优先考虑内存缓存

    优点:速度奇快

    缺点:消耗内存,并且重启服务器后缓存丢失

    基于内存缓存的memcached是首选方案,memcached提供的API级接口可以方便地在各种程序里调用

     

    方法二:磁盘缓存

    顾名思义,将缓存数据通过IO写进硬盘进行保存,问题的关键在于多线程、线程安全、IO效率、文件存储机制等。

    实现代码见 《DJANGO中如何实现局部缓存(下)》