我正在为一个相对较大的网站实施投票系统,我想知道应该在哪里存储投票数。主要问题是将它们存储在主数据库中会给它带来很大的压力,因为 MySQL 不太擅长处理大量简单的查询。
到目前为止,我最好的选择是使用memcached
它,因为它似乎非常适合这项任务(非常快速且面向键/值)。这个解决方案的唯一问题是它memcached
是非持久性的,并且没有简单的方法来保存这些值。
是否有专门为此任务设计的东西,最好是使用 Python 后端?
你能接受某种程度的选票损失吗?如果是这样,您可以做一个混合解决方案。每模 100(10,某物),用当前memcache
值更新 SQL 数据库。如果需要,您还可以定期扫描和更新脚本。
我刚刚运行了这个,这基本上是sqlite
文档中的示例,除了插入 5000 行:
import time
import sqlite3
conn = sqlite3.connect('example')
c = conn.cursor()
# Create table
c.execute('''create table stocks
(date text, trans text, symbol text, qty real, price real)''')
print time.time()
for i in xrange(5000):
# Insert a row of data
c.execute("""insert into stocks
values ('2006-01-05','BUY','RHAT',100,35.14)""")
# We can also close the cursor if we are done with it
# Save (commit) the changes
conn.commit()
c.close()
print time.time()
在我的笔记本电脑上的十分之四秒内。
绝大多数时间都花在了数据库提交上。因此,只要您不经常提交数据库(每隔几秒或更短一次),SQLite 就可以轻松处理每秒 5000 个投票的负载。
每分钟 4000 票根本不会分阶段进行,只要您在每次投票后都没有承诺。
MySQL 不太擅长处理大量简单的查询
您的 MySQL 服务器中可能有一些严重错误的配置。MySQL 应该能够轻松地每分钟处理 4000 个查询。MySQL 的基准测试每秒处理超过 25k 的 INSERT。
你可以看看CUBRID。我还没有尝试过,但它看起来很有希望,他们宣传几乎 100% 的 MySQL 兼容性,加上一些不错的东西,比如SELECT INCR(field)
Mongodb
可以很好地工作。因为它可以更快或Google App Engine
旨在扩展。
如果你喜欢 memcached 但不喜欢它不持久化数据的事实,那么你应该考虑使用 Membase。Membase 基本上是使用 sqlite 作为持久层的 memcached。它非常容易设置并支持 memcached 协议,因此如果您已经设置了 memcached,则可以使用 Membase 作为替代品。