2011-01-20 2 views
4

Следуя некоторым другим вопросам SO, я разрабатываю приложение для мониторинга веб-сайтов в качестве проекта для домашних животных с целью узнать больше о Node.js + Redis.Архитектура базы данных с использованием Redis + Node.js

Я планировал, чтобы пользователи добавляли URL-адреса и добавляли их в Redis SET. Каждую минуту я получаю результаты SET, выполняю запрос HTTP Get и печатаю ответ.

Это, кажется, работает хорошо, однако, у меня есть несколько вопросов:

  1. Учитывая, что Redis SET не допускает повторные ключи (которые сэкономят мне делать запрос на тот же URL), как я могу контролировать, когда пользователь удаляет URL-адрес из своей учетной записи, а другой пользователь имеет тот же URL-адрес? Могу ли я иметь значение INCR в URL-адресе, чтобы узнать, сколько у пользователей URL-адреса в их учетной записи?

  2. Учитывая, что я могу сделать запрос HTTP каждую минуту, и я хочу использовать Redis для сохранения результатов (время отклика, вверх/вниз, и т.д.), , что это лучший способ сохранить все эти данные в Redis (результаты от запросов к каждому URL-адресу каждую минуту)? Должен ли я сохранять каждый ответ в уникальном ключе Redis?

  3. Для того, чтобы показать результаты пользователю в режиме реального времени, что является лучшим способом запроса результатов и анализа его в реальном времени?

Спасибо за помощь.

ответ

5

Я думаю, вы должны начать писать прототип в redis-cli. Также я хотел бы отметить эту очень хорошую статью от Simon Willison explaining redis.

Учитывая, что Redis SET не позволяет повторяющиеся ключи (который спасет меня от делает запрос на тот же URL), как я контролировать, когда пользователь удаляет URL со своего счета, но другого пользователя имеет тот же URL-адрес? Могу ли я иметь значение INCR в ключе URL, чтобы я знал, как у у многих пользователей есть URL-адрес в их учетной записи ?

Я бы использовалINCR для этого.

SADD urls http://www.google.com 
INCR http://www.google.com 

Чтобы удалить http://www.google.com я бы просто сделать:

DECR http://www.google.com 
#Only if DECR http://www.google.com => 0, then you should remove from SET 
SREM urls http://www.google.com 

Учитывая, что я могу сделать запрос HTTP каждый минут, и я хочу использовать Redis, чтобы сохранить результаты (время отклика, до/down, и т. д.), что лучше всего сохранить все , что данные в Redis (результаты от запросов к каждому URL-адресу каждую минуту)?

Я хотел бы использовать уникальный ключ для каждого URL и записывать данные обратно в Redis, как JSON (JSON.stringify(obj)) с использованием MSET.

MSET data:http://www.google.com "{json for google}" data:http://www.yahoo.com "{json for yahoo}" 

Для того, чтобы показать результаты пользователю в режиме реального времени, что самый лучший способ запроса результаты и анализировать его в режиме реального времени?

Я хотел бы получить результаты через MGET и разобрать JSON (obj = JSON.parse(json-string)).

+0

Хорошо! Это имеет большой смысл! Благодаря! Только один вопрос сложный, вам нужно будет добавить новые результаты в JSON. Это лучшее решение для этого? Нет ли проблем масштабирования после того, как файл JSON станет огромным? Можете ли вы подробно рассказать об этом немного лучше? У меня очень мало опыта использования JS/JSON. Спасибо, Альфред! ;) – donald

+0

Если вам нужно сохранить исторические данные для каждого URL-адреса, а не только текущие данные, используйте список, а не простой ключ. Вы теряете MSET, но вам не нужно беспокоиться о предыдущих данных при записи и легко обрезать список. Я также хотел бы сохранить список URL-адресов, а также или вместо набора - список, настроенный как очередь, вы можете легко разложить запросы, а не запускать их все сразу. –

+0

@ Donald Я был в отпуске последние пару дней, но я ничего не добавляю. Вы должны еще раз взглянуть на документацию MSET. Но также вы немного правы, я думаю, что это может затормозить, если строка MSET слишком длинная. Возможно, я просто использовал бы множество SETS, а также очень быстро (около 110000 SET в секунду). – Alfred

 Смежные вопросы

  • Нет связанных вопросов^_^