如何用redis打造一个AB测试系统
https://github.com/lloydzhou/redisab
总体设计
- 数据持久化到redis里面
- 大量使用redis-lua脚本(基本每一个接口都是使用redis-lua脚本实现,提升性能的同时,能利用redis-lua脚本的原子性达到类似事务的效果)
- 设计一个测试环境和正式环境,通过"X-Env"识别,数据通过redis db分开存储
- 通过"X-User-Id"传递user_id
- 设计一个控制台管理流量层和实验(登录使用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
- 首先build docker镜像
- 然后编译控制台页面
- 使用docker-compose启动项目
- 运行Makefile中的init-redis将redis-lua脚本load进去
接口
- 获取变量接口
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"}
- 回传指标接口
上传名字为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
- 创建一个名字叫layer1的流量层
- 在这个流量曾创建一个名字叫test1的实验
- 给这个实验创建两个版本(value=0/1)分别分配50%的流量
- 给这个实验创建一个叫做target1的指标
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。