Total Pageviews

Wednesday, 13 February 2013

一种可用于论坛系统的缓存技术

这里说的缓存是指在Web开发中的缓存
这里就以论坛为例子进行说明,在其他的应用上,比如说文章系统、留言板等地方都可以应用这种技术
在论坛中,我们在将帖子保存到数据库的时候都希望能尽量保存帖子原貌,也就是不对用户提交的帖子进行任何修改,有UBB代码就保留UBB代码,有需 要转移的HTML标签就保留这些HTML标签。只有在输出这些帖子的内容的时候我们才将帖子中的UBB代码进行转换,HTML代码进行转义。
保留 用户帖子的原貌是很有意义的,假如以后需要进行论坛调整,我们就需要用户提交的最原始的数据了。比如说,用户提交的帖子中有一个敏感词,如果我们不保留用 户帖子的原始数据,直接把这个敏感词替换成XXOO保存到数据库里面,在将来我们想解除对这个敏感词的屏蔽的时候我们就无法恢复用户这个帖子里面的敏感词 了。
既然是在输出的时候才将用户提交的原始帖子数据进行处理,转义HTML,替换UBB标签,屏蔽关键词,这样做就要进行大量的处理,而且都是字符串处理啊,很耗时间的。那怎么办呢?
办法之一就是给帖子做缓存。
在数据库中我们建立两个字段,一个字段用来保存用户提交的帖子原始数据,另一个字段用来保存输出时候的帖子代码,这个帖子代码是已经将用户的原始帖 子进行了UBB转换,HTML转移以及关键字屏蔽的帖子数据。在保存用户的帖子的时候,首先将用户的帖子原始数据保存到第一个字段里面,接着把用户的原始 帖子数据进行UBB转换,HTML转义和关键词屏蔽,然后保存到第二个字段中。在输出帖子的时候,我们只需要直接输出第二个字段里面的数据,而不需要进行 任何的转换。
在将来我们想解除某个关键字的屏蔽,则可以使用第一个字段里面保存的用户帖子的原始数据重新生成应该输出的帖子代码,然后覆盖到第二个字段里。这一操作可以在夜深人静访问量不大的时候进行,基本不会对服务器造成影响。
其实,将这个功能扩展一下,我们还可以进一步节省服务器资源开销。比如,假设有一个帖子被屏蔽了,我们可以直接将保存这个帖子的第二个字段里面的内 容修改为“<span class="post_masked">该贴已经被屏蔽</span>”。然后,在普通用户浏览帖子的时候,我们直接输出第二个字段 里面的帖子数据;如果是斑竹浏览帖子,我们才逐一判断帖子是否被屏蔽了,有选择地将被屏蔽的帖子内容输出给斑竹。普通用户的数量是远大于斑竹数量的,这就 能省下一大笔服务器开销。
相对于生成静态HTML页面作为缓存的方法,这种方法的优势在于不必频繁重新生成应输出的数据。如果是生成静态HTML,用户每发一个帖子就要重新 生成一个HTML页面,读写磁盘的开销是很大的,还很容易生成大量磁盘碎片(如果是IIS的话。另外,SQL数据库是分配一大块磁盘作为数据库使用的空 间,不会造成传统的Windows文件系统的磁盘碎片)。磁盘碎片多了,HTML文件多了,即使是读取静态页面也会消耗一定的时间。
不过这种方法最大的缺点就是要保存大约2倍于原帖子的数据,不过如果你磁盘空间多的话那也没关系.