PHPackages                             sergechurkin/redisaggregate - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. sergechurkin/redisaggregate

ActiveReport[Database &amp; ORM](/categories/database)

sergechurkin/redisaggregate
===========================

Test example for use Redis on PHP to realise strong report as a WEB application.

05PHP

Since Apr 27Pushed 9y agoCompare

[ Source](https://github.com/sergechurkin/redisaggregate)[ Packagist](https://packagist.org/packages/sergechurkin/redisaggregate)[ RSS](/packages/sergechurkin-redisaggregate/feed)WikiDiscussions master Synced yesterday

READMEChangelogDependenciesVersions (1)Used By (0)

redisaggregate
==============

[](#redisaggregate)

Test example for use Redis on PHP to realise strong report as a WEB application.

### Аннотация

[](#аннотация)

Рассмотрена возможность использования Redis для промежуточного хранения данных при реализации отчетов, требующих обработки больших массивов информации, как WEB приложений на PHP. На тестовом примере рассматриваются различные способы загрузки и обработки данных. Дается сравнение с реализацией аналогичного тестового примера на Oracle.

Описание
--------

[](#описание)

### Суть задачи

[](#суть-задачи)

[Redis](https://cloud.github.com/downloads/kondratovich/the-little-redis-book/redis-ru.pdf) позиционируется как не реляционная СУБД, хранящая данные в оперативной памяти. Её применение эффективно, когда важна скорость обработки, например, для обеспечения быстрого доступа к очень загруженным WEB ресурсам. Подобная проблема возникает также [BI](https://ru.wikipedia.org/wiki/Business_Intelligence) (Business Intelligence) инструментах, в задачах промежуточной обработки в [ETL](https://ru.wikipedia.org/wiki/ETL)(Extract, Transform, Load) системах. Например, в [QlikView](http://www.qlik.com/us/products/qlikview) обработка данных реализована тоже в оперативной памяти. В связи с этим представляется интересным посмотреть, насколько можно приспособить Redis к решению задач ETL и BI.

### Описание тестового примера

[](#описание-тестового-примера)

На рисунке ниже изображена реляционная модель данных тестового примера. В таблице `sales` отражаются операции продаж, которые будут агрегированы в процессе расчетов.

[![Схема таблиц тестового примера](https://github.com/sergechurkin/redisaggregate/raw/master/redisaggregate.png)](https://github.com/sergechurkin/redisaggregate/blob/master/redisaggregate.png)

Скрипт `redisaggregate.sql` реализует данную схему на Oracle. Тест строился по следующему алгоритму. На первом этапе производится программная генерация данных:

- При заполнении справочников в примере было принято, что в продажах участвуют товары 5 поставщиков, каждый из которых предоставляет по 100 наименований изделий. Цена товара бралась как случайная величина в диапазоне от 10 до 1000.
- При моделировании продаж предполагалось, что в каждый их 30 дней покупки фиксируются в 1000 чеках, в каждом по 10 товаров. Распределение товаров разных поставщиков по чекам - случайны. Таким образом, в таблице продаж формируется 300000 записей. Второй этап предполагал агрегирование продаж по по различным показателям (дата, поставщик, чек, товар) с возможностью комбинации показателей.

### Методика тестирования и ее реализующая программа

[](#методика-тестирования-и-ее-реализующая-программа)

Тестирование проводилось на компьютере с процессором 2.2ГГц, ОЗУ 4Гб, ОС Win7x64. [XAMPP](https://www.apachefriends.org/download.html) 7.0.9. Redis\_version:3.2.100. Для тестирования на PHP была разработана программа программа по схеме [MVC](https://ru.wikipedia.org/wiki/Model-View-Controller):

- Класс контроллер - `ControllerRedis.php`.
- Вся логика реализована в модели - `ModelRedis.php`.
- Для отображения WEB страниц использована библиотека [cform](https://github.com/sergechurkin/cform). Приложение имеет следующие пункты меню:
- Генерировать данные.
- Товары (просмотр таблицы `goods`).
- Продажи (просмотр таблицы `sales`).
- Агрегирование продаж. В этом режиме можно получить отчет по продажам агрегированный по показателям: дата, поставщик, чек, товар. Загрузка данных в таблицы Oracle производилось в соответствии с приведенной выше схемой процедурой `createdata.sql`. Получение агрегированных отчетов SQL запросами в программе Toad.

### Как лучше и быстрее загружать данные в Redis?

[](#как-лучше-и-быстрее-загружать-данные-в-redis)

Возможны различные варианты загрузки данных в ключи Redis. Первый вариант предусматривал хранение в одном `Hash` ключе одной строки каждой таблицы. Всего используется 311504 ключа. Во втором варианте каждая таблица хранилась в отдельном ключе в формате `json`. Всего используется 5 ключей. Ниже приведено время генерации данных в зависимости от способа хранения.

ПроцессRedis. Каждый ключ содержит 1 строку таблицыRedis. Ключ содержит таблицу целикомOracleГенерация данных. с84.5420.359136Очистка таблиц, с0.3110.00375Из таблицы видно, что если хранить данные в большом количестве ключей, запись происходят значительно медленнее. Посмотрим теперь на расход оперативной памяти в Redis (приведен суммарный расход на хранение данных и служебные нужды) и PHP при использовании первого и второго варианта.

ПроцессRedis/PHP. Каждый ключ содержит 1 строку таблицыRedis/PHP. Ключ содержит таблицу целикомГенерация данных. Мб52.15/9.5217.23/31.52Очистка таблиц, Мб0.66/1.530.66/1.52Если в Redis отключить сжатие данных, результаты практически не изменяются. При небольшом количестве ключей данные в Redis хранятся компактнее, зато требуется больше ресурсов PHP для обработки. При этом скорость обработки значительно выше за счет высокой скорости работы PHP с массивами.

### Сравнение результатов

[](#сравнение-результатов)

Рассмотрим результаты агрегации 300000 продаж. В таблицах ниже приведен пик расхода памяти PHP и время формирования отчета. В Oracle агрегирование проводилось SQL запросами с выражением `group by`.

Агрегация по параметрамRedis. Каждый ключ содержит 1 строку таблицыRedis. Ключ содержит таблицу целикомКоличество строк в результатеПоставщик, Мб27.5377.525Дата, Мб25.5379.5230Дата и поставщик, Мб25.5371.52150Товар, Мб23.5375.52500Дата и Товар, Мб19.5377.5215000Агрегация по параметрамRedis. Каждый ключ содержит 1 строку таблицыRedis. Ключ содержит таблицу целикомOraclreПоставщик, с122.7021.0550.140Дата, с70.4220.9870.112Дата и поставщик, с99.6971.3010.336Товар, с70.3741.0390.483Дата и товар, с89.9621.3480.616При расчете по первому варианту алгоритм предусматривал циклический перебор ключей (строк таблицы) с хранением накопленного результата также в ключах. Как видно из таблиц, этот вариант работает гораздо медленнее, но требует меньше памяти PHP. При расчете по второму варианту все агрегирование выполнялось в массивах PHP, что гораздо быстрее, причем, чем меньше данных в результате, чем быстрее расчет. Следует отметить, что запросы Oracle выполняются быстрее, но запись в таблицы осуществляется значительно медленнее.

### Выводы

[](#выводы)

Redis демонстрирует вполне приемлемую скорость при загрузке данных при использовании небольшого количества ключей. При этом данные хранятся очень компактно. Поэтому эту БД можно использовать как буфер между ETL и BI системами. Агрегирование (формирование отчета) значительно быстрее при реализации алгоритма в массивах PHP. В целом, при достаточно довольно большом объеме данных подобный подход позволяет обеспечить приемлемую скорость формирования отчета (около 1 секунды).

Установка
---------

[](#установка)

```
composer create-project sergechurkin/redisaggregate redisaggregate "1.1.x-dev"

```

Параметры настройки и подключения к серверу Redis задаются в `params.php`. Приложение зарегистрировано на [packagist](https://packagist.org/packages/sergechurkin/redisaggregate).

###  Health Score

19

—

LowBetter than 9% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/24965233?v=4)[sergechurkin](/maintainers/sergechurkin)[@sergechurkin](https://github.com/sergechurkin)

---

Top Contributors

[![sergechurkin](https://avatars.githubusercontent.com/u/24965233?v=4)](https://github.com/sergechurkin "sergechurkin (2 commits)")

### Embed Badge

![Health badge](/badges/sergechurkin-redisaggregate/health.svg)

```
[![Health](https://phpackages.com/badges/sergechurkin-redisaggregate/health.svg)](https://phpackages.com/packages/sergechurkin-redisaggregate)
```

###  Alternatives

[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k116.5M113](/packages/jdorn-sql-formatter)[propel/propel1

Propel is an open-source Object-Relational Mapping (ORM) for PHP5.

8351.6M87](/packages/propel-propel1)[jfelder/oracledb

Oracle DB driver for Laravel

11518.4k](/packages/jfelder-oracledb)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
