0

我创建了一个接收字符串值的方法,将其与用户记录匹配并返回匹配的用户记录。

我的代码:

class UsersPeer extends BaseUsersPeer
{
  public static function getHashUser($hash)
  {
    $c = new Criteria();
    $c->add(UsersPeer::HASH,$hash);
    return UsersPeer::doSelectOne($c);
  }
}

缓存这个函数有意义吗?

我的理解是,由于传递给函数的字符串值对于不同的用户总是不同的,所以函数每次都要执行。但是,对于先前已将字符串值传递给方法和检索记录的用户,它不应再次执行。只有在这种情况下,功能缓存才会起作用。

鉴于大约有 50K 用户,为此方法启用缓存是否有意义?

4

1 回答 1

2

这是一个非常简单的查询,即使哈希列没有被索引也应该很快(如果有的话也很快)——我认为没有理由缓存结果。

结果缓存通常用于查询复杂、包含聚合数据或子查询的情况。即使这样,您也应该先处理查询,看看是否可以优化它。

更新

如果您查看sfCache该类(所有具体缓存实现的基础),您会发现您存储在缓存中的任何内容都有生命周期,这意味着它只能存储有限的时间。这意味着缓存的大小是有限的。

缓存是这样工作的:

  • 你的函数被调用
  • 您根据函数名称和参数计算缓存键
  • 询问缓存是否有给定键的存储值
  • 如果是,您将其取出并返回
  • 你计算返回值
  • 你将它存储在缓存中然后返回它

是否值得缓存函数的返回值始终取决于性能测量。它是一个长时间运行的计算密集型函数吗?是性能瓶颈吗?如果您的答案是肯定的,则可能值得启用缓存。

还要记住,每次进行函数缓存时,它都会增加您必须维护的代码量(和复杂性)。

于 2012-09-14T12:13:45.173 回答