实现频控
在广告行业中,经常会有频控的限制,来防止同一个广告被同一个用户多次的访问
可以使用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);
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; }
|