== '''新技术简介''' == 在应用访问数据库很频繁,数据库顶不下来的时候,我们大多数情况下会在应用与数据库之间加入缓存; 但如果是数据库没压力,SQL正常等这些情况下,应用顶不下来,那我们该怎么处理??? (PS:在这旁路缓存中,我们只讨论动态页的缓存) 在现阶段,我们暂时只有的办法是:1. 加资源进行扩充; 2. 如果程序还存在优化空间,就对程序进行相应的优化。 可不可以有一种方式:在资源不增加和应用基本不该动的情况下,进行架构的调优? 针对这样一个提问,最近诞生一个不切实际的想法:旁路缓存。 基本目标是:外部条件帮助应用生成动态链点的缓存,应用代码不需更改或只需要增加个投递功能。 基本原理为:Nginx做mc|redis的存取,用户第一次访问Nginx,Nginx进行读取mc|redis, 如果没有则留下痕迹,旁路缓存根据痕迹生成相应的缓存数据,并把相应数据存入相应的缓存中。架构图如下: ''' 团队成员''' 项目成员:欧彬 余方明 '''重要信息展示''' [[Image(http://rdtrac.pc.com.cn/2012bypasscache/attachment/wiki/WikiStart/%E6%97%81%E8%B7%AF%E7%BC%93%E5%AD%981.jpg)]] 旁路缓存分为两种方式:方法一:应用程序查完数据后投递到相应地方,相应地方的程序就会把投递过来的信息进行缓存存取。 方法二:旁路缓存生成缓存程序会从相应log中拿出相应记录,已相应访问方法生成相应缓存,然后再投递到相应地方,相应地方的程序就会把投递过来的信息进行缓存存取。 MongoDB作用:存储相应缓存key和value的信息,为删缓存提供依据,可能你会问:旁路缓存的key不是根据uri中相应参数做组合生成的么? key组成的大部分信息可以在uri的参数中找到,但不排除有特例,因为当组成的key太长的时候,我们可能对这些长做一个md5然后再进行存储, 这时候如果要删缓存的时候就是个问题了。Cache Manager System 缓存管理系统就是为应付这种情况而存在。这会产生一个问题,把大部分连点都缓存下来,那数据量是非常可观, 例如:现在dlc2中使用的key是由dlid linkid 和useragent组成,那它一个连点可以有的最大缓存数为2^3*10*2^5*2,现在不使用useragent所以key的组合为dlid和linkid, 那它一个连点可以有的最大缓存数为2^2*10*2^5*2。如何管理起这不能眼看为实(即从连点得出key)的缓存也是个要解决的问题。当然如果不存在奇怪的组合key,缓存管理系统是没存在的必要。 Redis选择:Redis除了具有mc相应的一些功能外,它还存在硬缓存,就算是发生重启缓存还不至于丢失。 用一些缓存保存时效性比较长的应用中,应该效果还不错,但需要经测试证实,在以往的测试中redis在我们的一些应用使用上并发连接不是很好--以后是在小图片缓存上进行测试过。 所需的东西介绍:nginx-1.0.10.tar.gz lua-nginx-module memc-nginx-module nginx-eval-module echo-nginx-module ngx_devel_kit lua-5.1.4.tar.gz lua-nginx-module 调用lua进行在nginx编程,主要用户做逻辑,要求功能处理(例如:组建key,对key进行md5)总体概括为使nginx具有动态动能,与之前介绍的perl-nginx-module用法相当, 但lua对使用者要求会低,更容易上手,另一方面资料会多很多,功能也会多一点。memc-nginx-module 这个是个nginx对mc处理的第三方模块(在nginx自我模块中还存在memcached模块, 但它只具有读取功能),但memc第三方模块具有增删改功能,memc_cmds_allowed get set add delete flush_all; nginx-eval-module 可以将eval里面语句动作一个子程序来进行运行然后得到相 应结果,大部分利用在proxy_passmemc_pass等;例如:我需要访问dl.pconline.com.cn然后以其body内容作为变量,就可以使用 eval $result {proxy_pass http://dl.pconline.com.cn}ngx_devel_kit 配合lua进行开发者的相应功能。echo-nginx-module 这样用来打印信息,使用这个模块可以在nginx中使用echo string 变量等进行信息的调试