实施反垃圾邮件功能?

时间:2019-12-28 20:09:59

标签: redis spam-prevention

在我的应用程序中,我正在发送不同类型的广告系列(Web推送通知,SMS,电子邮件,Android通知)以吸引5000万用户。现在,我想实现反垃圾邮件功能,以便可以根据用户的广告系列发送历史或更简单地过滤用户,我希望限制每天/每周/每月发送给用户的广告系列数量。

所以想法是使用Redis实现反垃圾邮件功能。我有用户列表,我需要为每个用户检查Redis中是否有特定用户有资格发送广告系列。资格标准可以是每天仅发送3个Web推送通知,也可以是最近7天仅发送5个Web推送通知。 我可能在redis中输入的键将是(projectId + domainId + userId + capaignType + day),值将是数字,即为count。

上面的键值结构可以很高兴地回答我的查询,例如一天仅发送3个Web推送通知,但是当我想在移动时间窗口中过滤用户时,例如最近7天仅发送5个Web推送通知,因此我需要获取所有7天的用户发送历史记录,然后执行比较操作。

这将是一个好的解决方案,还是我可以做得更好?欢迎您进一步提出实施反垃圾邮件功能的想法。

2 个答案:

答案 0 :(得分:0)

您可以使用ttl(生存时间)保存值,即设置该值的到期时间。在广告系列开始时,根据需要设置到期时间。然后,您的应用程序将仅获得仍然符合通知条件的那些值(用户ID)。

答案 1 :(得分:0)

您可以使用RedisBloom模块中包含的七个杜鹃过滤器。

在发送通知之前,您可以使用CF.COUNT来检查它是否在最新的过滤器中出现3次,或者在所有过滤器中是否存在5次以上。如果是这样,您将不会发送通知,否则,您将发送通知,然后使用CF.ADD将元素插入过滤器。

您将必须自己管理不同的过滤器,但是使用自动创建和删除/重新启动过滤器的过程应该很容易。

对于用户数量,您描述的内存消耗约为7(过滤器)* 10000000(用户)* 3(每日限制)* 1(每项字节)〜210MB(使用

我对初始化参数的建议是: CF.RESERVE键30000000铲斗尺寸3。 较小的init大小是因为过滤器会自动扩展,因此您不必提前分配全部内存。在运行计数查询时,存储桶大小3可以节省大量内存访问。

如果您要使用此解决方案,请告诉我它是如何工作的。

相关问题