学习

如何在 AWS 平台上使用 NodeJS 和 Redis 构建和部署自己的分析仪表板

交互式分析仪表板可以满足多种目的。它们允许您共享数据,并提供所有这些重要信息,以便您以更快的速度做出改变游戏规则的决策。使用传统的数据库构建实时动态仪表板可能需要一组复杂的查询。通过使用 NoSQL 数据库(如 Redis),您可以使用少量 Redis 命令构建功能强大的交互式动态仪表板。


让我们看看这是如何实现的。

  • 您将构建什么?
  • 您需要什么?
  • 入门
  • 它是如何工作的?
  • 数据是如何存储的
  • 浏览应用程序

您将构建什么?
您将使用 NodeJS(JavaScript)构建一个使用 Redis 位图的分析仪表板应用程序,然后将其部署到 AWS。准备好了吗?好的,让我们直接开始。


    您需要什么?

  • NodeJS: 用作一个开源、跨平台的后端 JavaScript 运行时环境,可在 Web 浏览器之外执行 JavaScript 代码。
    Redis 云: 用作实时数据库、缓存和消息代理。
  • NPM: 用作包管理器。它允许您构建节点应用程序。

入门

准备环境


安装 Node - v12.19.0

  • 安装 NPM - v6.14.8

步骤 1. 注册免费的 Redis 云帐户

注册免费的 Redis 云帐户


在创建新的订阅时,选择 AWS 作为云供应商。在数据库创建过程结束时,您将获得一个 Redis 云数据库端点和密码。您可以保存它供以后使用。


步骤 2. 克隆存储库

 git clone https://github.com/redis-developer/basic-analytics-dashboard-redis-bitmaps-nodejs

步骤 3. 设置一个后端环境

首先,我们将设置环境变量

转到 /server 文件夹(cd ./server),然后执行以下命令
 cp .env.example .env
打开 .env 文件,添加 Redis 云数据库端点 URL、端口和密码,如下所示
PORT=3000

# Host and a port. Can be with `redis://` or without.
# Host and a port encoded in redis uri take precedence over other environment variable.
# preferable
REDIS_ENDPOINT_URI=redis://redis-XXXX.c212.ap-south-1-1.ec2.cloud.redislabs.com:15564

# Or you can set it here (ie. for docker development)
REDIS_HOST=redis-XXXX.c212.ap-south-1-1.ec2.cloud.redislabs.com
REDIS_PORT=XXXX

# You can set password here
REDIS_PASSWORD=reXXX

COMPOSE_PROJECT_NAME=redis-analytics-bitmaps

步骤 4. 安装依赖项

 npm install

步骤 5. 运行后端

 npm run dev

步骤 6. 设置前端环境

转到 client 文件夹 (cd ./client) 然后

 cp .env.example .env
将您选择的 VUE_APP_API_URL 参数的准确 URL 路径和端口号添加到下面
VUE_APP_API_URL=https://localhost:3000

步骤 7. 安装依赖项

 npm install

步骤 8. 运行前端

 npm run serve

它是如何工作的?

数据是如何存储的?

事件数据存储在各种键和数据类型中,下面将讨论。

对于每个时间跨度:
  • 年份:如 2021
  • 月份:如 2021-03(表示 2021 年 3 月)
  • 日期:如 2021-03-03(表示 2021 年 3 月 3 日)
  • 周数:如 2021-03/4(表示 2021 年 3 月的第 4 周)
  • 任何时间

对于每个范围:
  • 来源
  • 行动
  • 来源 + 行动
  • 行动 + 页面
  • 用户 ID + 行动
  • 全球

对于每个数据类型/类型:
  • 计数(存储为字符串的整数)
  • 位图

它使用以下命名约定生成键

 rab:{type}[:custom:{customName}][:user:{userId}][:source:{source}][:action:{action}][:page:{page}]:timeSpan:{timeSpan}

其中 [] 中的值是可选的。

对于每个生成的键,如 rab:count:*,数据存储方式如下: INCR {key}

示例
 INCR rab:count:action:addToCart:timeSpan:2015-12/3
对于每个生成的键,如: rab:set:*,数据存储方式如下:
 SADD {key} {userId}
示例
SADD rab:set:action:addToCart:timeSpan:2015-12/3 8
对于每个生成的键,如 rab:bitmap:*,数据存储方式如下:
 SETBIT {key} {userId} 1
示例
 SETBIT rab:bitmap:action:addToCart:timeSpan:2015-12/3 8 1

队列数据

  • 我们存储注册用户和随后购买了一些产品的用户(行动顺序很重要)。
  • 对于 12 月的每次购买操作,我们首先检查用户是否执行了注册操作(注册计数必须大于零)。
  • 如果是,我们将用户位设置为 1
示例
 SETBIT rab:bitmap:custom:cohort-buy:timeSpan:{timeSpan} {userId} 1
  • 示例 - 用户 ID 2 在 2015-12-17 购买了 2 件商品。它将不会被存储。
  • 示例 - 用户 ID 10 在 2015-12-17 购买了 1 件商品,并在 2015-12-16 注册。因此,它将存储如下
SETBIT rab:bitmap:custom:cohort-buy:timeSpan:2015-12 10 1
  • 我们假设用户不能在没有注册的情况下购买。

保留数据

  • 保留是指在两个不同日期购买商品的用户

  • 对于每次购买操作,我们检查用户是否在任何时间购买了比在特定日期购买的更多商品(不包括当前购买)。

  • 如果是,我们将用户 ID 添加到集合中,如下所示

SADD rab:set:custom:retention-buy:timeSpan:{timeSpan} {userId}
  • 示例 - 用户 ID 5 在 2015-12-15 购买了 3 件商品。他的保留信息不会被存储(在特定日期购买的商品:2,在任何时间购买的商品:0)。

  • 示例 - 用户ID 3 在 2015-12-15 之前购买了 1 件产品,在 2015-12-13 之前购买了 1 件产品。他的保留率将被存储(特定日期购买的产品:0,任何时候购买的产品:1)如下

SADD rab:set:custom:retention-buy:timeSpan:2015-12

如何访问数据:

总流量:

12 月
BITCOUNT rab:bitmap:custom:global:timeSpan:2015-12```
12 月第 X 周
  BITCOUNT rab:bitmap:custom:global:timeSpan:2015-12/{X}
示例
BITCOUNT rab:bitmap:custom:global:timeSpan:2015-12/3

每个页面流量({页面} 为以下之一:首页,产品 1,产品 2,产品 3):

12 月
 BITCOUNT rab:bitmap:action:visit:page:{page}:timeSpan:2015-12
示例
BITCOUNT rab:bitmap:action:visit:page:homepage:timeSpan:2015-12
12 月第 X 周
BITCOUNT rab:bitmap:action:visit:page:{page}:timeSpan:2015-12/{X}
示例
BITCOUNT rab:bitmap:action:visit:page:product1:timeSpan:2015-12/2

每个来源流量({来源} 为以下之一:Google,Facebook,电子邮件,直接访问,推荐,无):

12 月
 BITCOUNT rab:bitmap:source:{source}:timeSpan:2015-12
示例
BITCOUNT rab:bitmap:source:referral:timeSpan:2015-12
12 月第 X 周
BITCOUNT rab:bitmap:source:{source}:timeSpan:2015-12/{X}
示例
BITCOUNT rab:bitmap:source:google:timeSpan:2015-12/1
趋势流量({页面} 为以下之一:首页,产品 1,产品 2,产品 3):
12 月:

BITCOUNT rab:bitmap:action:visit:{page}:timeSpan:2015-12-01
 BITCOUNT rab:bitmap:action:visit:{page}:timeSpan:2015-12-31
  • 12 月第一周:与上述类似,但时间范围为 2015-12-01 到 2015-12-07
  • 12 月第二周:与上述类似,但时间范围为 2015-12-08 到 2015-12-14
  • 12 月第三周:与上述类似,但时间范围为 2015-12-15 到 2015-12-21
  • 12 月第四周:与上述类似,但时间范围为 2015-12-22 到 2015-12-28
  • 12 月第五周:与上述类似,但时间范围为 2015-12-29 到 2015-12-31
示例
 BITCOUNT rab:bitmap:action:visit:homepage:timeSpan:2015-12-29 => BITCOUNT rab:bitmap:action:visit:homepage:timeSpan:2015-12-30 => BITCOUNT rab:bitmap:action:visit:homepage:timeSpan:2015-12-31

总共购买的产品数量:

12 月
 GET rab:count:action:buy:timeSpan:2015-12
12 月第 X 周
 GET rab:count:action:buy:timeSpan:2015-12/{X}
示例
GET rab:count:action:buy:timeSpan:2015-12/1