2008年07月13日

用Web Service做网站缓存

作者 非鱼

网站里有很多执行非常频繁的动作,比如点击每一篇文章的时候更新文章的点击数,用户在每个动作的时候更新用户的在线状态,通常在网站的流量没有大到一定程度的时候,直接执行对数据库的Update操作也没什么关系,但是如果流量大了以后,频繁的对文章表或者用户表进行更新,因为Sql Server没有列锁,只有行锁和页锁,很容易造成显示文章时候的死锁。而且用户的在线状态会在各个站点的页面上显示用户名的地方用到,读取相当频繁,而且因为是跨站点的,也不能简单的使用静态变量来解决。

想来想去,最终觉得建立一个单独的缓存服务器是最好的办法,但是这个缓存服务器用什么方式来建立,却也是个麻烦的事。最好的办法当然是自己写个Windows服务,然后通过Socket跟应用程序之间交流。但是这个开发成本很高,所以退而求其次,改用WebService的形式,只是不知道,WebService在建立连接和参数的格式转换过程中会有多大的性能损失。

其实方法也很简单,建立一个独立的站点,使用静态Dictionary变量来保存每个在线用户和需要更新点击数的文章信息,在页面刷新的时候和文章显示的时候调用WebService接口进行更新,然后用一个独立的程序定时调用一个接口将文章点击数更新到数据库里。至于在线用户信息,就不必保存到数据库里了,因为这个信息本来就没有长期保存的必要。

经过简单测试,结果还是比较令人满意的,页面的响应速度并没有受影响,但是数据库的执行语句却减少了很多,相信会大大缓解文章死锁的问题。不过使用静态变量保存需要处理好更新变量时的冲突问题,用好lock语句就是了。