分布式缓存memcached出现服务停掉的原因分析与处理过程(2)
解决问题
但是问题并没有真正解决,真正的问题是在添加评论时对blog_Content表FeedBackCount字段的更新。
针对这个问题,我采用一种解决方法:在插入评论时不进行Update操作,而是将评论所属的文章ID插入另外一张表中,表结构如下:
CREATE TABLE [dbo].[blog_Comment_CountLog](
[EntryID] [int] NOT NULL,
[FeedbackCount] [int] NOT NULL
)
插入评论时,进行下面的操作:
INSERT INTO blog_Comment_CountLog(EntryID,FeedbackCount)VALUES(@ParentID,1)
显然,这个插入操作速度很快。
删除评论时,进行下面的操作:
INSERT INTO blog_Comment_CountLog(EntryID,FeedbackCount)VALUES(@ParentID,-1)
那么怎么更新文章的评论数呢?
然后通过SQL Server的任务计划定时执行存储过程进行更新:
SET XACT_ABORT ON
BEGIN TRANSACTION
UPDATE [blog_Content]
SET [FeedBackCount] = [FeedBackCount]+CommentCount
FROM [CNBlogs].[dbo].[blog_Content] A
INNER JOIN
(SELECT EntryID,SUM(FeedbackCount) AS CommentCount FROM blog_Comment_CountLog GROUP BY EntryID ) AS B
ON A.ID=B.EntryID
DELETE blog_Comment_CountLog
COMMIT TRANSACTION
这样还会带来批量更新的好处,在这个任务计划的间隔时间内添加评论,如果属于同一篇文章,只要执行一次更新操作。
采用这个方法后,发表评论的性能有了明显提升,现在大家发评论可以看到评论提交的执行时间。
小结
在处理问题时,不要着急,要全面分析,把可能引起问题的因素尽量多地考虑到,在动手解决问题之前,多花些时间考虑从何处下手。
在开发中,异步是一个提高性能的有效方法。
在我们解决各种问题的过程中,从网上获得了很多启发,如果有人遇到过类似问题并分享了自己的处理经验,会节省我们很多时间。
大家遇到问题时多数会先Google一下吧,如果大家都只想着Google一下,而不去分享,这个生态链就很难维系。别人的分享帮助了你,你的分享帮助了别人,在这种互相帮助中,大家都会进步。
在刚解决一个问题的时候,是分享的最佳时期,如果此时不分享,也许就永远不会分享,分享的不仅是解决问题的方法,更是解决问题时的那种兴奋。这种兴奋是程序人生的乐趣所在!