1. Моделирование системы
  персестирования данных

2. Redis: возможности, выгоды,
    примеры использования

                        Алексей Качаев
                   Zend_Coffee&Code #3
                             Июль, 2011
Алексей Качаев
Senior/Lead PHP Developer at
Cogniance

4+ года опыта c PHP

3+ года использования Zend
Framework

Активный участник
zendframework.ru/forum

ZF2 contributor
Мои контакты
Blog:
codemehanika.org

Email:
kachayev@gmail.com

Twitter:
@kachayev

Facebook:
http://www.facebook.com/kachayev

Github:
https://github.com/kachayev
О чем мы будем говорить

1. Что такое моделирование данных и при чем здесь DDD,
DataMappers и т.д.

2. SQL, noSQL, lessSQL.

3. TTL, read/write rate, I/O, партицирование и шардинг.

4. Redis как пример key-value storage.

5. Mongo как пример документо-ориентированного
хранилища.
Что такое моделирование
         данных
Независимость кода от хранилища

Многие паттерны диктуют НЕЗАВИСИМОТЬ
ХРАНИЛИЩА.

К сожалению, для многих это так и остается просто
декларацией выгоды паттернов.

Плохо: создавать объекты по полям в таблице базы.
Плохо: создавать поля в таблице по свойствам объекта.

Нужно: понимать, что НЕЗАВИСИМОСТЬ должна быть
ДВУХСТОРОННАЯ.
SQL, noSQL, lessSQL
MySQL - это не приговор, а NoSQL не
существует
1. Key-value (Redis, Scalaris, TC, MemcacheDB)
2. Документ (MongoDB, CouchDB, Riak)
3. Семейства столбцов (Cassandra, HBase)
4. Граф (Neo4J)

Зачем?
- скорость
- ресурсо-затратность
- масштабируемость
- доп. возможности

Главное:
Моделировать по логике, а не по sql-ности.
Характеристики данных
TTL
TTL = Time To Live -> среднее время между обновление
единицы данных.

Почему это важно?
1. Кеширование
2. TTL составной ноды информации = min(TTL частей)

Пример.

1. Пользователи и их комментарии. JOIN отменяется.

2. Количество просмотров и попаданий в поисковую
выдачу. Прощай кеш объявлений.
Read/write rate

Мало пишем, много читаем - SQL.
Много пишем, редко читаем - NoSQL.

Почему:
1. Персистентность и I/O
2. Индексы
3. Locks

Например:
1. Статистика, аналитика
2. Real-time data
3. Действия пользователей и т.д.
I/O

Ресурс, о котором всегда забывают.
Верхний предел существует и постоянно уменьшается.

Примеры:

1. Сессии
2. Крупные блоки данных
3. Конкурентность I/O
Конкурентность доступа

1. Locks при write операциях (запись, таблица)

2. "Выдавливаение" кеша из ограниченного стека

3. Атомарность или почему GET X; SET X+1 не работает.
Redis. Возможности,
выгоды, использование
Что такое Redis?

http://redis.io

Не только key-value storage.

1. Очень большая скорость get/set операций
2. Expire для ключей
3. Асинхронная персистентность
4. Типы данных с внутренней оптимизацией
5. Репликация master-slave с поддержкой ветвления
6. Атомарные операции и транзакционность
7. Pub/sub
Установка
sudo -s

cd /usr/local/lib
wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz
tar xvzf redis-2.2.11.tar.gz
cd redis-2.2.11
make

## sysctl vm.overcommit_memory=1
ln -s /usr/local/lib/redis-2.2.11/redis-server /usr/bin/redis-server
Supervisor
Отключить встроенную демонизацию!

/etc/supervisor/conf.d/redis.conf
[program:redis]
command=/usr/bin/redis-server /etc/redis/redis.conf
priority=10
autorestart=true
autostart=true
startsecs=10
startretries=3
stopsignal=QUIT
stopwaitsecs=10
redirect_stderr=true
stdout_logfile=/var/log/redis.log
stdout_logfile_maxbytes=10MB
Типы данных
1. BS String (get, set, incr, incrby, getset, до 1 гб)

2. List (связанный список, добавление O(1), захват по
индексу O(n), [push | pop | insert], [set | index | rem], [range |
trim])

3. Set (неупорядоченный набор строк, хеш-таблица,
сложность операций O(1), resize таблицы блокирующий,
[sadd | srem | sismember | smove | spop], scard, smembers,
[sdiff | sunion | sinter])

4. Sorted set

5. Hashes
Sorted Set
Суть: коллекция строк с ассоциированными числами
Скорость: получение элемента по оценке - O(1),
обновеить значение оценки - O(n)
Внутренняя реализация: через двойную структуру
(двунаправленный список+хеш-таблица)

Команды:
ZADD key score member; ZREM key member; ZINCRBY key increment member
ZRANK key member; ZREVRANK key member;
ZRANGE key start end; ZREVRANGE key start end;
ZRANGEBYSCORE key min max; ZCOUNT key min max;
ZCARD key; ZSCORE key element;
ZREMRANGEBYRANK key min max; ZREMRANGEBYSCORE key min max
Redis Hash
Суть: неупорядоченный набор соответствий между field и
value.
Удобно для: хранения объектов по одному ключу
Сложность: Добавить, удалить, проверить поле - O(1),
перебрать все поля и/или значения - O(n)
Внутренняя реализация: для "маленьких" хешей - zipmap
(медленнее, но компактно), для "больших" - hash table
(быстро, но много)

Команды:
HSET key field value; HGET key field
HMGET key field1 ... fieldN; HMSET key field1 value1 ... fieldN valueN HINCRBY key field integer
HEXISTS key field; HDEL key field; HLEN key
HKEYS key; HVALS key; HGETALL key
Скорость, I/O и fsync
Скорость до 100.000 записей в секунду. Чтение
медленнее, чем запись в большинстве случаев.

Два механизма персестирования:
1. Snapshot
save 300 1000
dbfilename /var/redis/dump.rdb
2. AOF
appendonly yes|no
appendfsync always|everysec|no

Оба персистера работают на уровне форка процесса.

Механизм VM, SWAP и работа при дефиците (или
искусственном ограничении) оперативной памяти.
Атомарность операций и транзакции

Атомарные счетчики: INCR, INCRBY, DECR, DECRBY

Транзакции:
1. Все команды сериализуются и выполняются
последовательно
2. Выполняются либо все команды, либо ни одной

Команды:
MULTI....EXEC or DISCARD (транзакция)

WATCH key....MULTI....EXEC (оптимистичная блокировка)
Использование Rediska + Zend
Использование Rediska + Zend
Решение специфических задач

0. Генерирование уникального ID для сущности при работе
на нескольких серверах

1. Последнии 10 добавленных комментариев всеми
пользователями (LPUSH, LRANGE)

2. Рейтинг игроков (ZADD, ZREVRANGE)
http://codemehanika.org/blog/2011-07-15-redis-types-
usage.html

3. Подсчет уникальных посетителей (SADD, SCARD)

4. Pub/sub, очереди, кеширование
Мониторинг, деббаг и другое

REDIS-CLI или TELNET

1. info, dbsize
2. monitor
3. debug object
4. config get|set
5. flushall, flushdb
6. bgsave, bgrewriteaof
7. slowlog
Спасибо за внимание!



            Вопросы
              ???

More Related Content

PDF
Redis (Dump 2015)
PPTX
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
PDF
NoSQL и Zend Framework (Никита Грошин)
PDF
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
PPTX
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
PPT
MongoDB basics in Russian
PDF
AVITO. Решардинг Redis без даунтайма. DevConf 2012
PPT
phpConf 2010 Классификация систем хранения
Redis (Dump 2015)
Конференция Highload++ 2014, "Инструменты высоконагруженных проектов: кеширов...
NoSQL и Zend Framework (Никита Грошин)
Оптимизация программ для современных процессоров и Linux, Александр Крижановс...
Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-т...
MongoDB basics in Russian
AVITO. Решардинг Redis без даунтайма. DevConf 2012
phpConf 2010 Классификация систем хранения

What's hot (20)

PDF
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
PPTX
MongoDB в продакшен - миф или реальность?
ODP
Кратко о MongoDB
PDF
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
PDF
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
PDF
SphinxSearch Meetup - Tips&tricks
PDF
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
PPTX
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
PPTX
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
PDF
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
PDF
Механика DDoS (Александр Крижановский)
PDF
pgconf.ru 2015 avito postgresql
PDF
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
PPT
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
PPTX
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
PDF
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
ODP
Константин Осипов (Mail.Ru)
PDF
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PPTX
ClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
PPTX
C++ для web с помощью Emscripten
DUMP-2015: «Redis Кластер» Георгий Бажуков, Nevesta.info
MongoDB в продакшен - миф или реальность?
Кратко о MongoDB
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
SphinxSearch Meetup - Tips&tricks
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Chronicle Map — key-value хранилище для трейдинга на Java / Левентов Роман (C...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
Что особенного в СУБД для данных в оперативной памяти / Константин Осипов (Ta...
Механика DDoS (Александр Крижановский)
pgconf.ru 2015 avito postgresql
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
CodeFest 2012. Нелюбин Д. — Neo4j — графовая база данных
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Константин Осипов (Mail.Ru)
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
ClickHouse как решение для бизнес аналитики. Дмитрий Кузьмин
C++ для web с помощью Emscripten
Ad

Viewers also liked (6)

PDF
Redis presentation
PPT
3rd Quarter Outlook Alabama Real Estate
PPTX
Real-time ASP.NET with SignalR
PDF
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
PDF
Redis 101
PDF
Generators: The Final Frontier
Redis presentation
3rd Quarter Outlook Alabama Real Estate
Real-time ASP.NET with SignalR
Очереди и блокировки. Теория и практика / Александр Календарев (ad1.ru)
Redis 101
Generators: The Final Frontier
Ad

Similar to Redis: возможности, выгоды, примеры использования (20)

PDF
Обзор Redis storage / Symfony Camp UA 2011
PDF
Purely practical data structures
PDF
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
PDF
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
PPTX
Cassandra
PDF
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
PPTX
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
PDF
Базы данных. Hash & Cache
PDF
Кеширование данных в БД
PDF
Nosql and Mongodb
PPTX
Опыт использования NoSQL-хранилищ (Андрей Новиков)
ODP
Новые нереляционные системы хранения данных
PPTX
IOP202 Redis in Azure
PPTX
MongoDB первые впечатления
PPTX
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
PDF
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
PPT
TreeDb key/value noSQL database
PDF
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)
Обзор Redis storage / Symfony Camp UA 2011
Purely practical data structures
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
Велосипедостраительство в NoSQL, строим собственное NoSQL хранилище
Cassandra
Cравнительный анализ хранилищ данных (Олег Царев, Кирилл Коринский)
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Базы данных. Hash & Cache
Кеширование данных в БД
Nosql and Mongodb
Опыт использования NoSQL-хранилищ (Андрей Новиков)
Новые нереляционные системы хранения данных
IOP202 Redis in Azure
MongoDB первые впечатления
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
Сравнительный анализ хранилищ данных, Олег Царев, Кирилл Коринский
TreeDb key/value noSQL database
Использование Tarantool для хранения чатов и лент друзей (Константин Осипов)

Redis: возможности, выгоды, примеры использования

  • 1. 1. Моделирование системы персестирования данных 2. Redis: возможности, выгоды, примеры использования Алексей Качаев Zend_Coffee&Code #3 Июль, 2011
  • 2. Алексей Качаев Senior/Lead PHP Developer at Cogniance 4+ года опыта c PHP 3+ года использования Zend Framework Активный участник zendframework.ru/forum ZF2 contributor
  • 4. О чем мы будем говорить 1. Что такое моделирование данных и при чем здесь DDD, DataMappers и т.д. 2. SQL, noSQL, lessSQL. 3. TTL, read/write rate, I/O, партицирование и шардинг. 4. Redis как пример key-value storage. 5. Mongo как пример документо-ориентированного хранилища.
  • 6. Независимость кода от хранилища Многие паттерны диктуют НЕЗАВИСИМОТЬ ХРАНИЛИЩА. К сожалению, для многих это так и остается просто декларацией выгоды паттернов. Плохо: создавать объекты по полям в таблице базы. Плохо: создавать поля в таблице по свойствам объекта. Нужно: понимать, что НЕЗАВИСИМОСТЬ должна быть ДВУХСТОРОННАЯ.
  • 8. MySQL - это не приговор, а NoSQL не существует 1. Key-value (Redis, Scalaris, TC, MemcacheDB) 2. Документ (MongoDB, CouchDB, Riak) 3. Семейства столбцов (Cassandra, HBase) 4. Граф (Neo4J) Зачем? - скорость - ресурсо-затратность - масштабируемость - доп. возможности Главное: Моделировать по логике, а не по sql-ности.
  • 10. TTL TTL = Time To Live -> среднее время между обновление единицы данных. Почему это важно? 1. Кеширование 2. TTL составной ноды информации = min(TTL частей) Пример. 1. Пользователи и их комментарии. JOIN отменяется. 2. Количество просмотров и попаданий в поисковую выдачу. Прощай кеш объявлений.
  • 11. Read/write rate Мало пишем, много читаем - SQL. Много пишем, редко читаем - NoSQL. Почему: 1. Персистентность и I/O 2. Индексы 3. Locks Например: 1. Статистика, аналитика 2. Real-time data 3. Действия пользователей и т.д.
  • 12. I/O Ресурс, о котором всегда забывают. Верхний предел существует и постоянно уменьшается. Примеры: 1. Сессии 2. Крупные блоки данных 3. Конкурентность I/O
  • 13. Конкурентность доступа 1. Locks при write операциях (запись, таблица) 2. "Выдавливаение" кеша из ограниченного стека 3. Атомарность или почему GET X; SET X+1 не работает.
  • 15. Что такое Redis? http://redis.io Не только key-value storage. 1. Очень большая скорость get/set операций 2. Expire для ключей 3. Асинхронная персистентность 4. Типы данных с внутренней оптимизацией 5. Репликация master-slave с поддержкой ветвления 6. Атомарные операции и транзакционность 7. Pub/sub
  • 16. Установка sudo -s cd /usr/local/lib wget http://redis.googlecode.com/files/redis-2.2.11.tar.gz tar xvzf redis-2.2.11.tar.gz cd redis-2.2.11 make ## sysctl vm.overcommit_memory=1 ln -s /usr/local/lib/redis-2.2.11/redis-server /usr/bin/redis-server
  • 17. Supervisor Отключить встроенную демонизацию! /etc/supervisor/conf.d/redis.conf [program:redis] command=/usr/bin/redis-server /etc/redis/redis.conf priority=10 autorestart=true autostart=true startsecs=10 startretries=3 stopsignal=QUIT stopwaitsecs=10 redirect_stderr=true stdout_logfile=/var/log/redis.log stdout_logfile_maxbytes=10MB
  • 18. Типы данных 1. BS String (get, set, incr, incrby, getset, до 1 гб) 2. List (связанный список, добавление O(1), захват по индексу O(n), [push | pop | insert], [set | index | rem], [range | trim]) 3. Set (неупорядоченный набор строк, хеш-таблица, сложность операций O(1), resize таблицы блокирующий, [sadd | srem | sismember | smove | spop], scard, smembers, [sdiff | sunion | sinter]) 4. Sorted set 5. Hashes
  • 19. Sorted Set Суть: коллекция строк с ассоциированными числами Скорость: получение элемента по оценке - O(1), обновеить значение оценки - O(n) Внутренняя реализация: через двойную структуру (двунаправленный список+хеш-таблица) Команды: ZADD key score member; ZREM key member; ZINCRBY key increment member ZRANK key member; ZREVRANK key member; ZRANGE key start end; ZREVRANGE key start end; ZRANGEBYSCORE key min max; ZCOUNT key min max; ZCARD key; ZSCORE key element; ZREMRANGEBYRANK key min max; ZREMRANGEBYSCORE key min max
  • 20. Redis Hash Суть: неупорядоченный набор соответствий между field и value. Удобно для: хранения объектов по одному ключу Сложность: Добавить, удалить, проверить поле - O(1), перебрать все поля и/или значения - O(n) Внутренняя реализация: для "маленьких" хешей - zipmap (медленнее, но компактно), для "больших" - hash table (быстро, но много) Команды: HSET key field value; HGET key field HMGET key field1 ... fieldN; HMSET key field1 value1 ... fieldN valueN HINCRBY key field integer HEXISTS key field; HDEL key field; HLEN key HKEYS key; HVALS key; HGETALL key
  • 21. Скорость, I/O и fsync Скорость до 100.000 записей в секунду. Чтение медленнее, чем запись в большинстве случаев. Два механизма персестирования: 1. Snapshot save 300 1000 dbfilename /var/redis/dump.rdb 2. AOF appendonly yes|no appendfsync always|everysec|no Оба персистера работают на уровне форка процесса. Механизм VM, SWAP и работа при дефиците (или искусственном ограничении) оперативной памяти.
  • 22. Атомарность операций и транзакции Атомарные счетчики: INCR, INCRBY, DECR, DECRBY Транзакции: 1. Все команды сериализуются и выполняются последовательно 2. Выполняются либо все команды, либо ни одной Команды: MULTI....EXEC or DISCARD (транзакция) WATCH key....MULTI....EXEC (оптимистичная блокировка)
  • 25. Решение специфических задач 0. Генерирование уникального ID для сущности при работе на нескольких серверах 1. Последнии 10 добавленных комментариев всеми пользователями (LPUSH, LRANGE) 2. Рейтинг игроков (ZADD, ZREVRANGE) http://codemehanika.org/blog/2011-07-15-redis-types- usage.html 3. Подсчет уникальных посетителей (SADD, SCARD) 4. Pub/sub, очереди, кеширование
  • 26. Мониторинг, деббаг и другое REDIS-CLI или TELNET 1. info, dbsize 2. monitor 3. debug object 4. config get|set 5. flushall, flushdb 6. bgsave, bgrewriteaof 7. slowlog