Що таке Redis?
Redis - розподілене сховище пар ключ-значення, які зберігаються в оперативній пам'яті, з можливістю забезпечувати довговічність зберігання за бажанням користувача. Це програмне забезпечення з відкритим сирцевим кодом. Redis може зберігати рядки, хеші, списки, множини, відсортовані набори та багато іншого.
Суть сховища ключ-значення - це можливість зберігання деяких даних (значень) всередині ключа. Ці дані в подальшому можуть бути отримані, якщо ми знаємо точний ключ, який був використаний для їх збереження.
Використання Redis
Сальваторе Санфилиппо (творець Redis) вважає, що Redis може бути використаний для заміни РСУБД. Я впевнений, що це погана ідея, тому що такий тип сховища може бути не найкращим рішенням для таких речей, як повнотекстовий пошук.
Нижче перераховані види використання Redis, хоча це лише частина можливих застосувань:
- Кешування (таким же чином, як memcached)
- Лідерборди і пов'язані з ними проблеми
- Лічильники
- Аналіз в реальному часі.
- Видалення і фільтрація
Мета статті
Мета цієї статті не в тому, щоб показати вам синтаксис Redis (ви можете дізнатися про Redis нього тут), в цій статті ми дізнаємося, як використовувати Redis в PHP.
Встановлення Redis
Redis досить легко встановити. Інструкції, включені, як для користувачів Windows, так і Linux.
Встановлення Redis на Linux
Процес інсталювання Redis на Linux доволі простий, але ви повинні встановити TCL:
$ sudo apt-get install tcl
Щоб встановити Redis:
$ wget http://download.redis.io/releases/redis-2.8.19.tar.gz
$ tar xzf redis-2.8.19.tar.gz
$ cd redis-2.8.19
$ make
Примітка: версія 2.8.19 повинна бути замінена на останню стабільну версію Redis.
Всі бінарні файли Redis зберігаються в папці SRC. Для запуску сервера виконайте:
$ src/redis-server
Встановлення на Windows
Інсталювання Redis на Windows дуже просте, просто перейдіть за посиланням, завантажте пакети і встановіть.
Встановлення Predis - Redis клієнт для PHP
Він добре написаний і має велику підтримку спільноти. Щоб почати використовувати Predis просто перенесіть репозиторій у ваш робочий каталог:
$ git clone git://github.com/nrk/predis.git
Підключення до Redis
По-перше, нам потрібно включити Redis Autoloader і зареєструвати його. Ми обернемо клієнт в блок try catch. Налаштування підключення до Redis на локальному сервері відрізняється від підключення до віддаленого сервера.
"tcp",
"host" => "153.202.124.2",
"port" => 6379
));
*/
}
catch (Exception $e) {
die($e->getMessage());
}
Тепер, коли ми успішно підключилися до Redis, давайте почнемо його використовувати.
Типи даних Redis
Redis підтримує різні типи даних. Можливо, ви задавалися питанням: Що NOSQL ключ-значення сховище має робити з типами даних? Ці типи даних допомагають розробникам зберігати данні в інтуїтивно зрозумілій формі і швидше їх отримувати. Ось деякі з типів даних, підтримуваних Redis:
- Рядок (String) - подібний до рядків в PHP
- Список (List) - аналогічний одновимірним масивам в PHP. Ви можете виконувати push, pop, shift, unshift дії для елементів, які розташовані по порядку або згідно FIFO (first in, first out)
- Хеш (Hash) - карти між полями рядків і строкових значень. Це ідеальний тип даних для представлення об'єктів (наприклад: Користувач з такими полями: ім'я, прізвище і тд.)
- Набір (Set) - подібний до списків, за винятком того, що в ньому немає порядку і кожен елемент може зустрічатись лише один раз.
- Сортований набір (Sorted Set) - подібний до наборів з унікальною функцією значень, що зберігаються в наборі. Різниця в тому, що кожен член відсортованого набору пов'язаний з рахунком, який використовується, щоб сортувати набір від найменшого значення рахунку до найбільшого
Також присутні такі типи даних, як бітові карти і hyperloglogs, але вони не будуть обговорюватись у цій статті.
Геттери і Сетери
У Redis, найбільш важливі команди: SET
, GET
і EXIST
. Ці команди використовуються для зберігання, перевірки і вилучення даних з серверу Redis. Як і команди, клас Predis може бути використаний для виконання Redis операцій з допомогою методів (які мають однакові імена з командами). Наприклад:
set(';message';, ';Hello world';);
// отримує значення повідомлення
$value = $redis->get('message');
// Hello world
print($value);
echo ($redis->exists('message')) ? "Oui" : "будь ласка, заповніть ключ повідомлення";
Інкрементація і декрементація
INCR
і DECR
- команди, які використовуються для зменшення або збільшення значення.
set("counter", 0);
$redis->incr("counter"); // 1
$redis->incr("counter"); // 2
$redis->decr("counter"); // 1
Ми також можемо збільшити значення ключа-лічильника за допомогою більшого числового значення або зменшити його з командами INCRBY
і DECRBY
.
set("counter", 0);
$redis->incrby("counter", 15); // 15
$redis->incrby("counter", 5); // 20
$redis->decrby("counter", 10); // 10
Робота зі списками
Існує кілька основних команд Redis для роботи зі списками:
-
LPUSH
- додає елемент на початок списку -
RPUSH
- додати елемент в кінець списку -
LPOP
- видаляє перший елемент зі списку, і повертає його -
RPOP
- видаляє останній елемент зі списку, і повертає його -
LLEN
- повертає довжину списку -
LRANGE
- отримує ряд елементів зі списку
rpush("languages", "french"); // [french]
$redis->rpush("languages", "arabic"); // [french, arabic]
$redis->lpush("languages", "english"); // [english, french, arabic]
$redis->lpush("languages", "swedish"); // [swedish, english, french, arabic]
$redis->lpop("languages"); // [english, french, arabic]
$redis->rpop("languages"); // [english, french]
$redis->llen("languages"); // 2
$redis->lrange("languages", 0, -1); // повертає всі елементи
$redis->lrange("languages", 0, 1); // [english, french]
Робота з Хэшами
Хеш в Redis - це карта між одним полем рядка і рядковим значенням, подібно відносинам "один-до-багатьох". Команди, пов'язані з хешами в Redis:
-
HSET
- задає ключ-значення хеш -
HGET
- отримує ключ-значення хеш -
HGETALL
- отримує всі ключі і значення хеш -
HMSET
- масивне призначення кількох ключів і значень хеш -
HDEL
- видаляє ключ з об'єкта -
HINCRBY
- збільшує ключ-значення з хеша на задане значення
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->get($key, 'age'); // 44
$redis->get($key, 'country')); // Finland
$redis->del($key, 'to delete');
$redis->hincrby($key, 'age', 20); // 64
$redis->hmset($key, [
'age' => 44,
'country' => 'finland',
'occupation' => 'software engineer',
'reknown' => 'linux kernel',
]);
$data = $redis->hgetall($key);
print_r($data); // повертає всі значення ключа, який належить хешу
/*
[
'age' => 44,
'country' => 'finland',
'occupation' => 'software engineer',
'reknown' => 'linux kernel',
]
*/
Робота з наборами
Список команд, пов'язаних з наборами включають в себе:
-
SADD
- додає N-кількість значень ключа -
СРЕМ
- видаляє N-кількість значень від ключа -
SISMEMBER
- перевірка існування значення -
SMEMBERS
- списки значень в наборі
sadd($key, ';china';);
$redis->sadd($key, ['england', 'france', 'germany']);
$redis->sadd($key, 'china'); // ця запис ігнорується
$redis->srem($key, ['england', 'china']);
$redis->sismember($key, 'england'); // false
$redis->smembers($key); // ['france', 'germany']
Терміни дії та постійність
Ви, ймовірно, не збираєтесь зберігати дані вічно. Саме тому, Redis надає нам наступні команди:
-
EXPIRE
- встановлює час закінчення (у секундах) для ключа, після чого він буде вилучений -
EXPIREAT
- встановлює час закінчення терміну дії, використовуючи unix timestamps для ключа, після чого він видаляється -
TTL
- отримує термін дії ключа -
PERSIST
- робить ключ вічним, видаляючи з нього таймер закінчення
$key = "expire in 1 hour";
$redis->expire($key, 3600); // закінчується через 1 годину
$redis->expireat($key, time() + 3600); // закінчується через 1 годину
sleep(600);
$redis->ttl($key); // 3000, отже, закінчується через 50 хвилин
$redis->persist($key); // ніколи не закінчиться
Висновок
Команди, перелічені в цій статті лише деякі з багатьох існуючих Redis команд (див. докладніше команди redis).
Майбутнє Redis
Redis - це краща заміна для memcached, так як він швидший, краще масштабується (підтримує master-slave реплікації), працює з типами даних, через що багато організацій (Facebook, Twitter, Instagram) обрали Redis замість memcached. Це open source проект і багато гарних програмістів з open-source спільноти випускають патчі для цього інструменту.
Ще немає коментарів