Статьи

Введение в Redis в PHP с использованием Predis

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

Он был запущен в 2009 году Сальваторе Санфилиппо и из-за его популярности быстро рос, будучи выбранными крупными компаниями, такими как VMware (который позже нанял Санфилиппо для работы над проектом на полную ставку), GitHub, Craigslist, Disqus, Digg, Blizzard, Instagram и больше (см. redis.io/topics/whos-using-redis ).

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

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

В этой статье мы рассмотрим некоторые из основных, но мощных команд, которые Redis может предложить с помощью библиотеки Predis.

Простая установка

Redis прост в установке, и краткие инструкции по установке опубликованы на странице загрузки продукта. Исходя из моего собственного опыта, если вы работаете в Ubuntu, вы получите ошибку, если у вас не установлен TCL (просто запустите sudo apt-get install tcl). После установки Redis вы можете запустить сервер:

  gafitescu @ ubun2: ~ $ / usr / local / bin / redis-server
 * Сервер теперь готов принимать соединения через порт 6379 

Клиентские библиотеки Redis доступны для многих языков и перечислены на веб-сайте Redis , часто с несколькими доступными для каждого языка! Для PHP их пять. В этой статье я буду использовать библиотеку Predis , но вы также можете изучить phpredis, который компилируется и устанавливается как модуль PHP.

Если у вас на компьютере установлен Git, как и у меня, все, что вам нужно сделать, это клонировать репозиторий Predis. В противном случае вам нужно скачать ZIP-архив и распаковать его.

  gafitescu @ ubun2: ~ $ git clone git: //github.com/nrk/predis.git 

Чтобы проверить все, создайте файл test.php

 <?php
require "predis/autoload.php";
PredisAutoloader::register();

// since we connect to default setting localhost
// and 6379 port there is no need for extra
// configuration. If not then you can specify the
// scheme, host and port to connect as an array
// to the constructor.
try {
    $redis = new PredisClient();
/*
    $redis = new PredisClient(array(
        "scheme" => "tcp",
        "host" => "127.0.0.1",
        "port" => 6379));
*/
    echo "Successfully connected to Redis";
}
catch (Exception $e) {
    echo "Couldn't connected to Redis";
    echo $e->getMessage();
}

Когда вы запустите его, вы должны увидеть сообщение «Успешно подключен к Redis».

Использование Redis

В этом разделе вы получите обзор наиболее часто используемых команд, предлагаемых Redis. У Memcache есть эквивалент для большинства из них, поэтому, если вы знакомы с Memcache, этот список покажется вам знакомым.

SET, GET и EXISTS

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

 <?php
$redis->set("hello_world", "Hi from php!");
$value = $redis->get("hello_world");
var_dump($value);

echo ($redis->exists("Santa Claus")) ? "true" : "false";

Метод set()get() Метод exists()

Ключ не ограничивается буквенно-цифровыми символами и подчеркиванием. Следующее будет работать так же хорошо:

 <?php
$redis->set("I 2 love Php!", "Also Redis now!");
$value = $redis->get("I 2 love Php!");

INCR (INCRBY) и DECR (DECRBY)

Команды INCRDECR INCR и DECR увеличивают / уменьшают свои значения на 1; Вы также можете использовать INCRBYDECRBY Вот пример:

 <?php
// increment the number of views by 1 for an article
// with id 234
$redis->incr("article_views_234");

// increment views for article 237 by 5
$redis->incrby("article_views_237", 5);

// decrement views for article 237
$redis->decr("article_views_237");

// decrement views for article 237 by 3
$redis->decrby("article_views_237", 3);

Типы данных Redis

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

  • String – базовый тип данных, используемый в Redis, в котором вы можете хранить от нескольких символов до содержимого всего файла.
  • Список – простой список порядка строк путем вставки его элементов. Вы можете добавлять и удалять элементы как из заголовка, так и из конца списка, поэтому вы можете использовать этот тип данных для реализации очередей.
  • Хэш – карта строковых ключей и строковых значений. Таким образом, вы можете представлять объекты (представьте, что это одноуровневый объект JSON).
  • Set – неупорядоченный набор строк, в который можно добавлять, удалять и проверять наличие членов. Единственным ограничением является то, что вам не разрешено иметь повторных членов
  • Сортированный набор – частный случай установленного типа данных. Разница в том, что каждый член имеет и связанный с ним счет, который используется для упорядочения набора от наименьшего до наибольшего.

До сих пор я демонстрировал только строки, но есть команды, которые упрощают работу с данными в других типах данных.

HSET, HGET и HGETALL, HINCRBY и HDEL

Эти команды используются для работы с хеш-типом данных Redis:

  • HSET – устанавливает значение ключа для хеш-объекта.
  • HGET – получает значение ключа для хеш-объекта.
  • HINCRBYувеличить значение ключа хеш-объекта на указанное значение.
  • HDEL – снять ключ с объекта.
  • HGETALL – получить все ключи и данные для объекта.

Вот пример, который демонстрирует их использование:

 <?php
$redis->hset("taxi_car", "brand", "Toyota");
$redis->hset("taxi_car", "model", "Yaris");
$redis->hset("taxi_car", "license number", "RO-01-PHP");
$redis->hset("taxi_car", "year of fabrication", 2010);
$redis->hset("taxi_car", "nr_starts", 0);
/*
$redis->hmset("taxi_car", array(
    "brand" => "Toyota",
    "model" => "Yaris",
    "license number" => "RO-01-PHP",
    "year of fabrication" => 2010,
    "nr_stats" => 0)
);
*/
echo "License number: " . 
    $redis->hget("taxi_car", "license number") . "<br>";

// remove license number
$redis->hdel("taxi_car", "license number");

// increment number of starts
$redis->hincrby("taxi_car", "nr_starts", 1);

$taxi_car = $redis->hgetall("taxi_car");
echo "All info about taxi car";
echo "<pre>";
var_dump($taxi_car);
echo "</pre>";

LPUSH, RPUSH, LPOP, RPOP, LLEN, LRANGE

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

  • LPUSHдобавляет элемент (ы) в список.
  • RPUSH – добавляет элемент (ы) в список.
  • LPOP – удаляет и извлекает первый элемент списка.
  • RPOP – удаляет и извлекает последний элемент списка.
  • LLEN – получает длину списка.
  • LRANGE – получает элементы из списка.
 <?php
$list = "PHP Frameworks List";
$redis->rpush($list, "Symfony 2");
$redis->rpush($list, "Symfony 1.4");
$redis->lpush($list, "Zend Framework");

echo "Number of frameworks in list: " . $redis->llen($list) . "<br>";

$arList = $redis->lrange($list, 0, -1);
echo "<pre>";
print_r($arList);
echo "</pre>";

// the last entry in the list
echo $redis->rpop($list) . "<br>";

// the first entry in the list
echo $redis->lpop($list) . "<br>";

EXPIRE, EXPIREAT, TTL и PERSIST

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

  • EXPIRE – устанавливает срок действия (в секундах) для ключа, после которого он и его значение будут удалены.
  • EXPIREAT – устанавливает и истекает время, используя временную метку Unix, которая представляет, когда ключ и значение будут удалены.
  • TTL – получает оставшееся время жизни для ключа с истечением срока действия.
  • PERSIST – удаляет срок действия по данному ключу.
 <?php
// set the expiration for next week
$redis->set("expire in 1 week", "I have data for a week");
$redis->expireat("expire in 1 week", strtotime("+1 week"));
$ttl = $redis->ttl("expire in 1 week"); // will be 604800 seconds

// set the expiration for one hour
$redis->set("expire in 1 hour", "I have data for an hour");
$redis->expire("expire in 1 hour", 3600);
$ttl = $redis->ttl("expire in 1 hour"); // will be 3600 seconds

// never expires
$redis->set("never expire", "I want to leave forever!");

Резюме

В этой статье мы рассмотрели только краткий список команд Redis, но вы можете проверить весь список команд на веб-сайте Redis. Действительно, Redis может предложить гораздо больше, чем просто замена Memcache.

Redis здесь в долгосрочной перспективе; у него растущее сообщество, поддержка всех основных языков, а также надежность и высокая доступность благодаря репликации ведущий-ведомый. Redit – это открытый исходный код, поэтому, если вы гуру C, вы можете раскошелиться на его исходный код из GitHub и стать участником.

Если вам нужна дополнительная информация за пределами сайта проекта, вы можете рассмотреть возможность ознакомления с двумя замечательными книгами Redis: Поваренная книга Redis и Redis: The Definitive Guide .