+ -
当前位置:首页 → 问答吧 → 高并发论坛设计

高并发论坛设计

时间:2010-12-31

来源:互联网

大家讨论下并发量很高的论坛设计方案:
我先说下我的想法:
关于并发数很高而实事性不是很重要的网站我往往会选择页面静态化在一段时间内输出的都一样这样可以大大的减少数据库查询的压力 当然增删改是对数据库实事操作的
但是对于论坛这种实时性要非常高的网站该如何设计才合理呢
我先说下我的想法
由于我是.NET的
使用Remoting单例模式建立Wimdows服务 服务里使用 HttpRuntime.Cache 作为缓存机制 当然不止一个服务 会根据能划分的模块分多个服务每个服务维护自己的一块缓存数据 (缓存DateTable)
下面是最重要也是最难的一部分 要让缓存跟数据库里同步
比如对一个模块里数据要更新 首先要去更新缓存里的数据 类似于数据库里的触发器一样 首先要确保数据库里顺利更新了再去更新缓存  
要保证数据库里成功更新着谁都能做到 但是如何去更新缓存呢  
马上肯定会这么想 先把数据从缓存里取出来再做处理再放进去 是的 没有错但是有没有想过 在你把数据取出来做好更新操作的同时有一个会话正好更新好正在往缓存里放 而就在瞬间你正好在做刚刚的操作 你取出来的数据可能是旧的你更新成功了却丢失了刚刚的那一步操作
DateTable dt = HttpRuntime.Cache["cc"] as DateSet; 取出缓存数据
//对缓存数据做出来
HttpRuntime.Cache["cc"] = dt;
但是DateTable dt = HttpRuntime.Cache["cc"] as DateSet; 得到的却是旧的数据 你在做对这个缓存处理之后再填充
HttpRuntime.Cache["cc"] = dt;的时候就丢失了上一次更新完却还未填充的那个的数据因为在你取数据的瞬间它正在填充而没有完成 此时就造成了有些数据没有跟数据库同步  
很简单大家都会想到在取,更新数据的时候把这些数据锁住
lock(object)
{
``DateTable dt = HttpRuntime.Cache["cc"] as DateSet; 取出缓存数据
``//对缓存数据做出来
``HttpRuntime.Cache["cc"] = dt;
}
这样做虽然数据能同步了 但是大大减小的并发量 可能会造成长时间的等待
但是我看到像CSDN这种论坛在你跟帖的时候他会在5秒后才显示出来 是否为了这种等待....
当然我不知道CSDN是怎么做缓存机制的
以上只是我的一些观点  
望路过的大家来讨论讨论对于高并发而实时性又要很强的网站如何合理的实际能达到对数据库的减压

作者: 65300297   发布时间: 2010-12-31

不懂

作者: justforregister   发布时间: 2011-01-01

热门下载

更多