我正在寻找一个APC的好缓存键,它代表了一些关于对象的编译信息,使用“对象”作为键。我有一个编制方法,做这样的事情:PHP序列化替代
function compile(Obj $obj)
{
if ($this->cache)
{
$cachekey = serialize($obj);
if ($data = $this->cache->get($obj))
{
return $data
}
}
// compute result here
if ($this->cache)
{
$this->cache->set($cachekey, $result);
}
return $result;
}
如果不是很明显,$this->cache
是一个接口与方法get
和set
的实现。
有没有更快的方法来创建一个对于而言是唯一的密钥该属性的这个对象?我可以提取出相关的数据,但是它们仍然是数组,这与序列化中的问题相同,我首先使用了这些对象。
序列化从“正确性”的位置起作用,但看起来很浪费(输出密钥的大小和计算复杂度)。
编辑:我还想补充,如果不是很明显,我会而不是需要反序列化这个对象。我对当前缓存键的逐字代码实际上是:
$cachekey = 'compile.' . sha1(serialize($obj));
。
编辑2:我正在使用该对象具有以下定义:
class Route
{
protected $pattern;
protected $defaults = array();
protected $requirements = array();
}
Pattern
和requirements
是,将改变该方法的输出对象的值,因此这些值的散列必须存在于缓存键中。
另外,有人提出uniqid(),它会打败一般缓存查找键的目的,因为您无法可靠地从相同的信息中重新生成相同的ID。
编辑3:我想我没有给予足够的上下文。下面是该代码的链接至今:
https://github.com/efritz/minuet/blob/master/src/Minuet/Routing/Router.php#L160
我想我真的只是想避免昂贵的调用序列化(我猜SHA1,这也是一个有点贵)。我可以做的最好的事情是尽量减少我正在序列化的大小......
“计算复杂度”有什么问题? –
它比我实际需要的运行更多的周期;)当存在缓存命中时,serialize是目前比apc_fetch本身花费更多时间的唯一方法。 – efritz
所以你想根据数据项的值检索数据项,或者存储数据项?这是没有意义的 - 为了检索价值,你必须已经知道它是什么! – symcbean