我正在尋找一個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