背景
广告平台 adx 在处理曝光/点击上报时,使用 redis 的 setnx 命令去重,其逻辑如下
- 构造一个形如 s:track:%d:%s:%s 的 key,参数分别是上报类型(曝光 or 点击),请求 id,广告位 id
- setnx(redisKey, timestamp)
- 若返回值不为 1,说明本次上报为重复上报
- 若返回值为 1,设置过期时间为 24 小时
现在的需求就是减少此项去重业务所占用的 redis 内存
技术方案
方案一:简单通用
- value 置为 0,这样每个 key 节约了 8 字节
- 说明:虽然时间戳是 10 位数字,但 redis 会以 8 字节整数形式进行存储
- 简化 key,目前 key 的前缀太长,可以简化为 te/tc,表示曝光/点击上报
- 用广告序号来构造 key,而不是用广告位 id 构造 key,这样还能兼容一个广告位填充多个广告的情况
- 缩短过期时间
方案二:使用 hash
一次广告请求,实际上会导致多次广告上报
- 可能返回了多个广告
- 一个广告可能上报曝光和点击
如果一次下发了 10 个广告,每个广告都上报了曝光和点击,则要在 redis 里创建 20