memcached和php关系,php – memcacheD这没关系?
Is this code vulnerable to the expired cache race condition? How would you improve it?
是.如果兩個(或多個)并發客戶端嘗試從緩存中獲取相同的密鑰并最終從數據庫中提取它.您將在數據庫上出現峰值,并且數據庫將在一段時間內處于高負載狀態.這稱為緩存標記.有幾種方法可以解決這個問題:
>對于新項目預熱緩存(基本上意味著您在網站上線之前預加載所需的對象).
>對于定期過期的項目,創建一個未來的過期時間,而不是實際過期時間(比如說5-10分鐘).然后,當您從緩存中提取對象時,請檢查過期時間是否已關閉,將來是否緩存以防止任何其他客戶端更新緩存,以及從數據庫進行更新.為了能夠在沒有緩存標記的情況下工作,您需要實現密鑰鎖定或使用cas標記(需要最新的客戶端庫才能工作).
Let’s say that query X gets 100 rows. A little after row #50 is modified by another process (lets say that the retail price gets increased).
緩存中有三種類型的數據:
>對象
>物體清單
>生成的數據
我通常做的是將對象保持為單獨的鍵,然后在列表中使用緩存“指針”.在你的情況下你在緩存中的某個地方有N個objets(假設鍵是1,2..N),然后你有一個數組數組中的對象列表(1,2,3,10,42 …) .當您決定使用對象加載列表時,從緩存加載列表鍵,然后從緩存加載實際對象(使用getMulti減少請求).在這種情況下,如果任何對象得到更新,您只能在一個位置更新它,并且它會自動更新到任何地方(更不用說使用此技術可以節省大量空間).
編輯:決定添加更多關于超前時間到期的信息.
使用到期數據x設置對象并將其保存到數據庫中,其有效期為x 5分鐘.這是從緩存加載對象時執行的步驟:
>檢查是否需要更新(時間() – x <0)
>如果是這樣,請鎖定密鑰,以便在刷新項目時沒有人可以更新它.如果您無法鎖定密鑰,那么其他人已經在更新密鑰,它就變成了SEP(Somebody Else的問題).由于memcached沒有鎖的解決方案,因此您必須設計自己的機制.我通常通過在末尾添加一個單獨的鍵和原始鍵值“:lock”來完成此操作.您必須將此鍵設置為以盡可能短的數量到期(對于1秒的memcached).
>如果您獲得了密鑰的鎖定,則首先使用新的到期時間保存對象(這樣您確定沒有其他客戶端會嘗試鎖定密鑰),然后繼續您的業務并從數據庫更新密鑰,使用適當的超前期限再次保存新值(請參閱第1點).
希望這清除一切:)
總結
以上是生活随笔為你收集整理的memcached和php关系,php – memcacheD这没关系?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东北大学c语言真题及答案,东北大学C语言
- 下一篇: php study是什么,phpstud