В свете недавнего обновления Redis я решил собрать все свои заметки про Redis в кучу и опубликовать. Это первая статья из серии про python/django и разные nosql системы хранения данных.
Предыстория
Для первого ознакомления с nosql можно начать со следующих статей:
Ресурсы, которые полностью посвященные новостям из мира nosql
Введение
Redis - открытое, сетевое хранилище данных, хранящая данные в памяти в виде ключ-значение. В качестве значений могут быть не только строки, как в некоторых других БД, а и списки, множества (сортируемое (с версии 1.1) и не сортируемое), хеши. Каждый из этих типов данных поддерживает свой набор атомарных операций. Redis написан на ANSI C.
Redis может работать как распределённое хранилище на нескольких физических серверах. Заявленная производительность 110 000 операций записи в секунду, 81 000 операций чтения в секунду на Xeon X3320 2.5Ghz с 100 000 одновременных запросов от 50 клиентов. Есть поддержка мастер-слейв репликаций.
Все данные хранятся в RAM, но для увеличения надежности данные могут сохранятся на диск двумя путями:
Для манипуляциями с данными используются ключи с определенной схемой именования, рекомендуемый подход - объект:id:поле, например film:1:title. Значениями могут быть строки любой длины, до 1 Гб.
Поближе с Redis можно познакомиться по наглядным презентациям:
Потестировать Redis, без установки на локальную машину, можно тут.
Установка
# под Arch Linux yaourt -S redis # под Ubuntu sudo apt-get install redis-server
Запуск сервера с настройками по-умолчанию:
# под Arch Linux sudo systemctl start redis.service # под Ubuntu sudo service redis-server redis
Файл с настройками по умолчанию находиться в /etc/redis.conf, для тестов этих настройек хватит. Если интересуют подробности - читаем раздел документации про конфиг.
Проверим статус сервера
redis-cli ping PONG
Попробуем записать строку и считать записанное значение.
redis-cli set 'film:1:title' "The king" OK redis-cli get 'film:1:title' "The king"
Теперь добавим список и просмотрим его.
redis-cli rpush 'film:1:comments' 1 (integer) 1 redis-cli rpush 'film:1:comments' 2 (integer) 2 redis-cli lrange 'film:1:comments' 0 -1 1. "1" 2. "2"
Добавим множество (не сортируемое) и просмотрим его.
redis-cli sadd 'user:2:favorite' 1 (integer) 1 redis-cli sadd 'user:2:favorite' 2 (integer) 1 redis-cli smembers 'user:2:favorite' 1. "1" 2. "2"
С полным списком команд можно ознакомится тут.
Связь Redis с Python
Для работы с Redis на python нам понадобится redis-py.
Напишем простой пример, представим что у нас есть два киномана, John и Jane и мы хотим знать какие фильмы нравятся обоим.
Подключаемся к Redis-серверу так
import redis r = redis.Redis(host='localhost', port=6379, db=0)
Создадим счетчик global_user_id для пользователей
r.set('global_user_id', 1) user_id = int(r.get('global_user_id'))
Создадим тестовых пользователей
r.set('user:%d:name' % user_id, 'John') r.set('user:%d:age' % user_id, 25) user_id = int(r.incr('global_user_id')) r.set('user:%d:name' % user_id, 'Jane') r.set('user:%d:age' % user_id, 21)
Назначим каждому из пользователей фильмы, которые ему нравятся. Для наглядности конечного вывода, пересечения двух множеств, фильмы хранятся как их полные названия, а не их id.
r.sadd('user:1:films', 'The Expendables') r.sadd('user:1:films', 'Iron Man 2') r.sadd('user:1:films', 'Prince of Persia') r.sadd('user:2:films', 'State of Play') r.sadd('user:2:films', 'Iron Man 2') r.sadd('user:2:films', 'The Expendables')
Посмотрим какие фильмы нравятся обеим пользователям
r.sinter(['user:1:films', 'user:2:films']) >> set(['Iron Man 2', 'The Expendables'])
Мониторинг и web-интерфейсы
Доступные web-интерфейсы:
Для слежения за работоспособностью Redis можно воспользоваться командами (запускать из redis-cli
):
или готовыми утилитами: