【问题标题】:Array lookup speed in PHP; long cache keysPHP中的数组查找速度;长缓存键
【发布时间】:2011-07-09 19:23:48
【问题描述】:

我正在研究一种方法,由于它的操作成本和使用相同参数调用它的频率,该方法将从缓存返回值中受益。

我将serialize()-ing 参数一起用于缓存键,但这可能会导致键很长,因为数组参数很长。

  • PHP 数组索引和查找是否会受到如此长的键的影响(认为从 250B 到 1kB+)?
  • 到目前为止一切顺利,但我是否面临这样的情况,在某些时候这可能会严重失败?
  • 基本上,我应该md5()或替代)密钥吗?

细微的澄清
这只是每个请求的缓存,没有永久存储。所讨论的方法是视图助手的方法,对于每个视图生成,它可能会被调用 500 次或更多次。

【问题讨论】:

  • 不知何故使用 MD5 代替序列化是很奇怪的。
  • @Hans Wassink - md5() serialize() 的结果是我得到的结果。
  • 不管怎样,万岁:D

标签: php caching serialization hash


【解决方案1】:

您绝对应该散列密钥。您可能会说“当我可以在每个时间点连接一个唯一键时,我为什么要冒着发生冲突的风险?”。简单的答案是,如果您通过字符串连接生成缓存键,则必须始终使用最坏的空间需求情况来计算内存使用情况。

因此,如果您有一个包含 200 个条目的缓存......和 ​​2 个最多包含 20 个字符的字符串的字段。最坏的情况是200*2*20*(size of character)。如果您在每个可能的并行连接上加载完整的缓存,这将乘以并行连接的数量。

使用散列,您始终具有键字段的最小 ram 要求 = 最大 ram 要求。

如果您有许多值连接到键,这将非常糟糕。

编辑:

即使您按请求使用它,数组也会消耗内存。虽然它是一个缓存,但它从请求的开始到结束都存在。所以你需要考虑到它在你的内存中消耗了一定数量的空间,而在使用哈希时它的数量是固定的。

第二件事是需要比较密钥。如果您使用字符串键访问关联数组,您的解释器需要按字符比较键。如果您有生成密钥的哈希方法,这也是固定数量的步骤。

如果您使用串联,则步数将介于最佳和最坏情况之间。

【讨论】:

  • 谢谢@fyr - 根据我的说明,这个缓存没有永久存储,因为它是每个请求的。无论如何,我的键有变大的趋势,从低端的 30B 到高达 1kB+;我正在做一个带有 6 个参数函数的 serialize(func_get_args()),其中 3 个通常是深度数组。我会对其进行基准测试,但为了内存保留和调试转储的可读性,我想我会去散列。
【解决方案2】:

拥有如此长的数组键当然不常见,但您可能需要进行基准测试才能猜测它实际上会降低多少速度。如果有疑问,只需 md5 即可 - 从您所说的来看,与 md5 时间相比,加速仍然会如此之多,以至于后者将是微不足道的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2011-01-31
    相关资源
    最近更新 更多