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:[email protected]
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/O2. Индексы3. Locks
Например:1. Статистика, аналитика2. Real-time data3. Действия пользователей и т.д.
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/libwget http://redis.googlecode.com/files/redis-2.2.11.tar.gztar xvzf redis-2.2.11.tar.gzcd redis-2.2.11make
## sysctl vm.overcommit_memory=1ln -s /usr/local/lib/redis-2.2.11/redis-server /usr/bin/redis-server
Supervisor
[program:redis]command=/usr/bin/redis-server /etc/redis/redis.confpriority=10autorestart=trueautostart=truestartsecs=10startretries=3stopsignal=QUITstopwaitsecs=10redirect_stderr=truestdout_logfile=/var/log/redis.logstdout_logfile_maxbytes=10MB
Отключить встроенную демонизацию!
/etc/supervisor/conf.d/redis.conf
Типы данных
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 memberZRANK 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 integerHEXISTS key field; HDEL key field; HLEN key HKEYS key; HVALS key; HGETALL key
Скорость, I/O и fsyncСкорость до 100.000 записей в секунду. Чтение медленнее, чем запись в большинстве случаев.
Два механизма персестирования: 1. Snapshotsave 300 1000 dbfilename /var/redis/dump.rdb2. AOF appendonly yes|noappendfsync 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, dbsize2. monitor3. debug object4. config get|set5. flushall, flushdb6. bgsave, bgrewriteaof7. slowlog
Спасибо за внимание!
Вопросы???