Использование Redis для кэширования данных, используемых в одностраничном приложении Real TIme
У меня есть веб-приложение, оно имеет обычную функцию, пользовательские настройки и т. Д. Все они хранятся в MYSQL вместе с пользователем и т. Д......
Особой частью приложения является таблица данных, которую пользователь может редактировать.
Я хотел бы сделать эту таблицу в режиме реального времени, для нескольких пользователей. Т.е. несколько пользователей могут открыть страницу редактирования данных и увидеть изменения в реальном времени, сделанные другими пользователями, редактирующими таблицу.
Я думаю, что кешировать данные для таблицы в Redis, а затем выполнить все действия в Redis, такие как поддержание всех клиентов в актуальном состоянии.
Как только все соединения закрыты для определенной таблицы, сохраните данные обратно в MySQL для сохранения, я знаю, что Redis можно использовать как постоянную базу данных NoSQL, но, поскольку ОЗУ ограничено, а все остальные мои данные хранятся в MYSQL, MySQL кажется лучшим вариантом.,
Это правильный вариант использования Redis? Правильно ли мое мышление?
1 ответ
Это зависит от масштабируемости. Количество записей, с которыми вы будете иметь дело, и структура, которую вы собираетесь использовать для их сохранения.
Я расскажу о плюсах и недостатках использования Redis. Решение остается за вами.
Преимущества использования Redis:
1) It can handle heavy writes and reads in comparison with MYSQL
2) It has flexible structures (hashmap, sorted set etc) which can
localise your writes instead of blocking the whole table.
3) Read queries will be much faster as it is served from cache.
Недостатки использования Redis:
1) Maintaining transactions. What happens if both users try to access a
particular cell at a time? Do you have a right data structure in redis to
handle this case?
2) What if the data is huge? It will exceed the memory limit.
3) What happens if there is a outage?
4) If you plan for persistence of redis. Say using RDB or AOF. Will you
handle those 5-10 seconds of downtime?
На что следует обратить внимание:
1) Сколько данных вы собираетесь иметь дело? Предположим, что для таблицы из 10000 строк с 10 столбцами в Redis требуется 1 ГБ памяти (просто предположение, что фактической памяти будет намного меньше). Если ваш redis кластер 10 ГБ, то вы можете обрабатывать только 10 таких таблиц. Посчитайте, сколько rows * column * live tables
вы собираетесь работать и память, которую он потребляет.
2) Redis использует сжатие для данных в диапазоне http://redis.io/topics/memory-optimization. Допустим, вы решили сохранить таблицу с помощью hashmap, у вас есть две опции: для каждого столбца вы можете иметь hashmap или для каждой строки вы можете иметь hashmap. Второй вариант будет оптимальным. потому что хранение 1000 (хеш-карты -> строки) * 20 (записи в каждой хэш-карте -> столбцы) займет в 10 раз меньше памяти, чем хранение другим способом. Таким же образом, если ячейка изменена, вы можете локализовать ее в пределах 20 значений.
3) Загрузка данных обратно в ваш MYSQL. как часто это будет происходить? Если ваша рабочая нагрузка высока, MYSQL начинает работать хуже для других операций.
4) Как вы будете иметь дело с несколькими клиентами при уведомлении об изменениях? Будете ли вы загружать всю таблицу или часть, которая изменяется? Загрузка измененной части будет оптимальной. В этом случае, где вы будете вести список ячеек, которые были изменены?
Оцените вашу систему по этим вопросам, и вы поймете, осуществимо это или нет.