我正在尝试用基于redis的实现替换Drupal 8的泛洪控制服务的sql实现。
请参阅https://github.com/drupal/drupal/blob/8.0.x/core/lib/Drupal/Core/Flood/DatabaseBackend.php
要求是这样的:
我对如何实现这一点的想法:
写下这一切之后,我可能真的知道它是如何工作的,所以我想我正在寻找的是关于这是否有意义或是否有更简单的方法的反馈。
每个事件:标识符组合是一个键并包含一个有序集。它使用到期作为分数,并将值用作唯一值,可能是以微秒为单位的创建时间。我计算未过期的记录以检测是否达到阈值。我正在更新每个事件的到期时间:标识符到提供的到期时间窗口,因此除非给定的标识符/客户端不放弃并继续尝试,否则它将被自动删除,而不会达到过期时间。是否值得清理一组内的记录,例如在做新注册时?它似乎相当快,我有时也只能这样做。
答案 0 :(得分:1)
我更愿意使用Redis的密钥过期功能,而不是重新实现一个。
更简单的替代方案是:
SETNX <identifier>:<event type> 1
如果响应为1,这是第一次尝试,因此您在此键上设置超时:
EXPIRE <identifier>:<event type> <timeout in seconds>
否则您会增加尝试次数
INCR <identifier>:<event type>
INCR的响应将为您提供窗口期间的尝试次数,因此您知道是否允许该操作。
如果需要存储更多数据(如给定时间窗口中允许的最大尝试次数),您还可以使用哈希而不是简单值。在这种情况下,您可能会使用HSETNX和HINCR。