Статьи

Redis vs. MySQL Benchmarks

В этой статье мы будем обсуждать тесты производительности Redis и MySQL . Мы начнем с введения и установки Redis поверх Ubuntu. Тогда мы будем двигаться к сравнительному анализу между этими двумя.

Введение в Redis

Согласно официальному веб-сайту , Redis является открытым исходным кодом (лицензированным BSD), хранилищем структуры данных в памяти, используемым в качестве базы данных, кэша и посредника сообщений. На самом деле Redis — это расширенное хранилище ключей. Это очень быстро с удивительно высокой пропускной способностью, поскольку он может выполнять приблизительно 110000 операций SET в секунду, около 81000 операций GET в секунду. Он также поддерживает очень богатый набор типов данных для хранения. Фактически, Redis каждый раз хранит данные в памяти, но также сохраняет их на диске. Таким образом, это идет с компромиссом: удивительная скорость с ограничением размера для наборов данных (согласно памяти). В этой статье, чтобы иметь некоторые тесты по сравнению с MySQL, мы будем использовать Redis только в качестве механизма кэширования.

Предпосылки

Установка Redis на Ubuntu

Для начала выполните следующие команды:

 sudo apt update  
 sudo apt install redis-server

Эти команды обновят пакет apt и установят  Redis на ваш компьютер с Ubuntu.

Теперь, на самом деле, чтобы включить использование Redis в качестве службы, вам необходимо настроить его, обновив директиву supervised, присутствующую в файле конфигурации Redis. Вы можете легко найти файл конфигурации здесь:

 sudo vi /etc/redis/redis.conf

По умолчанию контролируемая директива установлена ​​на «нет». Вам нужно установить его: systemd.  После обновления этот раздел файла конфигурации будет выглядеть примерно так:

################################# GENERAL #####################################  
 # By default Redis does not run as a daemon. Use 'yes' if you need it.  
 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.  
 daemonize yes  
 # If you run Redis from upstart or systemd, Redis can interact with your  
 # supervision tree. Options:  
 #  supervised no   - no supervision interaction  
 #  supervised upstart - signal upstart by putting Redis into SIGSTOP mode  
 #  supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET  
 #  supervised auto  - detect upstart or systemd method based on  
 #            UPSTART_JOB or NOTIFY_SOCKET environment variables  
 # Note: these supervision methods only signal "process is ready."  
 #    They do not enable continuous liveness pings back to your supervisor.  
 supervised systemd  
 # If a pid file is specified, Redis writes it where specified at startup  
 # and removes it at exit.  
 #  
 # When the server runs non daemonized, no pid file is created if none is  
 # specified in the configuration. When the server is daemonized, the pid file  
 # is used even if not specified, defaulting to "/var/run/redis.pid".  
 #  
 # Creating a pid file is best effort: if Redis is not able to create it  
 # nothing bad happens, the server will start and run normally.  
 pidfile /var/run/redis/redis-server.pid  
 # Specify the server verbosity level.  
 # This can be one of:  
 # debug (a lot of information, useful for development/testing)  
 # verbose (many rarely useful info, but not a mess like the debug level)  
 # notice (moderately verbose, what you want in production probably)

Включение аутентификации по паролю:

Настройка Redis с аутентификацией по паролю не обязательна, но она очень важна (и тоже проста), так как включает фактор безопасности по сравнению с Redis. Настройка нашего Redis-сервера с помощью пароля очень проста и может быть выполнена через тот же файл конфигурации, что и упомянутый выше. Итак, откройте файл конфигурации и найдите директиву requirepass . Вы бы прокомментировали эту строку по умолчанию, просто раскомментируйте ее и введите свой пароль там. Файл конфигурации будет выглядеть примерно так:

# Require clients to issue AUTH <PASSWORD> before processing any other  
 # commands. This might be useful in environments in which you do not trust  
 # others with access to the host running redis-server.  
 #  
 # This should stay commented out for backward compatibility and because most  
 # people do not need auth (e.g. they run their own servers).  
 #  
 # Warning: since Redis is pretty fast an outside user can try up to  
 # 150k passwords per second against a good box. This means that you should  
 # use a very strong password otherwise it will be very easy to break.  
 requirepass yourpasswordhere  
 # Command renaming.  
 #  
 # It is possible to change the name of dangerous commands in a shared  
 # environment. For instance the CONFIG command may be renamed into something  
 # hard to guess so that it will still be available for internal-use tools  
 # but not available for general clients.  
 #  
 # Example:  
 #  
 # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

Сохраните этот файл сейчас, и чтобы изменения отразились на Redis, перезапустите службу Redis с помощью следующей команды:

 sudo systemctl restart redis.service

Установка PHPRedis поверх Ubuntu:

Теперь, чтобы ваш PHP-код мог использовать Redis как сервис:

  • Выполните следующую команду, чтобы установить расширение PHPRedis :
sudo apt-get install php-redis
  • Добавьте следующую строку в ваш файл php.ini:
extension=redis.so

Workflow

  • Только с MySQL:
    • Случайно сгенерировать ключ между [1, 10000] и найти этот ключ в базе данных MySQL
    • Примет к сведению время, необходимое для этого
    • Для обработки n таких запросов потребовалась бы временная выборка с постепенным увеличением n как 1, 10, 100, 1000, 10000, 100000, 1000000, 1000000.
  • С MySQL и Redis :
    • Случайно сгенерировать ключ между [1, 10000]
    • Проверил бы, присутствует ли этот ключ / хранится на нашем Redis
      • Если бы он присутствовал на Redis, мы бы не попали в MySQL
      • Если его нет в Redis, мы ищем этот ключ в нашей базе данных MySQL и сохраняем этот ключ в Redis.
    • Примет к сведению время, необходимое для этого
    • Для обработки n таких запросов потребовалась бы временная выборка с постепенным увеличением n как 1, 10, 100, 1000, 10000, 100000, 1000000, 1000000.

Исходный код

MySQL только исходный код

(Когда мы пытаемся извлечь ключ только из MySQL):

<?php  
 $con = mysqli_connect("localhost","root","admin","blog_db");  
 for($i = 1; $i <= 10000000; $i = $i *10) {       
      $startTime = microtime(true);  
      for($j = 1; $j <= $i; $j++) {  
           $rand = rand(1, 100000);  
           $sql = "SELECT VALUE from data WHERE `key` = $rand";            
           if (!mysqli_query($con, $sql)) {  
             echo "Error: " . $sql . "" . mysqli_error($con);  
           }  
      }  
 $endTime = microtime(true);  
 file_put_contents('/home/ayush/Desktop/temp/blog/mysqlonly.log', $i . ',' . ($endTime - $startTime) . "\n" , FILE_APPEND);  
 }

Исходный код MySQL и Redis

(Когда мы пытаемся получить ключ сначала из Redis, а затем из MySQL, если мы не можем найти этот ключ в Redis):

<?php  
 $con = mysqli_connect("localhost","root","admin","blog_db");  
 $client = new Redis();  
 $client->connect('localhost');  
 for($i = 1; $i <= 10000000; $i = $i *10) {  
      $startTime = microtime(true);  
      for($j = 1; $j <= $i; $j++) {  
           $rand = rand(1, 100000);  
           if(!$client->exists($rand)) {  
                $client->set($rand, $rand);  
                $sql = "SELECT VALUE from data WHERE `key` = $rand";            
                if (!mysqli_query($con, $sql)) {  
                  echo "Error: " . $sql . "" . mysqli_error($con);  
                }  
           }   
      }  
      $endTime = microtime(true);  
      file_put_contents('/home/ayush/Desktop/temp/blog/redis.log', $i . ',' . ($endTime - $startTime) . "\n" , FILE_APPEND);  
      $client->flushAll();  
 }

Benchmarks

Табличные данные

Табличные данные: Redis против MySQL Benchmark

Графическое представление

Графическое представление: Redis vs MySQL Benchmark

Заключение

Как можно легко увидеть из приведенного выше графического представления, поскольку количество запросов значительно увеличивается, Redis начинает выигрывать со значительным отрывом. Следовательно, использование механизма кэширования, такого как Redis, вместе с вашей базой данных — хорошая идея, если количество обработанных запросов огромно.

Ссылки