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

Нет Ответов