【问题标题】:string searching / wild-card matching字符串搜索/通配符匹配
【发布时间】:2011-03-26 21:46:36
【问题描述】:

我目前在做一个比较小的项目给我公司玩玩,它基本上是node.js中的一个代理,现在的功能比较简单

  • 缓存
  • Http(s)
  • 黑名单
  • 可配置

我正处于构建黑名单系统的阶段,我的黑名单文件是一个普通文件,每个黑名单站点都在一行中。

现在将构建黑名单,以便您可以将以下类型的值列入黑名单:

  • google.com
  • google.com/path
  • ww2.google.com/path
  • 202.55.66.201
  • 202.55.66.[100-200]

现在在 node.js 中,当请求进来时,我可以使用来自客户端的请求 URL,然后将在 IP 缓存文件中查找它,如果它不存在,它会被 ping 通,我得到该请求的 IP。

所以手头有一些信息,1 是域,2 是 IP,3 是端口。

现在的问题是找到最快的方法来对照基于文件的黑名单检查这些值。

由于这些值不是直接查找,我不确定是否将 then 放入对象并执行:

if(ip in blacklist || domain in blacklist || fullUri in blacklist)
{
    //block
}

即使我这样做了,它也没有什么好处,因为我无法检查 IP 范围等,它缺乏对要求更高的站点黑名单技术的支持。

我在考虑某种数据库系统,但这是我想避免的,所以基本上我要问的是有什么方法可以在数据文件上执行通配符查找而不会造成太多开销。

【问题讨论】:

    标签: file-io node.js performance wildcard


    【解决方案1】:

    我认为更有效的方法是循环文件的每一行,并与您的信息进行比较 - 也允许模式匹配 - 所以在伪代码中:

    each file as line
        if line equal ip or line eq domain or line match 134.567.987.[0-9]{1-3}
            then block and break
    

    【讨论】:

    • 如果有 2K 个域被列入黑名单,你的意思是我应该做(2 个直接查找和 1 个正则表达式)* 每个请求 2000,而不是常规 epressions,我更喜欢使用字符串函数,例如作为拆分,获取 [100-200] 的最小值和最大值,然后为最后一个知道的点和 <=> 做一个子字符串来比较范围,但仍然感觉它可以更好地处理,例如 {FULL_IP : {a,b,c,d}} abcd 是 ip 的每一段。
    • 将是您设计的任何测试的 2K - 假设您正在从单行包含黑名单项目的文本文件中读取。您可以将所有内容放在一个正则表达式中 (if line match (domain|ip|134.567.987.[0-9]{1, 3})),但我怀疑性能会大不相同。
    【解决方案2】:

    您可以在启动 nodejs 进程时加载该文件。然后,您可以处理整个文件并分成 3 个数组(IP、域和端口)。

    在内存中搜索元素很快。

    然后您可以使用setInterval 重新加载文件的内容并将其保存到内存中以获取最新的黑名单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多