Что такое Redis?
Redis был разработан в 2009 году и представляет собой хранилище типа ключ-значение. Следуя опыту таких NoSQL баз данных, как Cassandra, CouchDB и MongoDB, Redis позволяет хранить большой объем данных без ограничений реляционных баз данных. Также его часто сравнивают с memcache, он находит применение в качестве БД для кеширования.
Настройка
Перед установкой Redis следует учесть пару нюансов. Для начала обновим пакеты apt-get:
sudo apt-get update
По завершению процесса, установим компилятор с зависимыми пакетами, при помощи которого мы и установим Redis из исходного кода:
sudo apt-get install build-essential
Наконец, скачает tcl:
sudo apt-get install tcl8.5
Установка Redis
После необходимой подготовки, мы готовы приступить к установке Redis из исходников:
wget http://download.redis.io/releases/redis-2.8.9.tar.gz
tar xzf redis-2.8.9.tar.gz
cd redis-2.8.9
Далее выполните команду make
:
make
Рекомендуется провести тест сборки:
make test
``
Закончим, выполнив `make install`, в результате чего программа будет установлена глобально:
```bash
sudo make install
По завершению установки, мы получим Redis со встроенным скриптом для запуска сервера в качестве службы. Для доступа к скрипту перейдите в каталог utils
:
cd utils
Запустите скрипт из этого каталога:
sudo ./install_server.sh
``
Во время работы скрипта вы можете выбрать настройки по-умолчанию нажав enter. По окончанию работы скрипта Redis сервер будет запущен в фоновом режиме. Запустить и прервать работу сервера можно следующими командами (номер порта зависит от выбранного вами во время установки):
```bash
sudo service redis_6379 start
sudo service redis_6379 stop
Получить доступ к БД Redis можно при помощи команды:
redis-cli
Ваш Redis сервер готов и запущен, подтверждением тому служит строка:
redis 127.0.0.1:6379>
Для автоматического запуска сервера при загрузке системы выполните:
sudo update-rc.d redis_6379 defaults
Операции 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, то вы получите все элементы до конца. Например, если список содержит 6 цветов радуги (отсортированных по принципу ROYGBV), вы получите следующие результаты:
> 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 (количество секунд с 1.1.1970).
Две команды для настройки:
- 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 заблокирует её выполнение до тех пор, пока не будет выполнена команда redis-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 (списки), Hashes (хеш)
Строки
Строки — самый распространённый тип данных в 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 — добавление значения ко множеству
- ZRANGE — отображение значений отсортированных по индексу (от меньшего к большему)
- 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"
Списки
Списки в Redis — коллекция отсортированных значений, что их и отличает от множеств. Добавление элемента в начало или конец списка выполняется очень быстро даже если список состоит из десяти миллионов элементов. Часто встречающиеся команды:
- 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 [email protected]
OK
> hgetall user:1
1) "username"
2) "jsmith"
3) "password"
4) "4bAc0s"
5) "email"
6) "[email protected]"
Для получения определенной информации используйте команду HMGET
> hmget user:1 username email
1) "jsmith"
"[email protected]"
Заключение
Redis быстро завоёвывает популярность с момента своего выпуска среди таких проектов, как github, flickr, Disqus и Craigslist. Также хранилище работает с большинством языков программирования.