论坛首页 Java企业应用论坛

投票系统性能问题

浏览 16064 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-04  
madwind 写道

1、如果不用内存表,直接插数据库,数据库能否承受每秒100次的更新(而且还是带行级锁),mysql文档介绍Innodb引擎有每秒800次擦写的案例。
2、如果用内存表,用update还是插多行,因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和。
当然,这些都需要做详细的测试。。所以希望有经验的朋友贡献一下心得和经验。。。先感谢楼上的朋友。。。我的msn是duhuan_romantic@hotmail。。


这种东西应该先做,然后再做测试,不要武断地认为数据库承受不了,同步开销太大,对于投票应用来说换一种实现方式并不算困难。希望你能够拿出测试结果出来!
10 请登录后投票
   发表时间:2008-12-04  
madwind 写道
抛出异常的爱 写道
madwind 写道
sdh5724 写道
如果是多个服务器, 用外部的CACHE会有同步问题的。
仅仅是用计数器么

可以这么说,比如一个选项,十个人投票,需要做十次update操作,如果是直接用操作数据库,数据库自己有行级锁,但如果投票人多的话,会对数据库操作非常频繁;如果用cache,在内存里面算,就需要自己做同步,但同步的开销也不小。

只用插入操作(每个投票都作为一条记录)
把这些放到内存表中去
每一段时间进行计算,
再写入主表中

1、如果不用内存表,直接插数据库,数据库能否承受每秒100次的更新(而且还是带行级锁),mysql文档介绍Innodb引擎有每秒800次擦写的案例。
2、如果用内存表,用update还是插多行,因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和。
当然,这些都需要做详细的测试。。所以希望有经验的朋友贡献一下心得和经验。。。先感谢楼上的朋友。。。我的msn是duhuan_romantic@hotmail。。


你说的第2点,我没太看明白。我觉得“抛出异常的爱”的办法不错。
“因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和”
——为什么是这么算呢?
一方面,从内存表写入物理表时应该就是几个批处理了,不能按逐条更新那种方式计算了吧。
另一方面,内存表的读写开销不能和物理表的读写开销并列算吧,是一个等级的么?

我怀疑自己可能没太明白需求,但对你这个专题又挺感兴趣,见谅。

把如何测试设计好确实是很有必要
0 请登录后投票
   发表时间:2008-12-04  
看看腾讯是怎么做的吧,腾讯很多新闻都有投票的,一般好新闻投票达几万到几十万不等,我今晚特意注意了一下,我隔几秒刷新一下页面,评论能多出几百.
0 请登录后投票
   发表时间:2008-12-04  
感觉楼主是新手!
0 请登录后投票
   发表时间:2008-12-05  
我觉得投票要求时实性很高,如果用缓存同步的方式时实性得不到保证,得不偿失。
我有个想法,为了不频繁UPDATE,当用户投票时数据库只做INSERT,然后在内存中保存投票项的各项数据总和,当用户查看投票结果时,只从内存中取出各项结果就行了。
0 请登录后投票
   发表时间:2008-12-05  
pipilu 写道
madwind 写道
抛出异常的爱 写道
madwind 写道
sdh5724 写道
如果是多个服务器, 用外部的CACHE会有同步问题的。
仅仅是用计数器么

可以这么说,比如一个选项,十个人投票,需要做十次update操作,如果是直接用操作数据库,数据库自己有行级锁,但如果投票人多的话,会对数据库操作非常频繁;如果用cache,在内存里面算,就需要自己做同步,但同步的开销也不小。

只用插入操作(每个投票都作为一条记录)
把这些放到内存表中去
每一段时间进行计算,
再写入主表中

1、如果不用内存表,直接插数据库,数据库能否承受每秒100次的更新(而且还是带行级锁),mysql文档介绍Innodb引擎有每秒800次擦写的案例。
2、如果用内存表,用update还是插多行,因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和。
当然,这些都需要做详细的测试。。所以希望有经验的朋友贡献一下心得和经验。。。先感谢楼上的朋友。。。我的msn是duhuan_romantic@hotmail。。


你说的第2点,我没太看明白。我觉得“抛出异常的爱”的办法不错。
“因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和”
——为什么是这么算呢?
一方面,从内存表写入物理表时应该就是几个批处理了,不能按逐条更新那种方式计算了吧。
另一方面,内存表的读写开销不能和物理表的读写开销并列算吧,是一个等级的么?

我怀疑自己可能没太明白需求,但对你这个专题又挺感兴趣,见谅。

把如何测试设计好确实是很有必要


昨晚做了测试,结果如下:
1、循环1000次,每次批处理更新20条记录
Innodb引擎表,平均每次批处理时间是36-41毫秒
memory(heap)引擎表,平均每次批处理时间是4-5毫秒
2、做5个并发线程,每个线程同时做第1点的操作
Innodb引擎表,平均每次批处理时间是15-20毫秒
memory(heap)引擎表,平均每次批处理时间是3-5毫秒
测试环境,MySQL5.0/酷睿2双核T7300/2G内存/硬盘5400转
从这个结果看,用内存表性能会有成倍的提升。。。当然,还需系统的模拟服务器环境再测试下。。。
0 请登录后投票
   发表时间:2008-12-05  
楼主可以将你的系统负载说明一下,不然大家没有办法对症下药。
反正使用memcached肯定行
1 请登录后投票
   发表时间:2008-12-05  
投票系统主要是要求时时性很高,这样就会对频繁访问数据库,而造成数据库压力,在投票时进行插入操作,这个操作要求性能不高,相信服务器和数据库都可以支持得住,只是在频繁读取时会有压力,那么可以将一些数据放入membercatch中。如果你的网站流量不是很大,也可以放在JVM中试一下。。。。。。。
对于性能除了硬件的提升就是对于缓存的操作了。。这方面好像还没出现别的解决方法。
0 请登录后投票
   发表时间:2008-12-05  
如果是我来做的话 ,

1、写个对象池
2、把投票都放到对象池中
3、如果池满了再插入到数据库中

1、第一次查的话从数据库查,并放到内存池中
2、以后都直接从内存池中查
0 请登录后投票
   发表时间:2008-12-05   最后修改:2008-12-05
xwtt 写道
如果是我来做的话 ,

1、写个对象池
2、把投票都放到对象池中
3、如果池满了再插入到数据库中

1、第一次查的话从数据库查,并放到内存池中
2、以后都直接从内存池中查

放在内存里面的话,如果同时做多台服务器集群怎么办呢?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics