time

Python и NoSQL: Redis

python_redis.png В свете недавнего выхода 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, но для увеличения надежности данные могут сохранятся на диск двумя путями:

  • snapshotting - данные асинхронно записываются на диск, через определенные промежутки времени;
  • append-only file - данные записываются на диск, после окончания определенной операции;

Для манипуляциями с данными используются ключи с определенной схемой именования, рекомендуемый подход - объект: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-интерфейсы:

  • Redweb - потребуется доустановка веб фреймворка bottle
  • Redis Admin UI - написан на ASP.NET, для установка под *nix понадобится mono

Для слежения за работоспособностью Redis можно воспользоваться командами INFO, MONITOR или готовыми утилитами:

Теги: nosql, Python, Redis

blog comments powered by Disqus