Пути увеличения эффективности реализации алгоритмов машинного обучения
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
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