Сервер: Увеличение производительности сайта с помощью PHPRedis

Redis (Remote Dictionary Server) — это нереляционная высокопроизводительная СУБД, сетевое хранилище данных типа ключ:значение, инструмент хранения данных в оперативной памяти, который используется как база данных, кэш и брокер сообщений. Redis предлагает множество возможностей для увеличения производительности веб-сайтов.

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

Убедитесь, что у вас установлен и запущен сервер Redis. Перед использованием Redis необходимо создать новый объект класса Redis, который предоставит методы для работы с Redis.

$redis = new Redis();
$redis->connect('localhost', 6379);
# После выполнения этих двух строк у вас будет объект $redis, который вы можете использовать для выполнения операций с Redis

Примеры использования Redis с PHP для повышения производительности веб-сайта:

  • Кэширование данных:
    Redis может быть использован как быстрый кэш для временного хранения данных, которые трудоемко получать. Например, если результаты сложного запроса к базе данных используются несколько раз, вы можете сохранить результаты этого запроса в Redis, а затем просто извлекать их из кэша, вместо того чтобы каждый раз выполнять запрос. Это может существенно уменьшить время загрузки страницы.

    $query = 'SELECT * FROM users';
    
    # Генерируем уникальный для текущего запроса ключ кэша
    $cacheKey = 'sql:' . md5($query);
    
    # Пробуем получить результат из кэша
    $result = $redis->get($cacheKey);
    
    if( $result === false )
    {
    	# Если результата в кэше нет, выполняем SQL запрос
        $result = run_sql_query( $query );
    
    	# Сохраняем результат в кеш
    	$redis->set( $cacheKey, serialize( $result ) );
    	# Срок действия кэша - 10 минут
        $redis->expire( $cacheKey, 600 );
    } 
    else 
    {
        $result = unserialize($result);
    }
    
    # $result содержит результат SQL запроса, полученный из кэша или из базы данных
    
  • Сессии:
    Вы можете использовать Redis для хранения сессий PHP вместо встроенного механизма файлов сессий PHP. Redis обеспечивает более быстрые чтение и запись, а также обеспечивает сессии, которые сохраняются даже при перезапуске веб-сервера.

  • Очереди:
    Redis может быть использован для создания очередей задач, которые выполняются в фоновом режиме. Это может быть полезно для задач, которые требуют значительного времени для выполнения и не требуют немедленного ответа, например, отправка писем или обработка изображений.

    # Задача для добавления в очередь
    $taskData = [
        'task_id' => 123,
        'description' => 'Описание задачи'
    ];
    
    # Добавление в очередь
    $redis->rPush('task_queue', json_encode( $taskData ) );
    
    # Извлечение задачи из очереди
    $taskData = $redis->lPop( 'task_queue' );
    
    if( $taskData !== false )
    {
        $taskData = json_decode( $taskData, true );
        # Обработка задачи
    }
    
  • Публикация/подписка:
    Redis поддерживает систему публикации и подписки, которая может быть использована для создания систем реального времени, таких как уведомления или чаты.

    Система "публикация/подписка" (publish/subscribe, или pub/sub) — это паттерн программирования, который используется в распределенных системах для обмена сообщениями между различными компонентами приложения. Подобная система базируется на двух типах участников:

    - Издатели (publishers): это источники сообщений или событий. Они "публикуют" эти события, не зная и не заботясь о том, кто их получит.

    - Подписчики (subscribers): это обработчики этих сообщений или событий. Они "подписываются" на определенные типы событий и реагируют на них, когда они происходят.

    Вот базовый пример использования этой функции в Redis с PHP:

    # Подписка на канал
    $redis->subscribe(['channel_name'], function ($redis, $channel, $message) {
        echo "Полученное сообщение: $message в канале: $channel\n";
    });
    
    # В другом процессе или скрипте вы можете отправить сообщение на этот канал:
    $redis->publish('channel_name', 'Привет, подписчики!');
    
  • Совместное использование данных между процессами:
    Redis может быть использован для совместного использования данных между различными процессами или даже серверами. Это может быть полезно для обмена информацией в реальном времени между различными частями вашего приложения.

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

    $userData = [
        'id' => 1,
        'name' => 'Valera',
        'server' => 'server-1'
    ];
    
    # Когда пользователь входит в систему, сервер добавляет его в список онлайн-пользователей в Redis:
    $redis->sAdd( 'online_users', json_encode( $userData ) );
    
    # Когда пользователь выходит из системы, сервер удаляет его из этого списка:
    $redis->sRem( 'online_users', json_encode( $userData ) );
    
    # Получить список всех онлайн-пользователей, сервер может сделать следующее:
    $onlineUsers = $redis->sMembers('online_users');
    
    # Преобразование JSON-строк обратно в массивы PHP
    $onlineUsers = array_map( function( $user ){
        return json_decode( $user, true );
    }, $onlineUsers );
    

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

3.4 г. Просмотров: 1k
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram