Для такого решения по уборке я бы рекомендовал многоступенчатый подход. Redis хорош в режиме реального времени . Redis спроектирован как хранилище ключей / значений в памяти и обладает некоторыми очень полезными преимуществами работы с базой данных памяти: O (1) операции со списком. Пока на сервере есть ОЗУ, Redis не будет замедлять продвижение до конца ваших списков, что хорошо, когда вам нужно вставлять элементы с такой высокой скоростью. К сожалению, Redis не может работать с наборами данных, превышающими объем ОЗУ, который у вас есть (он только записывает на диск, чтение для перезапуска сервера или в случае сбоя системы), и масштабирование должно быть сделано вами и вашей заявкой . (Распространенным способом является распределение ключей по многочисленным серверам, что реализуется некоторыми драйверами Redis, особенно драйверами для Ruby on Rails.) Redis также поддерживает простые сообщения публикации / подписки, которые иногда могут быть полезны.
В этом сценарии Redis является «первым этапом». Для каждого конкретного типа события вы создаете список в Redis с уникальным именем; например, у нас есть «просмотренная страница» и «ссылка нажата». Для простоты мы хотим убедиться, что данные в каждом списке имеют одинаковую структуру; При переходе по ссылке могут быть пользовательский токен, имя ссылки и URL, а на просматриваемой странице могут быть только пользовательский токен и URL. Ваша первая задача - узнать, что это произошло, и все необходимые данные выдвигаются.
Далее у нас есть несколько простых рабочих, которые забирают эту неистово вставленную информацию из рук Редиса, прося ее убрать элемент из конца списка и передать его. Работник может выполнить любые корректировки / дедупликации / поиска идентификаторов, необходимые для правильного хранения данных и передачи их на более постоянное место хранения. Запустите столько рабочих, сколько вам нужно, чтобы нагрузка на память Redis была приемлемой. Вы можете написать работникам все, что пожелаете (Node.js, C #, Java, ...), при условии, что у него есть драйвер Redis (большинство веб-языков делают это сейчас) и один для желаемого хранилища (SQL, Mongo и т. Д.). )
MongoDB хорош в хранилище документов . В отличие от Redis, он может работать с базами данных, большими, чем RAM, и поддерживает сегментирование / репликацию самостоятельно. Преимущество MongoDB перед опциями на основе SQL заключается в том, что вам не нужно иметь заранее определенную схему, вы можете в любое время изменить способ хранения данных.
Однако я бы предложил Redis или Mongo для этапа «первого шага» хранения данных для обработки и использовать традиционную настройку SQL (возможно, Postgres или MSSQL) для хранения данных после обработки. Отслеживание поведения клиента звучит для меня как реляционные данные, так как вы можете выбрать «Показать всех, кто просматривает эту страницу» или «Сколько страниц этот человек просматривал в этот день» или «В какой день было больше всего зрителей?» ». В аналитических целях могут быть даже более сложные объединения или запросы, и зрелые решения SQL могут многое сделать для вас; NoSQL (в частности, Mongo или Redis) не может выполнять объединения или сложные запросы к различным наборам данных.