在 APC 或其他键值存储中使用大型 IP 黑名单


Working with a large IP blacklist in APC or other key-value store

PHP 或 Python 脚本定期从远程数据库获取大型 IP 地址数据集(/32 网络掩码)。在获取之间,数据集将临时存储在APC或Memcached密钥存储中。

脚本的主要工作是检查数据库/缓存中是否存在给定的IP地址(想想:"黑名单")。

什么是最有效的(性能明智)方法:

  1. 将 IP 地址存储在 APC/内存缓存中
  2. 将给定 IP 与存储的 IP 列表进行比较。

到目前为止,我想出了什么:

备选案文1将所有 IP 地址存储为一个大型数组列表,作为 APC 中单个密钥的值,然后执行

if (in_array("192.168.0.1", $ip_list_from_cache))

备选案文2将每个 IP 存储为 APC 中的键名,然后执行

if (apc_exists('192.168.0.1')

这是一个很大的列表,我希望比较检查非常快。

提前感谢您的任何评论!

性能困境的解决方案通常是对这两种解决方案进行基准测试。

在这种情况下,我会说缓存方法更有意义:in_array的时间复杂度是O(N),即线性扫描。另一方面,缓存通常实现为哈希表,其中查找O(1)

此外,如果聚合 Memcached 中的记录,则可以避免浪费大量 RAM 在每个 Web 工作进程的内存中复制一次列表。

也可以说,这将是一个更干净的解决方案。


附带说明一下,您是否考虑过在另一个层面上这样做?通过一些轻量级脚本,您可以在LB(例如Nginx)级别进行检查。