乐趣区

关于redis:如何用redis打造一个AB测试系统

如何用 redis 打造一个 AB 测试零碎

https://github.com/lloydzhou/redisab

总体设计

  1. 数据长久化到 redis 外面
  2. 大量应用 redis-lua 脚本(根本每一个接口都是应用 redis-lua 脚本实现,晋升性能的同时,能利用 redis-lua 脚本的原子性达到相似事务的成果)
  3. 设计一个测试环境和正式环境,通过 ”X-Env” 辨认,数据通过 redis db 离开存储
  4. 通过 ”X-User-Id” 传递 user_id
  5. 设计一个控制台治理流量层和试验(登录应用 http auth_basic)

murmurhash2

  local ffi = require "ffi"
  ffi.cdef[[
    typedef unsigned char u_char;
    uint32_t ngx_murmur_hash2(u_char *data, size_t len);
  ]]
  murmurhash2 = function(value)
    return tonumber(ffi.C.ngx_murmur_hash2(ffi.cast('uint8_t *', value), #value))
  end

启动我的项目

Makefile 中曾经将各个工作综合起来,独自运行一下 make 命令就能够实现整个流程

make
  1. 首先 build docker 镜像
  2. 而后编译控制台页面
  3. 应用 docker-compose 启动我的项目
  4. 运行 Makefile 中的 init-redis 将 redis-lua 脚本 load 进去

接口

  1. 获取变量接口
curl "localhost:8011/ab/var?name=var1" -H 'X-Env: dev' -H 'X-User-Id: 0001'

--> 

返回以后 user_id(0001)在这个试验中调配的变量: 类型是数字,值为 2
{"value":"2","msg":"success","layer":"layer1","code":0,"hash":838060847,"test":"test1","type":"number"}
  1. 回传指标接口
上传名字为 target1 的指标,代表 user_id=0001 这个用户在以后试验版本下产生转化的指标
curl "localhost:8011/ab/track?name=var1" -H 'X-Env: dev' -H 'X-User-Id: 0001' -d '{"target1": 1}'

--> 

{"msg":"success","code":0}

demo

  1. 创立一个名字叫 layer1 的流量层

  1. 在这个流量曾创立一个名字叫 test1 的试验
  2. 给这个试验创立两个版本 (value=0/1) 别离调配 50% 的流量
  3. 给这个试验创立一个叫做 target1 的指标


退出移动版