Лучший способ хранения добавочных чисел?
Я внедряю систему голосования для относительно большого веб-сайта, и мне интересно, где мне хранить подсчет голосов. Основная проблема заключается в том, что хранение их в основной базе данных будет очень напрягать, поскольку MySQL не очень хорошо справляется со множеством простых запросов.
Мой лучший вариант - это использовать memcached
как кажется, идеально подходит для этой задачи (очень быстро и ориентирован на ключ / значение). Единственная проблема с этим решением заключается в том, что memcached
является непостоянным, и нет простого способа сохранить эти значения.
Есть что-то, что специально разработано для этой задачи, предпочтительно с бэкэндом Python?
6 ответов
Можете ли вы принять некоторую степень потери голосов? Если это так, вы можете сделать гибридное решение. Каждое по модулю 100 (10, что-то) обновляет базу данных SQL с текущей memcache
значение. Вы также можете периодически сканировать и обновлять сценарии, если это необходимо.
Я только что запустил это, что в основном 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, обрабатывающие более 25 тыс. Вставок в секунду.
Вы можете взглянуть на CUBRID. Я не пробовал, но кажется многообещающим, они рекламируют почти 100% совместимость с MySQL, а также некоторые приятные вещи, такие как SELECT INCR(field)
Если вам нравится memcached, но вам не нравится тот факт, что он не сохраняет данные, тогда вы должны рассмотреть возможность использования Membase. Membase в основном memcached с sqlite в качестве постоянного слоя. Он очень прост в настройке и поддерживает протокол memcached, поэтому, если у вас уже есть memcached, вы можете использовать Membase в качестве замены.
Mongodb
может работать хорошо. Так как это может быть быстрее или Google App Engine
был разработан для масштаба.