Устанавливаем 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
Нет Ответов