Php 在APC或其他键值存储中处理大型IP黑名单

Php 在APC或其他键值存储中处理大型IP黑名单,php,arrays,apc,key-value,Php,Arrays,Apc,Key Value,PHP或Python脚本定期从远程数据库获取IP地址的大型数据集(/32 netmask)。在两次回迁之间,数据集将临时存储在APC或Memcached密钥存储中 脚本的主要任务是检查数据库/缓存中是否存在给定的ip地址(想想:“黑名单”) 最有效的(性能方面的)方法是什么: 将IP地址存储在APC/Memcache中 将给定IP与存储的IP列表进行比较 到目前为止,我的想法是: 备选方案1 将所有IP地址存储为一个大数组列表,作为APC中单个密钥的值,然后执行 if (in_array("19

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

脚本的主要任务是检查数据库/缓存中是否存在给定的ip地址(想想:“黑名单”)

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

  • 将IP地址存储在APC/Memcache中
  • 将给定IP与存储的IP列表进行比较
  • 到目前为止,我的想法是:

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

    if (in_array("192.168.0.1", $ip_list_from_cache))
    
    if (apc_exists('192.168.0.1')
    
    备选方案2 将每个IP作为密钥名存储在APC中,然后执行

    if (in_array("192.168.0.1", $ip_list_from_cache))
    
    if (apc_exists('192.168.0.1')
    
    这是一个很大的列表,我希望比较检查非常快


    提前感谢您的评论

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

    但在这种情况下,我认为缓存方法更有意义:即线性扫描。另一方面,缓存通常实现为哈希表,其中查找是
    O(1)

    此外,如果将记录聚合到Memcached中,则可以避免浪费大量内存,即每个web工作者进程在内存中复制一次列表

    这也可以说是一个更清洁的解决方案



    另一方面,你考虑过另一个层次吗?通过一些简单的脚本编写,您可以在LB(例如Nginx)级别执行检查。

    仔细想想,如果IP地址存储为散列(例如转换为无符号整数)与字符串,是否会加快速度?@LeoHouer这个问题确实有更多细节: