sergechurkin/redisaggregate

测试示例:使用 PHP 在 Web 应用程序中实现强大报告的 Redis。

dev-master / 1.1.x-dev 2017-04-27 15:22 UTC

This package is not auto-updated.

Last update: 2024-09-26 18:29:17 UTC


README

测试示例:使用 PHP 在 Web 应用程序中实现强大报告的 Redis。

说明

考虑了使用 Redis 作为中间存储数据,在实现需要处理大量信息(如 PHP Web 应用程序)的报告时的可能性。在测试示例中探讨了不同数据加载和处理方法。与 Oracle 上的类似测试示例进行了比较。

描述

任务本质

Redis 被定位为一个非关系型数据库,在内存中存储数据。当需要快速处理数据,例如确保快速访问高负载的 Web 资源时,其应用非常有效。类似的问题也出现在 BI(商业智能)工具中,在 ETL(提取、转换、加载)系统中的中间处理任务中。例如,在 QlikView 中,数据处理也是在内存中实现的。因此,研究 Redis 在 ETL 和 BI 任务中的应用似乎很有趣。

测试示例描述

下图显示了测试示例的关系型数据模型。在 sales 表中反映了销售操作,这些操作将在计算过程中进行聚合。

Схема таблиц тестового примера

脚本 redisaggregate.sql 实现了该方案在 Oracle 上的实现。测试按照以下算法进行构建。在第一阶段,进行数据的程序生成

  • 在填充示例中的参考时,假定销售涉及 5 家供应商的商品,每家供应商提供 100 种产品。商品价格被取为 10 到 1000 之间的随机值。
  • 在模拟销售时,预计每个月有 1000 张收据,每张收据包含 10 种商品。不同供应商的商品在收据中的分布是随机的。因此,在销售表中形成了 300000 条记录。第二阶段涉及按各种指标(日期、供应商、收据、商品)对销售进行聚合,并允许指标组合。

测试方法和实现程序

测试在一台配备 2.2GHz 处理器、4GB 内存、Win7x64 操作系统的计算机上进行。使用 XAMPP 7.0.9。Redis_version:3.2.100。为 PHP 开发了程序,按照 MVC(模型-视图-控制器)模式。

  • 控制器类 - ControllerRedis.php
  • 所有逻辑都在模型中实现 - ModelRedis.php
  • 用于显示 Web 页面的库是 cform。应用程序具有以下菜单项
  • 生成数据。
  • 商品(查看 goods 表)。
  • 销售(查看 sales 表)。
  • 销售聚合。在此模式下,可以按日期、供应商、收据、商品等指标获取销售报告。Oracle 表的数据加载按照上述 createdata.sql 方程式进行。使用 Toad 程序进行聚合报告的 SQL 查询。

如何更快地将数据加载到 Redis 中?

Redis中数据加载有几种不同的方案。第一种方案是将每个表的字符串数据存储在一个Hash键中。总共使用了311504个键。第二种方案是将每个表存储在单独的键中,键的格式为json。总共使用了5个键。以下是根据存储方式生成的数据所需的时间。

从表中可以看出,如果使用大量的键来存储数据,记录的速度会显著减慢。现在我们来看看使用第一种和第二种方案时Redis和PHP的内存使用情况(包括存储数据和服务器运行所需的总体内存消耗)。

如果在Redis中关闭数据压缩,结果几乎没有变化。当键的数量较少时,Redis中的数据存储更紧凑,但需要更多的PHP资源来处理。在这种情况下,处理速度会更快,因为PHP处理数组速度非常快。

结果比较

下面将展示对300000次销售的数据聚合结果。在下面的表格中,展示了PHP内存消耗峰值和生成报告的时间。在Oracle中,使用SQL查询中的group by表达式进行聚合。

在第一种方案的计算中,算法使用循环遍历键(表格中的行),并将累积结果也存储在键中。从表中可以看出,这个方案运行速度较慢,但PHP所需的内存较少。在第二种方案的计算中,所有聚合都在PHP数组中执行,这要快得多,数据量越小,计算速度越快。值得注意的是,Oracle的查询执行速度更快,但写入表格的速度却慢得多。

结论

当使用少量键时,Redis在数据加载方面的速度相当可接受。同时,数据存储非常紧凑。因此,可以将这个数据库用作ETL和BI系统之间的缓冲区。当在PHP数组中实现算法时,聚合(报告生成)的速度会显著提高。总的来说,在相当大的数据量下,这种方法可以确保报告生成速度(大约1秒)的可接受性。

安装

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

Redis的配置参数和连接设置在params.php中设置。该应用程序已在packagist上注册:packagist