锁定老帖子 主题:投票系统性能问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-04
madwind 写道 1、如果不用内存表,直接插数据库,数据库能否承受每秒100次的更新(而且还是带行级锁),mysql文档介绍Innodb引擎有每秒800次擦写的案例。 2、如果用内存表,用update还是插多行,因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和。 当然,这些都需要做详细的测试。。所以希望有经验的朋友贡献一下心得和经验。。。先感谢楼上的朋友。。。我的msn是duhuan_romantic@hotmail。。 这种东西应该先做,然后再做测试,不要武断地认为数据库承受不了,同步开销太大,对于投票应用来说换一种实现方式并不算困难。希望你能够拿出测试结果出来! |
|
返回顶楼 | |
发表时间:2008-12-04
madwind 写道 抛出异常的爱 写道 madwind 写道 sdh5724 写道 如果是多个服务器, 用外部的CACHE会有同步问题的。
仅仅是用计数器么 可以这么说,比如一个选项,十个人投票,需要做十次update操作,如果是直接用操作数据库,数据库自己有行级锁,但如果投票人多的话,会对数据库操作非常频繁;如果用cache,在内存里面算,就需要自己做同步,但同步的开销也不小。 只用插入操作(每个投票都作为一条记录) 把这些放到内存表中去 每一段时间进行计算, 再写入主表中 1、如果不用内存表,直接插数据库,数据库能否承受每秒100次的更新(而且还是带行级锁),mysql文档介绍Innodb引擎有每秒800次擦写的案例。 2、如果用内存表,用update还是插多行,因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和。 当然,这些都需要做详细的测试。。所以希望有经验的朋友贡献一下心得和经验。。。先感谢楼上的朋友。。。我的msn是duhuan_romantic@hotmail。。 你说的第2点,我没太看明白。我觉得“抛出异常的爱”的办法不错。 “因为投票讲究实时性,如果插多行,那投票数量得是主表+内存表的数量之和” ——为什么是这么算呢? 一方面,从内存表写入物理表时应该就是几个批处理了,不能按逐条更新那种方式计算了吧。 另一方面,内存表的读写开销不能和物理表的读写开销并列算吧,是一个等级的么? 我怀疑自己可能没太明白需求,但对你这个专题又挺感兴趣,见谅。 把如何测试设计好确实是很有必要 。 |
|
返回顶楼 | |
发表时间:2008-12-04
看看腾讯是怎么做的吧,腾讯很多新闻都有投票的,一般好新闻投票达几万到几十万不等,我今晚特意注意了一下,我隔几秒刷新一下页面,评论能多出几百.
|
|
返回顶楼 | |
发表时间:2008-12-04
感觉楼主是新手!
|
|
返回顶楼 | |
发表时间:2008-12-05
我觉得投票要求时实性很高,如果用缓存同步的方式时实性得不到保证,得不偿失。
我有个想法,为了不频繁UPDATE,当用户投票时数据库只做INSERT,然后在内存中保存投票项的各项数据总和,当用户查看投票结果时,只从内存中取出各项结果就行了。 |
|
返回顶楼 | |
发表时间: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转 从这个结果看,用内存表性能会有成倍的提升。。。当然,还需系统的模拟服务器环境再测试下。。。 |
|
返回顶楼 | |
发表时间:2008-12-05
楼主可以将你的系统负载说明一下,不然大家没有办法对症下药。
反正使用memcached肯定行 |
|
返回顶楼 | |
发表时间:2008-12-05
投票系统主要是要求时时性很高,这样就会对频繁访问数据库,而造成数据库压力,在投票时进行插入操作,这个操作要求性能不高,相信服务器和数据库都可以支持得住,只是在频繁读取时会有压力,那么可以将一些数据放入membercatch中。如果你的网站流量不是很大,也可以放在JVM中试一下。。。。。。。
对于性能除了硬件的提升就是对于缓存的操作了。。这方面好像还没出现别的解决方法。 |
|
返回顶楼 | |
发表时间:2008-12-05
如果是我来做的话 ,
存 1、写个对象池 2、把投票都放到对象池中 3、如果池满了再插入到数据库中 查 1、第一次查的话从数据库查,并放到内存池中 2、以后都直接从内存池中查 |
|
返回顶楼 | |
发表时间:2008-12-05
最后修改:2008-12-05
xwtt 写道 如果是我来做的话 ,
存 1、写个对象池 2、把投票都放到对象池中 3、如果池满了再插入到数据库中 查 1、第一次查的话从数据库查,并放到内存池中 2、以后都直接从内存池中查 放在内存里面的话,如果同时做多台服务器集群怎么办呢? |
|
返回顶楼 | |