【发布时间】:2012-01-27 05:06:09
【问题描述】:
我需要一种方法来快速检查某个 IP 地址是否属于多个禁止 IP 范围之一。
我目前使用 iptables 来检查 IP 是否在指定范围内。这适用于几千个范围,但这个数字即将急剧增加到几十万,并将继续增长。
我当前向 iptables 添加新规则的方法的另一个问题是重复的数量不断增加。
在将 IP 或范围添加到规则集之前,我需要一种有效的方法来检查 IP 或范围是否属于现有(更大)范围。
Ruby 是我最熟悉的语言,但是对于不断增长的范围数量来说,哪些数据结构是最佳选择?
我想出的一个解决方案是使用 Redis 集合或 MongoDB 将单个 IP 存储为整数,然后简单地检查 IP 是否存在于集合中......但我的直觉告诉我必须有一个更聪明的方法。
如果我要将 IP 转换为整数并存储范围,那么遍历范围以查看新 IP 或范围是否已被现有更大范围包含的最佳方法是什么?
最后一点:速度比内存成本更重要。
【问题讨论】:
标签: ruby performance mongodb redis iptables