Лучший способ хранения добавочных чисел? - PullRequest
3 голосов
/ 18 августа 2011

Я внедряю систему голосования для относительно большого веб-сайта, и мне интересно, где мне хранить подсчет голосов . Основная проблема заключается в том, что хранение их в основной базе данных будет очень напрягать, поскольку MySQL не очень хорошо справляется с множеством простых запросов.

Мой лучший вариант - использовать memcached, так как он кажется идеальным для этой задачи (очень быстрый и ориентированный на ключ / значение). Единственная проблема, связанная с этим решением, заключается в том, что memcached является непостоянным, и нет простого способа сохранить эти значения.

Есть ли что-то, специально предназначенное для этой задачи, предпочтительно с бэкэндом Python?

Ответы [ 6 ]

2 голосов
/ 18 августа 2011

MySQL не очень хорошо справляется с множеством простых запросов

Возможно, на вашем сервере MySQL что-то радикально неправильно настроено. MySQL должен легко обрабатывать 4000 запросов в минуту. Есть тесты MySQL, обрабатывающие более 25 тыс. Вставок в секунду.

2 голосов
/ 18 августа 2011

Я только что запустил это, что в основном является примером 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 голосовза минуту это вообще не будет поэтапно, если вы не делаете коммит после каждого голосования.

2 голосов
/ 18 августа 2011

Можете ли вы принять некоторую степень потери голосов?Если это так, вы можете сделать гибридное решение.Каждое по модулю 100 (10, что-то) обновляет базу данных SQL с текущим значением memcache.Вы также можете периодически проверять и обновлять сценарий.

1 голос
/ 18 августа 2011

Вы можете взглянуть на CUBRID . Я не пробовал, но кажется многообещающим, они рекламируют почти 100% совместимость с MySQL, а также некоторые приятные вещи, такие как SELECT INCR(field)

0 голосов
/ 19 августа 2011

Если вам нравится memcached, но вам не нравится тот факт, что он не сохраняет данные, тогда вы должны рассмотреть возможность использования Membase.Membase в основном memcached с sqlite в качестве постоянного слоя.Он очень прост в настройке и поддерживает протокол memcached, поэтому, если у вас уже есть memcached, вы можете использовать Membase в качестве замены.

0 голосов
/ 18 августа 2011

Mongodb может работать хорошо. Так как он может быть быстрее или Google App Engine был разработан для масштабирования.

...