0%

实现频控

实现频控

在广告行业中,经常会有频控的限制,来防止同一个广告被同一个用户多次的访问

可以使用redis来实现频控,首先想一下redis存储的key是什么?我们要限制的是一波广告投放下同一个用户的访问次数,那么key可以设置为uid:campid,也就是用户id拼上投放id作为频控。

那么value存储什么内容呢?如果只是单纯的整个投放周期下的频控的话,那其实设置为访问次数就可以了。但是有的时候周期不是整个投放周期(如按天频控、按周频控、按月频控等)

使用使用以下逻辑

1
2
3
4
5
// 添加曝光
private void addExpose(String uid, String campaignId){
String key = uid+":"+campaignId;
jedis.lpush(key, String.valueOf(System.currentTimeMillis()));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 是否超频
private boolean isOver(String uid, String campaignId, long range,int limit) {
String key = uid+":"+campaignId;
long cur = System.currentTimeMillis();

List<String> exposes = jedis.lrange(key, 0, 10);//最大为10

int count = 0;
if (exposes == null || exposes.isEmpty()) {
return false;
} else {
for (String expose: exposes) {
long time = Long.parseLong(expose);
if (time > cur - range) {
count++;
} else {
break;
}
}
}
return count > limit;
}

欢迎关注我的其它发布渠道