3. План доклада
• Что лечим: Область применения, постановка задачи.
• Тестируем лекарство: Синтетические бенчмарки.
• Механика применения: Советы по использованию.
• Обмен опытом, обсуждение
4. Область применения: онлайн каталоги
• Интернет-магазины, блоги, аукционы, сайты объявлений,
знакомств, соц. сети…
• Основные запросы: чтение списка «товаров» с фасетным
поиском, страница «товара»
• Информация часто меняется – счетчики лайков, цены, наличие,
дата последнего комментария
• Множество блоков «смотрите также», «аксессуары», «еще на эту
тему», «сейчас обсуждают» и т.д.
9. Постановка задачи
• Сокращение времени генерации страницы
• Избавление от кэшей и необходимости их валидации
• Применение удобных для разработки языков
• Упрощение архитектуры, сокращение кол-ва элементов
11. Предпосылки: Junk-информация
Junk информация:
• Посты, лайки, комменты, описания товаров, рекомендации
товаров, статистика кликов, чат-сообщения, счетчики нового
• Не требует 100% целостности
Транзакционная информация:
• Цены, платежи, заказы
Медиа информация:
• Картинки, видео, аудио
12. Предпосылки: умные и быстрые
клиенты
• Развитие стандартов HTML5, JavaScript: ECMA-262, edition 5
• Развитие клиентских библиотек: AngularJS, EmberJS, … много
• Развитие клиентского железа: память, процессоры
• Развитие поисковиков: Google _escaped_fragment_
13. Типичный представитель логики в вебсервере: PHP+MySQL+MemCached
• постоянный маршаллинг данных PHP - MySQL - Memcached
• процессы инициализации фреймворка при каждом вызове
• кэши и механизмы их инвалидации
• нормализованная структура данных и множество операций JOIN
таблиц
• обращения к ФС, в том числе со стороны БД
• часто борьба с транзакциями там, где они не нужны
16. Тестируем на данных блога
•
•
•
•
Топик - id, название, дата, анонс, картинка, пара счетчиков, author_id
Автор - id, имя, аватар
3000 топиков, 1200 авторов
Получаем JSON со списком всех топиков и списком уникальных
авторов
• Embedding = SQL JOIN, дублирование данных
• Sideloading = сокращение объема данных, передача только
уникальных объектов
20. Выводы
• MySQL + Memcached это очень быстро для простых запросов
• JSON функции в Postgres медленные
• Redis не хватает многопоточной версии
Исходные коды тестов:
https://github.com/Mitek99/dblogic-benchmark
21. Тестируем выборки с суммированием
25
20
15
1 поток
8 потоков
10
5
0
PHP + MySQL
* ZUNIONSTORE + Sorted Set = очень медленно
Redis + Lua
25. Выводы
• MySQL и Postgres сами по себе очень быстрые
• Медленными оказываются «движки» с плагинами
• Логику на Redis+Lua писать можно и даже приятно
• Сразу проектировать Master-Master репликацию уровня
приложения
• Redis можно и нужно оптимизировать
26.
27. Хранение, индексы, сортировки и
выборки
• WHERE FIELD=VALUE
Создаем тэг “FIELD=VALUE” и ключ типа SET со
множеством ID записей имеющих этот тэг.
Используем SINTERSTORE или SUNIONSTORE
• ORDER BY … LIMIT N
Создаем SORTED SET и используем ZINTERSTORE для
выборки отсортированных элементов, потом
ZRANGE для выбора N первых элементов
• GROUP BY
Создаем SORTED SET и используем ZINTERSTORE для
выборки отсортированных элементов
28. Возможности библиотеки RNode
• Создание и обновление индексов
• Выборки с ограничениями по тэгам
• Суммирование по тэгам для построения фильтров
• Sideloading связанных объектов
• …Постоянно развивается
• Доступно на GitHub: https://github.com/Mitek99/rnode