存储增量数字的最佳方法?

时间:2011-08-18 18:33:40

标签: python memcached voting

我正在为一个相对较大的网站实施投票系统,我想知道我应该在哪里存储投票数。主要的问题是将它们存储在主数据库中会给它带来很大的压力,因为MySQL并不擅长处理大量简单的查询。

到目前为止,我最好的选择是使用memcached,因为它似乎非常适合这项任务(非常快速且以键/值为导向)。此解决方案的唯一问题是memcached是非持久性的,并且没有简单的方法来保存这些值。

是否有针对此任务专门设计的内容,最好是使用Python后端?

6 个答案:

答案 0 :(得分:2)

你能接受一定程度的投票损失吗?如果是这样,您可以进行混合解决方案。每个模100(10,某事),使用当前memcache值更新SQL数据库。如果需要,您还可以定期扫描和更新脚本。

答案 1 :(得分:2)

我刚刚运行了这个,除了插入5000行之外,它基本上是文档中的sqlite示例:

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票就不会分阶段。

答案 2 :(得分:2)

  

MySQL并不擅长处理大量简单的查询

您的MySQL服务器中可能存在严重错误配置的内容。 MySQL应该能够轻松地每分钟处理4000个查询。有一些MySQL的基准测试每秒处理超过25k的INSERT。

答案 3 :(得分:1)

您可以查看CUBRID。我没有尝试过,但看起来很有希望,他们宣传几乎100%的MySQL兼容性,还有一些很好的东西,比如SELECT INCR(field)

答案 4 :(得分:0)

Mongodb可以很好地工作。因为它可以更快或Google App Engine被设计为可扩展。

答案 5 :(得分:0)

如果您喜欢memcached但不喜欢它不会保留数据这一事实,那么您应该考虑使用Membase。 Membase基本上是用sqlite作为持久层的memcached。设置和支持memcached协议非常简单,因此如果您已经设置了memcached,则可以使用Membase代替。