字符串搜索/外卡匹配

时间:2011-03-26 21:46:37

标签: file-io node.js performance wildcard

我现在一直在为一个相对较小的项目开发我的公司玩,它基本上是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是端口。

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

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

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

即使我这样做也不会真正有益,因为我无法检查IP范围等,它缺乏对更苛刻的网站黑名单技术的支持。

我在考虑使用某种数据库系统,但这是我想要避免的,所以基本上我要求的是有一些方法可以在数据文件上执行通配符查找而不会产生太多开销。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

在内存中搜索元素很快。

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