Используя клиент Redis PHP, создать новый объект $connection в каждом PHP-сценарии приложения или создать один объект GLOBAL $connection?

В моем PHP-приложении я пытаюсь использовать Redis (скорее Predis, PHP-клиент для Redis) для кэширования данных, и для этого я следую этому уроку.

Теперь мне нужно будет хранить данные в кеше в одном PHP скрипте / странице. Для этого я создам объект клиента Predis. $redis а затем использовать это $redis объект для вызова своих функций, таких как set() а также expire() на нем для хранения данных в виде пар ключ-значение. Пример фрагмента приведен ниже.

Теперь проблема в том, что в другом скрипте / странице PHP мне нужно будет прочитать данные, хранящиеся в кеше. Для этого мне нужно будет вызвать такие функции, как get() или же exists() на $redis объект снова

Теперь мой вопрос заключается в том, чтобы на этом втором PHP-скрипте / странице мне нужно было создать новый клиентский объект Predis, такой как $redis упомянутый выше (тогда мне нужно будет создавать новый объект $ redis каждый раз, когда я хочу получить доступ к данным, хранящимся в кэше на новом скрипте / странице PHP), или я должен объявить первый как GLOBAL, так что это доступно из всех сценариев / страниц PHP в моем веб-приложении? Какова правильная практика

Пример PHP первого скрипта:

<?php
require "predis/autoload.php";
PredisAutoloader::register();
try {
    $redis = new PredisClient();
}
catch (Exception $e) {
    die($e->getMessage());
}
// sets message to contian "Hello world"
$redis->set('message', 'Hello world');
?>

Пример PHP второго скрипта:

<?php
/* THE FOLLOWING PART WHICH CREATES A $redis 
OBJECT SEEMS TO BE AN OVERDO. SHOULDN'T WE BE 
USING THE SAME $redis OBJECT FROM THE ABOVE SNIPPET? */


require "predis/autoload.php";
PredisAutoloader::register();
try {
    $redis = new PredisClient();
}
catch (Exception $e) {
    die($e->getMessage());
}

// gets the value of message
$value = $redis->get('message');
?>

2 ответа

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

class MyRedis {
    private static $redis;
    static function shared() {
        if ( empty(self::$redis) ) {
            try {
                self::$redis = new PredisClient();
            } catch (Exception $e) {
                die($e->getMessage());
            }
        }
        return self::$redis;
    }
}

Теперь, когда вы хотите свой объект, вы делаете это:

$myRedisObject = MyRedis::shared();
// or 
$message = MyRedis::shared()->get('message');

Он будет создан, если он еще этого не сделал.

Вам может не понадобиться делать это - вы можете запустить несколько тестов для проверки, но в соответствии с документацией Predis:

Соединения с Redis ленивы, что означает, что клиент подключается к серверу только тогда и только тогда, когда это необходимо. Несмотря на то, что рекомендуется позволить клиенту делать свои собственные вещи внутри, иногда могут возникнуть проблемы, связанные с открытием или закрытием соединения: это можно легко сделать, вызвав $client->connect() и $client->disconnect().

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

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

Другие вопросы по тегам