- PVSM.RU - https://www.pvsm.ru -
Про Redis (официальный сайт [1], материалы на Хабре [2]) написано много, но мне до сего дня не хватало материала, который послужил бы шпаргалкой по его практическому использованию, а так же справочником по базовым теоретическим моментам. Постараюсь заполнить этот пробел в богатой базе знаний Хабра.
Я поставил перед собой цель показать возможности Redis с помощью примеров кода. После публикации приму любые предложения по улучшению материала.
Здесь используется общение с сервером через консольный клиент, но, основываясь на приведенных примерах, можно легко найти реализацию этих примеров в клиентских библиотеках на вашем любимом языке.
Redis — хранилище данных в формате «ключ-значение». Факты о ключах:
Про типы данных Redis есть отдельная хорошая статья: «Структуры данных, используемые в Redis» [4].
В консоли для общения с Redis используется клиентская программа redis-cli. Рассмотрим базовые операции.
Задача 1, создание, выборка, модификация, удаление и базовая информация об объектах.
Установить и прочитать значения с ключами вида test:1:*. Узнать тип значения, проверить существование элемента, извлечь все поля записи test:1, удалить поле записи test:1.
redis 127.0.0.1:6379> set test:1:string "my binary safe string"
OK
redis 127.0.0.1:6379> get test:1:string
"my binary safe string"
redis 127.0.0.1:6379> getset test:1:string "other value"
"my binary safe string"
redis 127.0.0.1:6379> type test:1:string
string
redis 127.0.0.1:6379> set test:1:vlaue "487"
OK
redis 127.0.0.1:6379> rename test:1:vlaue test:1:value
OK
redis 127.0.0.1:6379> exists test:1:vlaue
(integer) 0
redis 127.0.0.1:6379> exists test:1:value
(integer) 1
redis 127.0.0.1:6379> keys test:1:*
1) "test:1:string"
2) "test:1:value"
redis 127.0.0.1:6379> del test:1:value
(integer) 1
redis 127.0.0.1:6379> keys test:1:*
1) "test:1:string"
Подробности о командах, связанных с этой задачей можно найти в документации в разделах Keys [5] и Strings [6].
Задача 2, время жизни объекта.
redis 127.0.0.1:6379> ttl test:1:string
(integer) -1
redis 127.0.0.1:6379> expire test:1:string 6000
(integer) 1
redis 127.0.0.1:6379> ttl test:1:string
(integer) 5997
По умолчанию объект не ограничен временем жизни, поэтому TTL возвращает -1, после установки значения командой EXPIRES команда TTL уже возвращает оставшееся количество секунд.
Подробности о командах, связанных с этой задачей можно найти в документации в разделах Keys [5] и Strings [6].
Задача 3, pipelining, выполнение нескольких команд одним запросом.
PS D:ProgramsRedis64bit> "set test:1:pvalue 'test'`r`nget test:1:pvalue" | .redis-cli
OK
"test"
Pipelining удобно использовать для оптимизации массовых вставок.
Задача 4, транзакции.
Для реализации транзакций в Redis используются следующие основные команды:
MULTI — начать запись команд для транзакции.EXEC — выполнить записанные команды.DISCARD — удалить все записанные команды.WATCH — команда, обеспечивающая поведение типа «check-and-set» (CAS) — транзакция выполняется только в случае, если другие клиенты не изменили значение переменной. Иначе EXEC не выполнит записанные команды.redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set test:1:trValue "1"
QUEUED
redis 127.0.0.1:6379> incr test:1:trValue
QUEUED
redis 127.0.0.1:6379> decr test:1:trValue
QUEUED
redis 127.0.0.1:6379> exec
1) OK
2) (integer) 2
3) (integer) 1
Подробности о командах, связанных с этой задачей можно найти в документации в разделе Transactions [7].
Задача 5, продемонстрировать основные строковые операции.
redis 127.0.0.1:6379> set test:1:string "hello"
OK
redis 127.0.0.1:6379> append test:1:string " world!"
(integer) 12
redis 127.0.0.1:6379> get test:1:string
"hello world!"
redis 127.0.0.1:6379> strlen test:1:string
(integer) 12
redis 127.0.0.1:6379> getrange test:1:string 6 10
"world"
redis 127.0.0.1:6379> setrange test:1:string 6 "habrahabr!"
(integer) 16
redis 127.0.0.1:6379> get test:1:string
"hello habrahabr!"
Задача 6, продемонстрировать операции над числами.
redis 127.0.0.1:6379> set test:1:int 1
OK
redis 127.0.0.1:6379> incr test:1:int
(integer) 2
redis 127.0.0.1:6379> decr test:1:int
(integer) 1
redis 127.0.0.1:6379> incrby test:1:int 20
(integer) 21
redis 127.0.0.1:6379> decrby test:1:int 15
(integer) 6
Подробности о командах, связанных с этими задачами можно найти в документации в разделе Strings [6].
Задача 7, создать список, продемонстрировать основные операции над списками.
redis 127.0.0.1:6379> rpush test:1:messages "Hello, world!"
(integer) 1
redis 127.0.0.1:6379> rpush test:1:messages "Hello, user!"
(integer) 2
redis 127.0.0.1:6379> rpush test:1:messages "Wow!"
(integer) 3
redis 127.0.0.1:6379> lrange test:1:messages 0 2
1) "Hello, world!"
2) "Hello, user!"
3) "Wow!"
redis 127.0.0.1:6379> llen test:1:messages
(integer) 3
redis 127.0.0.1:6379> lpop test:1:messages
"Hello, world!"
redis 127.0.0.1:6379> lpop test:1:messages
"Hello, user!"
redis 127.0.0.1:6379> lpop test:1:messages
"Wow!"
redis 127.0.0.1:6379> llen test:1:messages
(integer) 0
Подробности о командах, связанных с этой задачей можно найти в документации в разделе Lists [8].
Задача 8, создать множество, продемонстрировать основные операции над множествами.
redis 127.0.0.1:6379> sadd test:1:fruits "banana"
(integer) 1
redis 127.0.0.1:6379> sadd test:1:fruits "apple"
(integer) 1
redis 127.0.0.1:6379> sadd test:1:fruits "strawberry"
(integer) 1
redis 127.0.0.1:6379> sadd test:1:yellowThings "banana"
(integer) 1
redis 127.0.0.1:6379> sadd test:1:yellowThings "apple"
(integer) 1
redis 127.0.0.1:6379> sadd test:1:redThings "strawberry"
(integer) 1
redis 127.0.0.1:6379> scard test:1:fruits
(integer) 3
redis 127.0.0.1:6379> sdiff test:1:fruits test:1:yellowThings
1) "strawberry"
redis 127.0.0.1:6379> sdiffstore test:1:noYellowFruits test:1:fruits test:1:yellowThings
(integer) 1
redis 127.0.0.1:6379> sinter test:1:yellowThings test:1:fruits
1) "banana"
2) "apple"
redis 127.0.0.1:6379> sismember test:1:fruits "banana"
(integer) 1
redis 127.0.0.1:6379> sismember test:1:fruits "tomato"
(integer) 0
redis 127.0.0.1:6379> smembers test:1:noYellowFruits
1) "strawberry"
redis 127.0.0.1:6379> smove test:1:yellowThings test:1:redThings "apple"
(integer) 1
redis 127.0.0.1:6379> smembers test:1:redThings
1) "strawberry"
2) "apple"
redis 127.0.0.1:6379> spop test:1:redThings
"apple"
redis 127.0.0.1:6379> srandmember test:1:fruits
"apple"
redis 127.0.0.1:6379> srem test:1:fruits "banana"
(integer) 1
redis 127.0.0.1:6379> sunion test:1:yellowThings test:1:redThings
1) "strawberry"
2) "banana"
redis 127.0.0.1:6379> sunionstore test:1:allThings test:1:yellowThings test:1:redThings
(integer) 2
redis 127.0.0.1:6379> smembers test:1:allThings
1) "strawberry"
2) "banana"
Подробности о командах, связанных с этой задачей можно найти в документации в разделе Sets [9].
Задача 9, создать упорядоченное множество и продемонстрировано основные операции над ним.
В упорядоченном множестве элементы сравниваются по дополнительному параметру «score».
redis 127.0.0.1:6379> zadd hackers 1953 "Richard Stallman"
(integer) 1
redis 127.0.0.1:6379> zadd hackers 1940 "Alan Kay"
(integer) 1
redis 127.0.0.1:6379> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
redis 127.0.0.1:6379> zadd hackers 1916 "Claude Shannon"
(integer) 1
redis 127.0.0.1:6379> zadd hackers 1969 "Linus Torvalds"
(integer) 1
redis 127.0.0.1:6379> zadd hackers 1912 "Alan Turing"
(integer) 1
redis 127.0.0.1:6379> zrange hackers 0 -1
1) "Alan Turing"
2) "Claude Shannon"
3) "Alan Kay"
4) "Richard Stallman"
5) "Yukihiro Matsumoto"
6) "Linus Torvalds"
redis 127.0.0.1:6379> zrevrange hackers 0 -1
1) "Linus Torvalds"
2) "Yukihiro Matsumoto"
3) "Richard Stallman"
4) "Alan Kay"
5) "Claude Shannon"
6) "Alan Turing"
redis 127.0.0.1:6379> zrangebyscore hackers -inf 1950
1) "Alan Turing"
2) "Claude Shannon"
3) "Alan Kay"
redis 127.0.0.1:6379> zremrangebyscore hackers 1940 1960
(integer) 2
redis 127.0.0.1:6379> zrange hackers 0 -1
1) "Alan Turing"
2) "Claude Shannon"
3) "Yukihiro Matsumoto"
4) "Linus Torvalds"
Подробности о командах, связанных с этой задачей можно найти в документации в разделе Sorted sets [10].
Задача 10, Создать хеш-таблицу и продемонстрировать основные операции над хешами.
redis 127.0.0.1:6379> hset users:1 name "Andrew"
(integer) 1
redis 127.0.0.1:6379> hset users:1 email "andrew@example.com"
(integer) 1
redis 127.0.0.1:6379> hkeys users:1
1) "name"
2) "email"
redis 127.0.0.1:6379> hvals users:1
1) "Andrew"
2) "andrew@example.com"
redis 127.0.0.1:6379> hgetall users:1
1) "name"
2) "Andrew"
3) "email"
4) "andrew@example.com"
redis 127.0.0.1:6379> hset users:1 test 1
(integer) 1
redis 127.0.0.1:6379> hincrby users:1 test 123
(integer) 124
redis 127.0.0.1:6379> hvals users:1
1) "Andrew"
2) "andrew@example.com"
3) "124"
redis 127.0.0.1:6379> hdel users:1 test
(integer) 1
redis 127.0.0.1:6379> hvals users:1
1) "Andrew"
2) "andrew@example.com"
Подробности о командах, связанных с этой задачей можно найти в документации в разделе Hashes [11].
Задача 11, подписаться на сообщения на одном клиенте и отправить сообщение из другого.
Приведем окна двух клиентов, в первом окне совершается подписка на сообщения и видно отправленное из второго окна сообщение.
redis 127.0.0.1:6379> SUBSCRIBE messages
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "messages"
3) (integer) 1
1) "message"
2) "messages"
3) "Hello world!"
redis 127.0.0.1:6379> PUBLISH messages "Hello world!"
(integer) 1
Задача 12, подписаться на сообщения на одном клиенте и отправить сообщение из другого. Подписку осуществить с помощью шаблонов.
Приведем окна двух клиентов, в первом окне совершается подписка на сообщения и видно отправленное из второго окна сообщение.
redis 127.0.0.1:6379> PSUBSCRIBE news.*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "news.*"
3) (integer) 1
1) "pmessage"
2) "news.*"
3) "news.art"
4) "New picture!"
1) "pmessage"
2) "news.*"
3) "news.cinema"
4) "New movie!"
redis 127.0.0.1:6379> PUBLISH news.art "New picture!"
(integer) 1
redis 127.0.0.1:6379> PUBLISH news.cinema "New movie!"
(integer) 1
Подробности о командах, связанных с этими задачами можно найти в документации в разделе Pub/Sub [12].
Автор: Andre_487
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/redis/49713
Ссылки в тексте:
[1] официальный сайт: http://redis.io/
[2] материалы на Хабре: http://habrahabr.ru/search/?q=redis
[3] binary safe: http://en.wikipedia.org/wiki/Binary-safe
[4] «Структуры данных, используемые в Redis»: http://habrahabr.ru/post/144054/
[5] Keys: http://redis.io/commands#generic
[6] Strings: http://redis.io/commands#string
[7] Transactions: http://redis.io/topics/transactions
[8] Lists: http://redis.io/commands#list
[9] Sets: http://redis.io/commands#set
[10] Sorted sets: http://redis.io/commands#sorted_set
[11] Hashes: http://redis.io/commands#hash
[12] Pub/Sub: http://redis.io/commands#pubsub
[13] Источник: http://habrahabr.ru/post/204354/
Нажмите здесь для печати.