Автор оригинала: Anshul Bansal.
1. Обзор
В этой статье мы рассмотрим сходства и различия двух популярных баз данных в памяти, Memcached и Redis .
2. Memcached и Redis
Часто мы думаем о кэшировании для повышения производительности при обработке большого объема данных.
Memcached-это система кэширования распределенной памяти, разработанная для простоты использования и простоты и хорошо подходит в качестве кэша или хранилища сеансов .
Redis-это хранилище структуры данных в памяти, которое предлагает богатый набор функций. Он полезен в качестве кэша, базы данных, брокера сообщений и очереди .
3. Установка
3.1. Установка Memcached
Мы можем установить последний сервер Memcached , загрузив пакет и запустив make :
$ wget http://memcached.org/latest $ tar -zxvf memcached-1.6.3.tar.gz $ cd memcached-1.6.3 $ ./configure && make && make test && sudo make install
3.2. Установка Redis
Аналогично, мы можем установить последний сервер Redis :
$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz $ tar xzf redis-5.0.8.tar.gz $ cd redis-5.0.8 $ make
4. Сходство
4.1. Субмиллисекундная Задержка
И Memcached, и Redis обеспечивают субмиллисекундное время отклика, сохраняя данные в памяти.
4.2. Разбиение данных на разделы
Аналогично, обе базы данных в памяти позволяют распределять данные между несколькими узлами.
4.3. Поддержка языков программирования
Аналогичным образом, оба поддерживают все основные языки программирования, включая Java, Python, JavaScript, C и Ruby.
Кроме того, существует несколько клиентов Java, доступных для обеих баз данных в памяти. Например, Memcached и Memcached-java-client доступны для Memcached, в то время как Jedis , Lettuce и Radisson доступны для Redis.
4.4. Очистка кэша
Memcached позволяет очистить кэш с помощью команды flush_all . Аналогично, Redis позволяет нам удалить все из кэша с помощью таких команд, как FLUSHDB и FLUSH ALL .
4.5. Масштабирование
Оба решения кэширования обеспечивают высокую масштабируемость для обработки больших данных, когда спрос растет экспоненциально.
5. Различия
5.1. Командная строка
Memcached позволяет нам запускать команды , подключаясь к серверу с помощью telnet:
$ telnet 10.2.3.4 5678 Trying 10.2.3.4... Connected to 10.2.3.4.
$ stats STAT pid 14868 STAT uptime 175931 STAT time 1220540125 // ...
В отличие от Memcached, Redis поставляется с выделенным интерфейсом командной строки redis-cli , позволяющим нам выполнять команды :
$ redis-cli COMMAND 1) 1) "save" 2) (integer) 1 3) 1) "admin" 2) "noscript" // ... 2) 1) "multi" 2) (integer) 1 3) 1) "noscript" 2) "fast" // ... 3) 1) "geodist" 2) (integer) -4 3) 1) "readonly" // ... // ...
Здесь мы выполнили КОМАНДУ , чтобы перечислить все команды, предоставленные Redis.
5.2. Сброс Дискового Ввода-Вывода
Memcached обрабатывает сброс диска только с помощью сторонних инструментов, таких как libmemcached-tools или форков, таких как memcached-dd .
Однако Redis предоставляет настраиваемые механизмы по умолчанию, такие как RDB (файл базы данных Redis) или AOF (файлы только для добавления) для сброса диска. Это может быть полезно для архивирования и восстановления.
Используя redis-cli, мы можем выполнить синхронную команду SAVE , чтобы сделать снимок данных в памяти:
$ redis-cli SAVE OK
Здесь команда сохраняет снимок в двоичном файле dump.rdb и возвращает состояние OK по завершении.
Однако выполнение асинхронного BGSAVE запускает фоновый процесс создания моментального снимка:
$ redis-cli BGSAVE OK
Кроме того, мы можем использовать команду LAST SAVE для проверки времени Unix последнего успешного снимка БД.
$ redis-cli LASTSAVE (integer) 1410853592
5.3. Структуры данных
Memcached хранит пары ключ-значение в виде строки и имеет ограничение на размер 1 МБ на значение. Однако Redis также поддерживает другие структуры данных , такие как список, набор и хэш, и может хранить значения размером до 512 МБ .
5.4. Репликация
Memcached поддерживает репликацию с помощью сторонних вилок, таких как repcached .
В отличие от Memcached, Redis предоставляет нам функциональность для нескольких кластеров, реплицируя основное хранилище для лучшей масштабируемости и высокой доступности.
Во-первых, мы можем использовать команду REPLICA OF для создания реплики главного сервера Redis. Затем мы выполняем команду SYNC на реплике, чтобы инициировать репликацию от мастера.
5.5. Сделки
Memcached не поддерживает транзакции, хотя его операции являются атомарными.
Redis обеспечивает готовую поддержку транзакций для выполнения команд.
Мы можем начать транзакцию с помощью команды MULTI . Затем мы можем использовать команду EXEC для выполнения следующих последующих команд. Наконец, Redis предоставляет команду WATCH для условного выполнения транзакции.
5.6. Публикация и подписка на сообщения
Memcached не поддерживает публикацию/подписку сообщений из коробки.
Redis, с другой стороны, предоставляет функциональные возможности для публикации и подписки на сообщения с использованием очередей сообщений pub/sub .
Это может быть полезно при разработке приложений, требующих общения в режиме реального времени, таких как чаты, каналы социальных сетей и взаимодействие с сервером.
Redis поставляется с выделенными командами, такими как PUBLISH , | SUBSCRIBE и UNSUBSCRIBE для публикации сообщения на канале, подписки и отмены подписки клиента на указанные каналы соответственно.
5.7. Геопространственная поддержка
Геопространственная поддержка полезна для реализации функций, основанных на местоположении, для наших приложений. В отличие от Memcached, Redis поставляется со специальными командами для управления геопространственными данными в реальном времени .
Например, команда GEODIST вычисляет расстояние между двумя геопространственными записями. Аналогично, команда GEO RADIUS возвращает все записи в пределах указанного радиуса.
Кроме того, мы можем использовать Spring Data Redis для включения геопространственной поддержки Redis в приложении Java.
5.8. Архитектура
Redis использует одно ядро и показывает лучшую производительность, чем Memcached, при хранении небольших наборов данных, если измерять их в терминах ядер.
Memcached реализует многопоточную архитектуру, используя несколько ядер . Поэтому для хранения больших наборов данных Memcached может работать лучше, чем Redis.
Еще одним преимуществом многопоточной архитектуры Memcached является ее высокая масштабируемость, достигаемая за счет использования нескольких вычислительных ресурсов.
Redis может масштабироваться горизонтально с помощью кластеризации, которая сравнительно сложнее в настройке и эксплуатации. Кроме того, мы можем использовать Jedis или Салат-латук для включения кластера Redis с помощью приложения Java.
5.9. Сценарии LUA
В отличие от Memcached, мы можем выполнять LUA-скрипты против Redis. Он предоставляет такие команды, как EVAL и ЗАГРУЗКА СКРИПТА , , полезные для выполнения сценариев LUA.
Например, мы можем выполнить команду EVAL для оценки сценария:
$ redis-cli eval "return redis.call('set',KEYS[1],'baeldung')" 1 website OK
Здесь мы установили ключ website в значение baeldung , оценив сценарий.
5.10. Использование памяти
Memcached имеет более высокий коэффициент использования памяти, чем Redis, при сравнении строковой структуры данных.
Несмотря на это, когда Redis использует хэш-структуру, она обеспечивает более высокую скорость использования памяти, чем Memcached.
6. Заключение
В этой статье мы исследовали Memcached и Redis. Во-первых, мы рассмотрели сходство обеих баз данных в памяти. Затем мы рассмотрели различия в функциях, предоставляемых обоими решениями для кэширования.
Существует множество доступных решений для кэширования в памяти. Поэтому мы должны рассмотреть особенности механизма кэширования и сопоставить их с нашими вариантами использования.
Мы, безусловно, можем сделать вывод, что Memcached-это надежный выбор для решения простых проблем кэширования. Однако, вообще говоря, Redis превосходит Memcached, предлагая более богатую функциональность и различные функции, которые перспективны для сложных вариантов использования.