time

Python и NoSQL: Redis

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

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

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

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

Для слежения за работоспособностью Redis можно воспользоваться командами (запускать из redis-cli):

  • INFO - получение информации о сервере;
  • MONITOR - мониторинг все запросов к серверу в реальном времени;

или готовыми утилитами:

blog comments powered by Disqus