Устанавливаем Redis

https://skillbox.ru/media/base/kak_ustanovit_redis_v_os_windows_bez_ispolzovaniya_docker/

(у нас встроен в OpenServer, не акуталльно)


Redis в OpenServer (OSpanel)

Устанавливаем/активируем Redis в OpenServer:

Заходим в меню Настройки, вкладка Модули, выбираем:


Устанавливаем Predis

(нужна для связки Redis <==> PHP)

@see https://github.com/predis/predis — отсюда клонируем, здесь же мануал по использованию (первые шаги)

cd C:OSPaneldomainsexpredis
git clone https://github.com/predis/predis.git

Пробные задачки в Redis (1)

Типы данных в Redis (1,2)

Redis поддерживает целый ряд типов данных. Это позволяет хранить данные в том виде, в котором это целесообразней и в некоторых случаях влияет на скорость доступа к данным. (1) (2)

  • Строка (strings):. Базовый тип данных Redis. Строки в Redis бинарно-безопасны, могут использоваться так же как числа, ограничены размером 512 Мб.

  • Список (lists): линейный массив; Классические списки строк, упорядоченные в порядке вставки, которая возможна как со стороны головы, так и со стороны хвоста списка. Максимальное количество элементов: 2^32 — 1.

  • Хэш-таблицы (hashes): ассоциативные массивы; Классические хеш-таблицы или ассоциативные массивы. Максимальное количество пар «ключ-значение»: 2^32 — 1

  • Множества (sets): набор уникальных значений; Множества строк в математическом понимании: не упорядочены, поддерживают операции вставки, проверки вхождения элемента, пересечения и разницы множеств. Максимальное количество элементов: 2^32 — 1.

  • Упорядоченные множества (sorted sets): Упорядоченное множество отличается от обычного тем, что его элементы упорядочены по особому параметру «score».

  • другие типы данных: битмапы , иероглифы … (1)

Примеры работы с Redis на PHP

(звезда) Исходник тут: http://exp/redis/ruseller.php

<?php

/**
 * Стартуем работу с Redis и PHP
 * @source https://ruseller.com/lessons.php?id=2289&rub=37
 * @deprecated: примеры по ссылке устарели, ниже - актуальные примеры, для современной библиотеки PRedis версии 2.0.0-dev
 * Библиотеку Predis качаем тут: https://github.com/predis/predis
 * WIKI: https://mishaikon.atlassian.net/wiki/spaces/WIKI/pages/edit-v2/32276481
 */

header( 'Content-type: text/html; charset=utf-8' );

// Prepend a base path if Predis is not available in your "include_path".
require 'Predis/Autoload.php';
PredisAutoloader::register();

$isCLI  = ( php_sapi_name() == 'cli' );
$BR     = ($isCLI ? "n" : "<br />");

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CONNECT

try {
    $redis = new PredisClient();
    echo "[ Redis connection OK. ]" . $BR;
    // This connection is for a remote server
    /*
    $redis = = new PredisClient([
        'scheme' => 'tcp',
        'host'   => '10.0.0.1',
        'port'   => 6379,
    ]);
    */
} catch (Exception $e) {
    echo "[ Redis connection FAIL. EXIT. ]" . $BR;
    die($e->getMessage());
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// STRINGS

/**
 * При работе с Redis нужно знать три основные команды: SET, GET и EXISTS.
 * Они используются чтобы проверить наличие/отправить и получить данные от Redis. К примеру:
 */

// помещение строки "Hello world"
$redis->set('message', 'Hello world');

// получаем строку по ключу
$value = $redis->get('message');

// Check
echo ($redis->exists('message') ? "[ Message exists: " . $value . "]" : "[ Record with 'message' key not found ]") . $BR;

/**
 * Инкремент и декремент
 * INCR и DECR - это команды, использующиеся для увеличения и уменьшения значения.
 */

$redis->set("counter", 0);
$redis->incr("counter"); // 1
$redis->incr("counter"); // 2
$redis->decr("counter"); // 1

echo 'Counter value: ' . ($redis->get('counter')) . $BR;

/**
 * Для увеличения/уменьшения более чем на 1, можете воспользоваться командами INCRBY и DECRBY.
 */

$redis->set("counter", 0);
$redis->incrby("counter", 15); // 15
$redis->incrby("counter", 5);  // 20
$redis->decrby("counter", 10); // 10

echo 'Counter value: ' . ($redis->get('counter')) . $BR . $BR;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// LISTS

/**
 * Работа с списками
 * Для работы со списками вам понадобятся команды:
 * LPUSH: помещает элемент в начало списка
 * RPUSH: помещает элемент в конец списка
 * LPOP: извлекает первый элемент из списка
 * RPOP: извлекает последний элемент из списка
 * LLEN: получение размерности списка
 * LRANGE: получение нескольких элементов списка
 */

$redis->rpush("langs", "french"); // [french]
$redis->rpush("langs", "arabic"); // [french, arabic]
$redis->lpush("langs", "english"); // [english, french, arabic]
$redis->lpush("langs", "swedish"); // [swedish, english, french, arabic]

$llen = $redis->llen("langs"); // 2

echo 'Languages ('.$llen.' elements): ' . $BR;
echo "<pre>";
var_dump($redis->lrange("langs", 0, -1));    // output all
echo "</pre>" . $BR;


$redis->lpop("langs"); // [english, french, arabic]
$redis->rpop("langs"); // [english, french]

$redis->lrange("langs", 0, -1); // returns all elements
$redis->lrange("langs", 0, 1); // [english, french]

$llen = $redis->llen("langs"); // 2

echo 'Languages ('.$llen.' elements): ' . $BR;
echo "<pre>";
var_dump($redis->lrange("langs", 0, -1));    // output all
echo "</pre>" . $BR;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// HASHES

/**
 * Работа с хэш-таблицами
 * Как уже упоминалось, данный тип можно сопоставить с ассоциативными таблицами. Команды:
 * HSET: установка элемента ключ-значение
 * HGET: извлечение элемента ключ-значение
 * HGETALL: извлечение всех элементов
 * HMSET: установка нескольких элементов ключ-значение
 * HDEL: Удаление элемента по ключу
 * HINCRBY: увеличить элемент ключ-значение.
 */

$key = 'linus torvalds';
$redis->hset($key, 'age', 44);
$redis->hset($key, 'country', 'finland');
$redis->hset($key, 'occupation', 'software engineer');
$redis->hset($key, 'reknown', 'linux kernel');
$redis->hset($key, 'to delete', 'i will be deleted');
$redis->hget($key, 'age');           // 44
$redis->hget($key, 'country');       // Finland
$redis->hdel($key, 'to delete');
$redis->hincrby($key, 'age', 20); // 64

$data = $redis->hgetall($key);

echo 'Hash values: ' . $BR;
echo "<pre>";
var_dump($data);    // возвращает все значения, которые принадлежат хэшу
echo "</pre>";

$redis->hmset($key, [
    'age'           => 45,
    'country'       => 'finland (2)',
    'occupation'    => 'software engineer (2)',
    'reknown'       => 'linux kernel (2)',
]);

// finally
$data = $redis->hgetall($key);

echo 'Hash values: ' . $BR;
echo "<pre>";
var_dump($data);    // возвращает все значения, которые принадлежат хэшу
echo "</pre>" . $BR;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SETS

/**
 * Работа с множествами
 * Список команд:
 * – SADD: добавление числа N ключу
 * – SREM: удаление числа N ключу
 * – SISMEMBER: проверка существование значения
 * – SMEMBERS: набор всех значений.
 */

$key = "countries";
$redis->sadd($key, 'china');
$redis->sadd($key, ['england', 'france', 'germany']);
$redis->sadd($key, 'china');           // игнорируется
$redis->srem($key, ['england', 'china']);       // remove countries
$redis->sismember($key, 'england');    // false
$redis->smembers($key);                         // ['france', 'germany']

echo 'Countries: ' . $BR;
echo "<pre>";
var_dump($redis->smembers("countries"));   // output all
echo "</pre>";

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TTL

/*
 * Работа с упорядоченными множествами
 * Поскольку Redis хранит данные в памяти, то они не могут располагаться там вечно.
 * Поэтому нам понадобится возможность установить EXPIRE, EXPIREAT, TTL, PERSIST – EXPIRE: время истечения срока хранения в секундах,
 * после чего элемент будет удалён
 * – EXPIREAT: истечение срока unix timestamps
 * – TTL: получить значение оставшегося времени
 * – PERSIST: сброс истечения срока.
 */

echo "Test TTL" . $BR;

$key1 = "expire in 10 sec";
$key2 = "expire in 20 sec";
$key3 = "expire in 30 sec";

$redis->set($key1, "key 1 value");
$redis->set($key2, "key 2 value");
$redis->set($key3, "key 3 value");

$redis->expire($key1, 10);                 // истечёт через 10 sec
$redis->expireat($key2, time() + 20);    // истечёт через 20 sec
$redis->expireat($key3, time() + 30);    // истечёт через 30 sec

function printTtlKeys($sec) {
    global $BR, $redis, $key1, $key2, $key3;
    sleep($sec);                                 // имитация пройденного времени
    echo $BR . "$sec sec passed"  . $BR;
    echo "Key1 expire time: " . $redis->ttl($key1) . ", value: " . $redis->get($key1) . $BR;
    echo "Key2 expire time: " . $redis->ttl($key2) . ", value: " . $redis->get($key2) . $BR;
    echo "Key3 expire time: " . $redis->ttl($key3) . ", value: " . $redis->get($key3) . $BR;
    flush();
}

printTtlKeys(10);
$redis->persist($key3);                             // никогда не истечёт
printTtlKeys(10);
printTtlKeys(10);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Результаты работы:

[ Redis connection OK. ]
[ Message exists: Hello world]
Counter value: 1
Counter value: 10

Languages ( elements):
array(4) {
  [0]=>
  string(7) "swedish"
  [1]=>
  string(7) "english"
  [2]=>
  string(6) "french"
  [3]=>
  string(6) "arabic"
}

Languages (2 elements):
array(2) {
  [0]=>
  string(7) "english"
  [1]=>
  string(6) "french"
}

Hash values:
array(4) {
  ["age"]=>
  string(2) "64"
  ["country"]=>
  string(7) "finland"
  ["occupation"]=>
  string(17) "software engineer"
  ["reknown"]=>
  string(12) "linux kernel"
}
Hash values:
array(4) {
  ["age"]=>
  string(2) "45"
  ["country"]=>
  string(11) "finland (2)"
  ["occupation"]=>
  string(21) "software engineer (2)"
  ["reknown"]=>
  string(16) "linux kernel (2)"
}

Countries:
array(2) {
  [0]=>
  string(6) "france"
  [1]=>
  string(7) "germany"
}
Test TTL

10 sec passed
Key1 expire time: -2, value:
Key2 expire time: 9, value: key 2 value
Key3 expire time: 19, value: key 3 value

10 sec passed
Key1 expire time: -2, value:
Key2 expire time: -2, value:
Key3 expire time: -1, value: key 3 value

10 sec passed
Key1 expire time: -2, value:
Key2 expire time: -2, value:
Key3 expire time: -1, value: key 3 value

(звезда) см. также: Pub/Sub,сообщения в Redis (2)

Источники:

(1) Урок по работе с Redis: https://ruseller.com/lessons.php?id=2289&rub=37

(2) https://habr.com/ru/post/204354/

(3) https://coderlessons.com/articles/php/vvedenie-v-redis-v-php-s-ispolzovaniem-predis

Tags

Нет комментариев

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.