[英]Laravel - Caching Eloquent with Frequent Updates
是否可以在經常修改的對象上使用緩存? 例如,假設我們有一個BlogPost對象,並且還有一個num_of_views列(以及其他)經常更改。 是否可以在高速緩存和數據庫中更新num_of_views字段,而不破壞高速緩存對象並重新創建它? 我可以手動完成,但是我擔心同步問題。
是的。 我不知道您的緩存狀況如何,但是您可以隨時替換緩存實例:
public function updatePost($post_id, $num_of_views)
{
if (Cache::has('POST.'.$post_id))
{
$post = Cache::get('POST.'.$post_id);
}
else
{
$post = Post::find($post_id);
}
$post->num_of_views = $num_of_views;
$post->save();
Cache::put('POST.'.$post_id, $post);
}
不,可悲的是沒有一個好的方法。 但是讓我解釋一下...
但是實際上有一個很好的理由-緩存的整個原因是為了加快提供某些靜態數據的過程。 例如,WikiPedia為您提供90%的服務,因為它擁有太多用戶。 WikiPedia的文章很少更改,而流行的是,這意味着緩存是一種很好的解決方案,可以減輕服務器的負擔。
在您的情況下,您基本上希望對每個請求都修改一個緩存,永遠不要順便緩存視圖計數,這意味着緩存功能實際上變得毫無用處。 即使每2、3甚至10個請求進行了修改,緩存仍然有些無用,只是因為緩存的目的不是重新生成每幾個請求,而是保持服務器的負載。
緩存請求實際上比常規的實時服務請求占用更多資源,因此您可以想象緩存這樣的可變數據不僅無用,而且在服務器方面也非常成問題。
另一個問題是,您建議僅更改num_of_views,但保持其余對象不變,但是您沒有考慮的是實際上無法使用Cache來完成。 緩存的工作方式是將您擁有的所有數據壓縮成其他內容-它是一個簡單的鍵“ post_object_x”和一個值,該值通常是諸如base64之類的某種加密字符串。
這意味着num_of_views字段本身實際上並不存在於緩存本身中,除非您對其解密然后對其進行修改然后再次對其進行加密,這與銷毀和重新創建該對象一樣快速且占用大量資源。 因此,從純粹的技術角度來看,這也是不可能的。
我希望您能明白為什么您的想法無法完全解決,以及為什么它也不是世界上最好的想法來緩存任何計數器,除非您擁有一個擁有數十億次展示的大型網站-即使那樣,您也應該這樣做非常高的請求特別重要,並且只需要很短的時間。
有幾種選擇:
從數據庫記錄中分離出高性能指標,並更新Php模型代碼以反映這一點。 實際上,您的“模型”是一個模型,該模型將其setter和getter委托給其他BlogSlowData和BlogFastData模型(我忘記了此模式的名稱)。
您可以更改寫入數據庫的方式的性質。 因此,例如,當您更新一條記錄時,您會將其彈出到一個隊列中,並迅速對其進行處理。 我喜歡為此使用redis,將寫入隊列放入redis,然后另一個程序讀取該隊列並將其寫入數據庫和緩存。
最后,可能是最糟糕的答案。 您可以使用Redis的LUA代碼將更新的指標寫入數據庫中,還是使用mysql,您可以使用http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached.html memcache庫將數據直接集成到數據庫中。
您還可以將1和2組合在一起,在其中將redis中的計數器遞增,然后將一條記錄推入隊列,表明BlogPost.id = 1234,需要$ view遞增1。
丹尼爾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.