簡體   English   中英

Laravel-頻繁更新而雄辯地緩存

[英]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字段本身實際上並不存在於緩存本身中,除非您對其解密然后對其進行修改然后再次對其進行加密,這與銷毀和重新創建該對象一樣快速且占用大量資源。 因此,從純粹的技術角度來看,這也是不可能的。


我希望您能明白為什么您的想法無法完全解決,以及為什么它也不是世界上最好的想法來緩存任何計數器,除非您擁有一個擁有數十億次展示的大型網站-即使那樣,您也應該這樣做非常高的請求特別重要,並且只需要很短的時間。

有幾種選擇:

  1. 從數據庫記錄中分離出高性能指標,並更新Php模型代碼以反映這一點。 實際上,您的“模型”是一個模型,該模型將其setter和getter委托給其他BlogSlowData和BlogFastData模型(我忘記了此模式的名稱)。

  2. 您可以更改寫入數據庫的方式的性質。 因此,例如,當您更新一條記錄時,您會將其彈出到一個隊列中,並迅速對其進行處理。 我喜歡為此使用redis,將寫入隊列放入redis,然后另一個程序讀取該隊列並將其寫入數據庫和緩存。

  3. 最后,可能是最糟糕的答案。 您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM