前一章介绍了Cache和http状态码304的技术,这属于服务器端文件缓存,使用该技术可以灵活的将每一个用户访问服务器的次数和字节数减少到最低。
不过有这样一个问题存在,就是上面的缓存都是针对单个用户的,如果该用户通常在缓存时间内只访问该文件一次,是没有效果的,因此就算这个文件每天被再多的用户访问,也起不到缓存效果,而这种情况下需要使用服务端缓存。
使用服务端缓存的理由很多,我使用的主要理由是每个页面生成对服务器性能的要求过大,因为每个页面生成的过程序需要多次访问数据库,并有可能需要从别的来源获取数据,而这些都是对性能影响很大的部分,而实际上,1000个用户访问的同一个页面,服务器返回的内容是相同的,这种情况下服务器生成1000次页面是完全不可取的,如果只在该页面初次被访问的时候生成一遍,而在一定时间内该页面被再次访问直接使用缓存,将会获得较大的服务器性能提升。
我的服务器缓存过程是这样的:当用户访问一个页面的时候(假设不考虑客户端缓存,因为本章讲的是服务端缓存),首先将该URL映射为硬盘上的的一个文件路径,检查该文件是否存在。如果存在,则检查该文件的最后修改日期,如果该文件存在并且还没有过期,则直接返回该文件内容,而不需要进行数据库操作;如果文件不存在或已经过期,则生成文件内容保存到相应的文件,再返回该文件内容。
这样做有几个好处:
1.并不是所有的文件都预先生成缓存,节省磁盘空间,而且基本上不需要手工干预
2.不需要建立缓存数据库,因为我认为,只要涉及到访问数据库,就会造成性能和稳定性问题,因为数据库可能是在另一台机器上,我记得有一次我的数据库崩溃了,而我发现当天网站70%的访问还是正常的,因为常被访问的页面已经被缓存了。
3.缓存访问快,因为判断文件是否存在和文件的时间是很快的过程,而且,在大多数的程序语言之中,直接将一个文件返回到浏览器也是很方便的过程
这样做也有几个缺点:
1.如果有人攻击或者遍历你的网站的页面,网站的所有页面会很快的被生成,硬盘的空间会急剧增加
2.缓存没有自动清除的功能,也就是说,如果要节省空间,可能需要手工执行一个程序,这个程序自动在缓存文件夹之中找到过期的文件并删除
总体上来讲,根据页面生成过程的复杂度和数据库等页面生成模块的稳定性来决定是否使用这种服务器端缓存,是很有作用的
本文作者:未知