Как объединить REDIS и MySQL для массовой INSERT, чтобы улучшить производительность (в реальном времени) - PullRequest
0 голосов
/ 09 июня 2019

Мне нужно вставлять около 1000 строк каждую секунду в базу данных MySQL, поскольку для каждого посетителя я должен добавить IP, браузер и страну в определенную таблицу для статистики.

Вставка посещений строка за строкой требует много производительности от сервера и много встреченного тайм-аута, чтобы минимизировать эту проблему и получить лучшую производительность, я хочу объединить REDIS + MySQL.

Чтобы достичь своей цели, я должен сохранять каждое посещение в REDIS, сопровождаемое точной датой, включая секунды, в формате JSON, а затем из сценария PHP я хочу получить эти записи и вставить их в базу данных MySQL, используя CRONJOB (Каждый второй, чтобы сделать его РЕАЛЬНЫМ для пользователей).

INSERT INTO tbl_name
    (a,b,c)
VALUES
    (1,2,3),
    (4,5,6),
    (7,8,9);

Вставка данных в один запрос занимает очень короткое время и значительно снижает производительность на моем сервере.

Итак, моя точная проблема:

Чтобы иметь возможность добавлять новую запись в REDIS для каждого посещения к фактической дате (это означает добавление всей информации о посещениях к этой дате в секунду) в формате JSON, если это возможно, или нет, а затем с помощью сценария CRONJOB php, я может извлекать все данные в режиме реального времени и добавлять их в базу данных MySQL (для каждой добавленной строки в базу данных MySQL будут удалены из REDIS для предотвращения дублирования).

1 Ответ

0 голосов
/ 10 июня 2019

Вам не нужны REDIS и JSON в этой схеме.Все, что вам нужно, это открыть файл для добавления (POSIX сообщает атомарный доступ к файлу в режиме добавления) и записывать ваши данные построчно.Вы также должны создать задачу cron и импортировать данные в MySQL с синтаксисом «LOAD DATA ... INFILE», который быстрее, чем любая команда SQL с ключевым словом INSERT.

Подсказка 1: вы можете открыть этот файл непосредственно впамяти для повышения производительности.

Подсказка 2: вы можете записывать свои данные в двоичном формате (номера пакетов в виде значений int32 / int64 вместо строк - проверьте man-страницы pack / unpack, чтобы понять, что я имею в виду).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...