dot Redis 8 来了——而且是开源的

了解更多

如何使用 Redis 构建实时 A/B 测试工具

对于在当今数字经济中竞争的营销人员和网站所有者来说,A/B 测试已成为不可或缺的资产。 它允许用户测试现有想法、试验新想法并突出显示哪些有效,哪些无效。

如果没有这些信息,尝试优化网页可能是一个令人沮丧且耗时的过程。 但不幸的是,A/B 测试软件可能很昂贵,这使得许多人无法获得它的好处。

但是,借助 Redis,程序员 Thiago Camargo 能够消除这些障碍,创建一种可以在实时运行的开放式 A/B 测试工具。 Redis 强大的数据处理功能允许用户试验他们选择的变量,并找到优化网页最有效的方法。

让我们来看看 Thiago 是如何将此应用程序组合在一起的。 但在我们进一步深入之前,我们想指出的是,我们在 Redis Launchpad 上有各种各样的创新应用程序供您探索。

因此,请务必在阅读完这篇文章后浏览一下!

https://www.youtube.com/embed/o6u1gq5RsbA
  1. 您将构建什么?
  2. 您需要什么?
  3. 架构
  4. 开始
  5. 它是如何工作的

1. 您将构建什么?

您将构建一个强大而简单的 A/B 测试工具,该工具可扩展并在实时运行。 下面,我们将向您展示如何从头开始构建此应用程序,突出显示所需的组件及其功能。

2. 您需要什么?

  • Kotlin用作开源编程语言,Google 也使用它来开发 Android 应用程序。
  • Gradle用作用于多语言软件开发的构建自动化工具。
  • Lettuce构建非阻塞响应式应用程序
  • RedisGraph稀疏矩阵以表示图中的邻接矩阵和线性代数以查询图
  • RedisTimeSeries允许您以超高效的方式摄取和查询数百万个样本和事件。
  • RedisJSON允许从 Redis 键存储、更新和获取 JSON 值

3. 架构

  • 根据您要在网站上测试的变量,在 Swagger 上创建一个实验。 此用户选择测试不同的颜色对销售额的影响。
  • 触发事件决定了哪些用户将自动注册参与该实验。
  • 注册订阅的用户将被记录为触发事件(转化)。 每个触发事件的颜色也将被记录下来以衡量结果。

什么是 A/B 测试?

A/B 测试也称为拆分测试,是指一种有条不紊的实验过程,其中向网站访问者展示变量的两个或多个版本,以确定哪个版本对转化率的影响更大。

它旨在明确您如何在市场上更有效地定位您的品牌、产品和服务。

假设您在您的网站上有一个产品要销售。 您可以试验的一个变量是产品旁边的号召性用语 (CTA) 按钮。 您可以通过多种不同的方式对 CTA 进行 A/B 测试,包括

  1. 放置
  2. 设计
  3. 颜色
  4. 大小
  5. 文案

通过拆分测试这些变量,您将发现哪个版本的 CTA 最适合推动转化。

4. 开始 

先决条件

  • Docker 
  • 安装 Gradle 7.2
  • Maven 3.8.1
  • 安装 OpenJDK
  • Swagger API 文档 

步骤 1:克隆存储库

$ git clone https://github.com/redis-developer/banda

步骤 2. 执行构建任务

$ gradle task
$ gradle wrapper
$ ./gradlew clean build

步骤 3:设置 Redis 模块

如果您使用的是 Docker Desktop,请确保为卷挂载启用文件共享选项。 使用下面的代码设置 Redis

docker run \
  -p 6379:6379 \
  -v /home/user/redis_data:/data \
  -it \
  redislabs/redismod \
  --loadmodule /usr/lib/redis/modules/rejson.so \
  --loadmodule /usr/lib/redis/modules/redistimeseries.so \
  --loadmodule /usr/lib/redis/modules/redisgraph.so \
  --dir /data

步骤 4. 运行应用程序

使用下面的代码启动 docker

docker run -p 8080:8080 -e BASE_URL -e PORT -e REDIS_URL com.xmppjingle/bjomeliga-docker-boot -ti

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.1.RELEASE)

2021-10-03 13:19:15.856  INFO 1 --- [           main] c.x.bjomeliga.BjomeligaApplicationKt     : Starting BjomeligaApplicationKt on b9002f934d84 with PID 1 (/bjomeliga-0.0.1-SNAPSHOT.jar started by root in /)
2021-10-03 13:19:15.863  INFO 1 --- [           main] c.x.bjomeliga.BjomeligaApplicationKt     : No active profile set, falling back to default profiles: default
2021-10-03 13:19:18.253  INFO 1 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!

它是如何工作的

实验 API

在这里,我们将向您展示如何创建具有基于触发器的加权注册的可扩展 A/B 测试实验。

如何创建实验

在此步骤中,我们将向您展示如何创建一个实验,使您可以对不同的变量进行 A/B 测试。 我们将把自己放在营销人员的位置,希望拆分测试不同的屏幕颜色,以了解它们对销售额的影响。

首先,请使用下面的代码。

curl --location --request POST 'localhost:8080/experiment' \
--header 'Content-Type: application/json' \
--data-raw '{
  "goalIds": [
    "purchase"
  ],
  "id": "subscription1",
  "triggerEventId": "user-plan-screen-view",
  "variants": {
    "variants": [
      {
        "id": "red",
        "params": {
          "additionalProp1": "string",
          "additionalProp2": "string",
          "additionalProp3": "string"
        },
        "weight": 20
      },
      {
        "id": "blue",
        "params": {
          "additionalProp1": "string",
          "additionalProp2": "string",
          "additionalProp3": "string"
        },
        "weight": 80
      }
 
    ]
  }
}'

值得注意的是,我们将顶部的“goalIds”更改为“purchase”,以衡量每种屏幕颜色产生的销售额。 在此之下,我们将实验的“id”设为“subscription1”。

为了确定触发事件,我们插入了“user-plan-screen-view”。 这意味着当事件被触发时,用户将自动注册参与该实验。

接下来,我们将变量标识为“red”和“blue”,因为这将是我们进行 A/B 测试的两个变量。

如何检索实验 

curl --location --request GET 'localhost:8080/experiment/subscription1'

回复。

{{
  "id": "subscription1",
  "variants": {
    "variants": [
      {
        "id": "red",
        "weight": 20,
        "params": {
          "additionalProp1": "string",
          "additionalProp2": "string",
          "additionalProp3": "string"
        }
      },
      {
        "id": "blue",
        "weight": 80,
        "params": {
          "additionalProp1": "string",
          "additionalProp2": "string",
          "additionalProp3": "string"
        }
      }
    ]
  },
  "triggerEventId": "user-plan-screen-view",
  "goalIds": [
    "purchase"
  ]
}

远程配置 API

在这里,我们将向您展示如何创建动态且可扩展的远程客户端配置服务(Firebase 替代方案)。

如何更新远程配置

curl --location --request POST 'localhost:8080/config' \
--header 'Content-Type: application/json' \
--data-raw '{
  "params": {
    "additionalProp1": "red",
    "additionalProp2": "green",
    "additionalProp3": "blue"
  },
  "userId": "pixel"
}'

如何检索远程配置

curl --location --request GET 'localhost:8080/config/pixel'

回复

{
  "userId": "pixel",
  "params": {
    "additionalProp1": "red",
    "additionalProp2": "green",
    "additionalProp3": "blue"
  }
}

事件 API

此步骤涉及时序事件索引。

如何推送事件

curl --location --request POST 'localhost:8080/events' \
--header 'Content-Type: application/json' \
--data-raw '{
  "category": "generic",
  "emitterId": "rickAstley",
  "id": "Rickrolling",
  "labels": {
    "channel": "youtube",
    "prankedBy": "steveTyler"
  },
  "retention": 900000,
  "type": "prank",
  "value": 100
}'

摘要 API – 通用摘要服务

这是一个简单而灵活的摘要服务,能够保存和维护多种类型应用程序的摘要。 这些包括:游戏记分牌、产品评级、用户评级、增量指标等等。

更新摘要

curl --location --request POST 'localhost:8080/summary' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": "abc",
    "transactionId": "3rd",
    "metrics": [
        {
            "id": "abc",
            "value": 2
        },
        {
            "id": "bcd",
            "value": 4
        },
           {
            "id": "fff",
            "value": 1
        }
    ]
}'

获取摘要

curl --location --request GET 'localhost:8080/summary/abc'

回复

{
    "id": "abc",
    "metrics": [
        {
            "id": "abc",
            "value": 6,
            "count": 3,
            "transactionIds": [
                "3rd",
                "2nd",
                "1st"
            ]
        },
        {
            "id": "bcd",
            "value": 12,
            "count": 3,
            "transactionIds": [
                "3rd",
                "2nd",
                "1st"
            ]
        },
        {
            "id": "fff",
            "value": 1,
            "count": 1,
            "transactionIds": [
                "3rd"
            ]
        }
    ]
}

抽屉 API – 通用键/值服务

灵活的属性存储

更新抽屉

curl --location --request POST 'localhost:8080/drawer/abc' \
--header 'Content-Type: application/json' \
--data-raw '{
    "id": "abc",
    "values": {
        "google" : "123",
        "fb": "abc"
        }
}'

获取抽屉

curl --location --request GET 'localhost:8080/drawer/abc'

回复

{
    "id": "abc",
    "values": {
        "google": "123",
        "fb": "abc",
        "insta": "1222"
    }
}

一些常用的 Redis 查询

下面使用的大多数命令都是使用 Lettuce Redis 命令注解实现的。

图形

  • enrollEmitterOnExperiment
GRAPH.QUERY experiments :cmd
  • fetchParticipantsOnExperiment
GRAPH.QUERY MATCH  (u:User)-[:participants]->(:Exp {id: '$experimentId'}) RETURN COUNT(u.id)
  • graphQuery
GRAPH.QUERY MERGE (:User {id: '$emitterId' })-[:participants]->(:Exp {id: '$experimentId' }

TimeSeries

  • pushEvent
TS.ADD :id * :value RETENTION :retention LABELS category :category type :type :labels

JSON

  • setObject
JSON.SET :id . :json")
  • getObject
JSON.GET :id .")
  • setPathValue
JSON.SET :id :path :value
  • getPathValue
JSON.GET :id :path

核心

  • HSET
  • HGET / HGETALL
  • HEXISTS
  • ...

结论:让每个人都能访问 A/B 测试

A/B 测试已成为在当今数字领域竞争的任何营销人员不可或缺的一部分。 但是获取此软件可能很昂贵,迫使许多人使用次优网站进行运营。 更糟糕的是,创建您的拆分测试软件本身也存在编程难题。

创建这样一个应用程序需要一个多功能且功能强大的数据库,该数据库能够高效地在组件之间传输数据。 然而,尽管存在这些障碍,Redis 还是消除了所有这些障碍。

只需在您的笔记本电脑上使用 Redis,您就可以对网站上的任何变量进行 A/B 测试,并将自己与目标市场联系起来。 如果您想了解更多关于此应用程序是如何制作的信息,请务必观看此 YouTube 视频

然而,尽管有这些需求,Redis 的高级数据处理功能使组件之间的数据传输既超高效又可靠,从而创建了一个高度响应的应用程序。

这意味着没有延迟、没有延误,也没有用户与应用程序之间产生摩擦的原因。 只需在您的笔记本电脑上使用 Redis,您就可以对网站上的任何变量进行 A/B 测试,并将自己与目标市场联系起来。

如果您想了解更多关于此应用程序是如何制作的信息,请务必观看此 YouTube 视频

如果您喜欢这篇文章,那么我们还有更多内容供您在 Redis Launchpad 上探索。 从创建实时车辆跟踪系统,到构建强大的无人机系统,以保护发展中国家的作物保险公司,世界各地的程序员都在利用 Redis 来改善日常生活。 

您可以用 Redis 做什么?

谁创建了这个应用程序?

Thiago Camargo

如果您喜欢这个应用程序,那么请务必访问 Thiago 的 GitHub 页面,以了解他参与的所有最新项目。