Установка и использование Redis
Debian, Ubuntu | Комментировать запись
Redis – это гибкое открытое хранилище данных типа «ключ-значение». Следуя принципам других баз данных NoSQL (таких как Cassandra, CouchDB и MongoDB), Redis позволяет пользователям хранить большие объёмы данных без ограничений, присущих реляционным базам данных. Также Redis можно использовать в качестве постоянного хранилища кэша.
Требования
Для начала нужно обновить пакеты системы:
sudo apt-get update
Для выполнения руководства понадобится пакет build essential, содержащий инструменты для сборки пакетов:
sudo apt-get install build-essential
Также нужно загрузить tcl:
sudo apt-get install tcl8.5
Установка Redis
Загрузите архив с сайта проекта, Redis.io.
wget http://download.redis.io/releases/redis-stable.tar.gz
Распакуйте архив:
tar xzf redis-stable.tar.gz
cd redis-stable
Запустите команду:
make
Затем выполните тестирование:
make test
Чтобы выполнить общесистемную установку Redis, запустите:
sudo make install
После завершения установки можно получить доступ к скрипту, который запускает Redis в фоновом режиме. Скрипт находится в каталоге utils:
cd utils
Запустите скрипт установки (Ubuntu/Debian):
sudo ./install_server.sh
Скрипт задаст ряд вопросов; чтобы выбрать стандартные настройки, просто нажмите enter. После выполнения скрипта сервер redis будет запущен в фоновом режиме.
Чтобы остановить или запустить сервер, используйте следующие команды:
sudo service redis_6379 start
sudo service redis_6379 stop
Примечание: 6379 – порт по умолчанию; если во время установки вы изменили стандартный порт, укажите в команде новый номер порта.
Чтобы получить доступ к БД redis, введите:
redis-cli
Теперь хранилище Redis установлено и запущено. Командная строка Redis имеет такой вид:
redis 127.0.0.1:6379>
Чтобы настроить автозапуск Redis, введите:
sudo update-rc.d redis_6379 defaults
Операции Redis
Простая команда для добавления данных в строку (string – самый распространённый тип данных Redis) выглядит так:
> SET users:GeorgeWashington "job: President, born:1732, dislikes: cherry trees"
OK
В данном случае после команды SET идёт ключ (users:GeorgeWashington), а потом значение (собственно строка).
Как правило, столбцы в Redis значения не имеют, однако они могут быть полезны при описании ключа.
Чтобы извлечь сведения о новой строке, используйте GET:
GET users:GeorgeWashington
"job: President, born:1732, dislikes: cherry trees"
Диапазоны
При извлечении данных можно указывать диапазон при помощи двух параметров: первого и последнего элемента диапазона; как правило, в качестве первого элемента используется 0. Если последним элементом является -1, в диапазон будут включены все элементы до конца списка. К примеру, если список содержит цвета радуги, то можно запросить их при помощи следующих диапазонов:
> LRANGE ROYGBV 0 3
1) "red"
2) "orange"
3) "yellow"
4) "green"
> LRANGE ROYGBV 0 -1
1) "red"
2) "orange"
3) "yellow"
4) "green"
5) "blue"
6) "violet"
> LRANGE ROYGBV 3 -1
1) "green"
2) "blue"
3) "violet"
Срок хранения данных
Redis позволяет устанавливать сроки хранения данных.
Интервалы времени можно указывать в секундах или в unix timestamp. Для управления сроками хранения данных используются команды:
- EXPIRE (устанавливает период хранения ключа);
- TTL (отображает оставшееся время).
> SET classified:information "Secret Stuff"
OK
> EXPIRE classified:information 45
(integer) 1
> TTL classified:information
(integer) 31
При попытке получить данные, срок хранения которых уже истёк, программа вернёт значение nil:
> GET classified:information
(nil)
Инкремент стоковых данных
Redis предоставляет функцию инкремента строк данных. Для целостности данных во время инкремента доступ к данным блокируется.
> SET population 6
OK
> INCRBY population 10
(integer) 16
> INCR population
(integer) 17
Транзакции
Redis поддерживает транзакции согласно двум принципам:
- Команды должны выполняться в заданном порядке. Во время процесса их нельзя прерывать другими запросами.
- Операции нужно обрабатывать в полном объеме.
Транзакции начинаются с команды MULTI и запускаются командой EXEC.
Если по какой-либо причине возникает сбой сервера, прерывающий транзакцию, Redis заблокирует процесс; все изменения нужно будет отменить при помощи команды edis-check-aof, после чего можно перезапустить сервер:
> MULTI
OK
> SET population 6
QUEUED
> INCRBY population 10
QUEUED
> INCR population
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) (integer) 16
3) (integer) 1
4) (integer) 17
Типы данных Redis
Redis поддерживает пять типов данных:
- Строки (Strings)
- Множества (Sets)
- Сортированные множества (Sorted Sets)
- Списки (Lists)
- Хеш (Hash)
Строки
Строки – это базовый тип данных Redis. Общие команды для строк:
- SET: задаёт значение ключа.
- GET: извлекает значение ключа.
- DEL: удаляет ключ и его значение.
- INCR: выполняет автоматический инкремент ключа.
- INCRBY: выполняет инкремент ключа на указанную величину.
- EXPIRE: срок хранения ключа (в секундах).
Строки используются для хранения отсортированных по ключу данных.
Например:
> SET newkey "the redis string begins"
OK
> GET newkey
"the redis string begins"
Множества
Множества – это, по сути, скомбинированные строки без сортировки.
Общие команды:
- SADD: добавление одного или нескольких значений.
- SMEMBERS: запрос всех значений множества.
- SINTER: запрос общих значений нескольких множеств.
- SISMEMBER: поиск значения во множестве.
- SRANDMEMBER: запрос случайного значения множества.
Множества полезны в разных ситуациях. Поскольку каждое значение множества является индивидуальным, перед добавлением не нужно выполнять проверку. Команда SADD выполняет такую проверку автоматически.
> SADD colors red
(integer) 1
redis 127.0.0.1:6379> SADD colors orange
(integer) 1
redis 127.0.0.1:6379> SADD colors yellow
(integer) 1
redis 127.0.0.1:6379> SADD colors orange
(integer) 0
redis 127.0.0.1:6379> SMEMBERS colors
1) "red"
2) "yellow"
3) "orange"
Множества особенно полезны при поиске уникальных IP-адресов или извлечении элементов при помощи команды SRANDMEMBER.
Множества с сортировкой
Множества с сортировкой – это наборы строк, связанных с числом и отсортированных по увеличению значения этого числа.
Этот тип данных очень производителен при работе с диапазонами.
Общие команды:
- ZADD: добавляет значение в множество с сортировкой.
- ZREVRANGE: выводит значения множества с сортировкой по индексу.
- ZREM: удаляет значения.
Для примера можно создать множество с сортировкой, содержащее список самых маленьких стран мира:
> zadd countries 9 Tuvalu
(integer) 1
> zadd countries 62 Liechtenstein
(integer) 1
> zadd countries .7 Monaco
(integer) 1
> zadd countries .2 VaticanCity
(integer) 1
> zadd countries 107 Seychelles
(integer) 1
redis 127.0.0.1:6379> zrange countries 0 -1
1) "VaticanCity"
2) "Monaco"
3) "Tuvalu"
4) "Liechtenstein"
5) "Seychelles"
Списки
Списки – это наборы отсортированных данных. элементы можно добавлять как в начало, так и в конец списка (даже если в списке более десяти миллионов записей).
Общие команды:
- LPUSH: добавление значения в начало списка.
- RPUSH: добавление значения в конец списка.
- LPOP: запрос и удаление первого элемента списка.
- RPOP: запрос и удаление последнего элемента списка.
- LREM: удаление всех элементов.
- LRANGE: извлечение диапазона.
- LTRIM: удаление элементов, не входящих в заданный диапазон.
Для примера попробуйте создать список людей, ответственных за ланч.
> rpush lunch.provider alice
(integer) 1
> rpush lunch.provider bob
(integer) 2
> rpush lunch.provider carol
(integer) 3
> rpush lunch.provider don
(integer) 4
> rpush lunch.provider emily
(integer) 5
Чтобы переместить элемент в начало списка, используйте команду:
lpush lunch.provider zoe
(integer) 6
Чтобы просмотреть список, используйте LRANGE.
lrange lunch.provider 0 -1
1) "zoe"
2) "alice"
3) "bob"
4) "carol"
5) "don"
6) "emily"
Списки, как правило, используются для хранения событий или ограниченного количества элементов.
Хэш
Хэш в Redis – это тип данных, предназначенный для хранения множества полей в ограниченном пространстве. Хэш может хранить более 4 млрд пар «поле-значение».
Общие команды:
- HMSET: устанавливает несколько значений.
- HSET: устанавливает поле со строковым значением.
- HGET: извлекает значение заданного поля.
- HMGET: извлекает значения нескольких полей.
- HGETALL: извлекает все значения.
Хеш можно в качестве примера использовать для описания пользователя сайта:
> hmset user:1 username jsmith password 4bAc0s email jsmith@gmail.com
OK
> hgetall user:1
1) "username"
2) "jsmith"
3) "password"
4) "4bAc0s"
5) "email"
6) "jsmith@gmail.com"
Команда HMGET возвращает значение по полю:
> hmget user:1 username email
1) "jsmith"
"jsmith@gmail.com"