Redis для регистрации

Я думаю использовать Redis для ведения журнала веб-приложений. Я googled, что есть люди, использующие этот подход, сбрасывая журналы в очередь/список Redis, а затем запланированный рабочий для записи на диск.

http://nosql.mypopescu.com/post/8652869828/another-redis-use-case-centralized-logging

Я хочу понять, почему почему бы не использовать Redis для сохранения на диске? Если я выделил небольшой сервер, который Redis будет записывать в, отделенный от базы данных, сервером приложений, можно ли использовать Redis для сохранения журналов напрямую?

Мне также нужна помощь при запросе Redis на datetime, user и т.д. Например, каждый журнал выглядит следующим образом.

datetime=>2012-03-24 17:45:12
userid=>123
message=>test message
category=>my category

Как я могу запросить результаты в пределах диапазона datetime определенным пользователем определенной категории?

Спасибо!

Ответ 1

Вам нужно иметь в виду, что Redis - это база данных в памяти (даже если она может сохранять данные на диске). Данные, которые вы добавили в Redis, должны соответствовать памяти.

Предложение в упомянутой статье касается использования Redis в качестве распределенной системы массового обслуживания. Рабочие процессы деактивируют элементы и записывают их на диск, поэтому в памяти Redis не так много элементов. Эта конструкция имеет недостаток: если рабочие процессы не могут записать данные достаточно быстро на диск, потребление памяти Redis будет взрываться - поэтому его нужно ограничить конфигурацией (параметр Redis maxmemory) или программным обеспечением (обрезать очередь во время вставки или пустым очередь, когда она заполнена).

Теперь ваше предложение действительно не работает, поскольку все данные, которые вы пишете в Redis, будут храниться в памяти (даже если они сохраняются на диске самим Redis).

Еще один момент: вы не можете запросить Redis. Redis не является реляционной базой данных, он не поддерживает ad-hoc-механизм запроса, а только команды, связанные с ранее определенными путями доступа. Если вы хотите искать данные с разными параметрами, вы должны предвидеть все возможные поиски и строить соответствующие структуры данных (набор, отсортированные наборы и т.д.) Во время вставки.

Другой магазин (MongoDB или реляционная база данных), вероятно, будет намного лучше подходит для вашего использования.

Ответ 2

Вы можете хранить журналы со следующей структурой:

"logs:{category}:{userid}:{datetime}" = message

И затем запросите его как следующее:

"logs:*:{userid}:{datetime}"

или

"logs:{category}:*:{datetime}"

Ответ 3

Redis находится в хранилище данных памяти. Прямое сохранение данных на диске возможно с помощью команды "Сохранить" или "BGSAVE". Стойкость (RDB/AOF) является функцией в дополнение к памяти в памяти.

Указанное требование - хранить журналы на диске. Использование любой из очередей сообщений (например, RabbitMQ) вместо хранилища данных в памяти должно сделать вещи простыми. (журналы не будут потреблять память)

Приложения, генерирующие журналы, могут публиковать их в очередях и с отдельными потребителями, потребляющими сообщения журнала и записывая их на диск.

Как я могу запросить результаты в пределах диапазона datetime определенным пользователем определенной категории?

Каждый блок журнала должен быть сохранен как структура (пример для C/С++) примерно так:

   struct log{
     long datatime;
     string userId;
     string message;
     string category;
   };

Сериализуйте эту структуру для строки и сохраните ее в Redis как значение. Ключи для таких значений будут такими: key = userId + DELIMITER + категория + DELIMITER + дата-время

У вас может быть функция, которая возвращает все ключи и разделяет их, чтобы получить список данных для вашего конкретного ключевого слова.

Ответ 4

Это работает довольно хорошо, если вы используете отсортированный набор с отметкой времени в качестве оценки. Недостатками являются проблема с памятью (как упоминалось в других ответах) и ручные запросы, которые вы будете выполнять.

Я играл с этим, на случай, если кому-то будет интересно: https://github.com/hugollm/redis-logs-example