`

论坛话题对象读写分离

 
阅读更多

      一个话题topic对象,有很多属性,比如:主键id、回复数replyCount、标题title、楼层数floor、浏览数views等等,相对应的,数据库里面也有一个topic表,保存这些属性字段。topic对象放在缓存里,缓存找不到,再去DB找。当topic对象有属性更改时,清空缓存,以保证数据一致性。

下面主要说说浏览数views和回复数replyCount这两个属性是怎么读写分离的,下面的"帖子"也就是"话题"的意思。

 

     对于论坛来说,一般网友只是看帖不回帖,也就是说,一个帖子对象,大多数情况下,只有views这个字段值被频繁地增加,如果每次DB里面views增加1都要清空topic缓存的话,下次找topic对象,缓存找不到,再去DB找,多少会增加服务器负担。

         

       一个改进的作法是

(1)另外建一个表,比如叫topic_counter,保存topic的主键id和总的浏览数count

(2)用一个缓冲区计数器count,每次帖子页面刷新,缓冲计数器count+1,增加缓存中topic的浏览数,而页面读取浏览数,也只是到缓存里面读

(3)帖子页刷新到一个指定的数量比如400之后,就是说缓冲区计数器count等于400的时候,把缓存中的记录直接同步到DB的topic_counter表中,然后用定时任务(独立于web程序之外的groovy脚本之类),把topic_counter表的浏览数count同步到topic表的views字段中。

或者,缓冲区计数器count刷新到400之后,把缓存中浏览数的记录写到一个文件上,然后再用定时任务同步文件的数据到topic_counter表和topic表中。定时任务可以每15分钟跑一次。

(4)最后,缓冲区计数器count重置为0,重新开始计数。

(5)页面显示浏览数的时候,可以用js后出的方式显示,以便加快页面加载速度。

        上面为了读取帖子性能增强,关于帖子浏览数的读写操作确实有点绕,也是无奈做法,当然,可能还更好的方案,暂时没研究那么深入。这个方案的帖子浏览数数据可能是不准确的,比如说断电缓存丢失什么的,对于论坛这种数据准确性要求不是很高的情况下,是可以接受的。

 

    还有,数据量大的时候,还有注意topic分表和topic_counter分表的准确性。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics