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