В свете недавнего выхода Redis 2.0.0 я решил собрать все свои заметки про Redis в кучу и опубликовать. Это первая статья из серии про python/django и разные nosql системы хранения данных.
Предыстория
Для первого ознакомления с nosql можно начать со следующих статей:
Ресурсы, которые полностью посвященные новостям из мира nosql
Введение
Redis - открытое, сетевое хранилище данных, хранящая данные в памяти в виде ключ-значение. Redis написан на ANSI C. В качестве значений могут быть не только строки, как в некоторых других БД, а и списки, множества (сортируемое (с версии 1.1) и не сортируемое), хеши. Каждый из этих типов данных поддерживает свой набор атомарных операций.
Redis может работать как распределённое хранилище на нескольких физических серверах. Заявленная производительность 110 000 операций записи в секунду, 81 000 операций чтения в секунду на Xeon X3320 2.5Ghz с 100 000 одновременных запросов от 50 клиентов. Есть поддержка мастер-слейв репликаций.
Все данные хранится в RAM, но для увеличения надежности данные могут сохранятся на диск двумя путями:
Для манипуляциями с данными используются ключи с определенной схемой именования, рекомендуемый подход - объект:id:поле, например film:1:title. Значениями могут быть строки любой длины, до 1 Гб.
Поближе с Redis можно познакомиться по наглядным презентациям:
Потестировать Redis, без установки на локальную машину, можно тут.
Установка
wget http://redis.googlecode.com/files/redis-2.0.1.tar.gz tar xfvz redis-2.0.1.tar.gz cd redis-2.0.1/ make
Запуск сервера с настройками по-умолчанию:
./redis-server
Для запуска сервера в качестве демона и изменения способа вывода сообщений подправим файл с настройками redis.conf, который находится в той же папке, что и redis-server.
daemonize yes logfile /var/log/redis.log
Теперь при запуске Redis-сервера можно указать файл с настройками.
./redis-server ./redis.conf
Попробуем записать строку и считать записанное значение.
./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 можно воспользоваться командами INFO, MONITOR или готовыми утилитами: