在您給出的「該短語」使實體無效的鏈接中,意味着緩存將從其存儲中刪除該實體的所有實例,或者將這些實例標記爲「無效」並且需要強制重新驗證然後才能將它們返回以響應隨後的請求。「現在問題是緩存在哪裏?我相信這篇文章談論的Cache是服務器緩存。
我曾在一個VC++項目工作,每當模型更改緩存更新。有一個編程邏輯實現涉及到實現這一點。您提到的文章正確地指出:「HTTP協議無法保證所有此類緩存條目都被標記爲無效」,HTTP協議無法自行使緩存無效。
在我們的項目示例中,我們使用了發佈訂閱機制。當A級對象被更新/插入時,它被髮布到公共汽車。控制器註冊以偵聽總線上的對象。假設控制器對對象A的變化感興趣,只要對象類型B被改變和發佈,它就不會被回調。當對象類型A確實被更改併發布時,控制器A偵聽器函數會使用對象A的最新更改來更新緩存。GET /公司的後續請求將從緩存中獲取最新的請求。現在,更改對象A和正在刷新最新更改的緩存之間存在時間差。爲了避免此時間間隙中發生錯誤,在對象A更改之前對象被標記爲髒。因此,這些時間之間的請求將等待髒標誌被清除。
還有一個瀏覽器緩存。我記得ETAGS是用來驗證這一點的。 ETAG是資源的校驗和。對於這個客戶應該保持舊的ETAG價值。如果資源的校驗和已經改變,則發送具有HTTP 200的新資源,否則發送HTTP 304(使用本地副本)。
[更新]
PUT /公司/任天堂
GET /公司
是兩個不同的資源。當PUT/companies/Nintendo請求被執行時,您的/ cache/company/Nintendo預期只會被更新,而不會/公司(我正在談論客戶端緩存)。假設您下次調用GET /companies/Nintendo
,根據http頭返回響應。 GET /companies
是一個全新的請求,因爲它指向不同的資源。
現在問題是什麼應該是http頭?它純粹是應用程序特定的。假設它是我不會緩存的股票報價。假設它是NEWS項目,我會緩存一段時間。您的參考鏈接http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html
包含Cache http標題的所有詳細信息。只有沒有提到的東西是ETag的用法。 ETag可以擁有資源的校驗和。檢查http://en.wikipedia.org/wiki/HTTP_ETag
並檢查https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers
您的答案中的關鍵點似乎是文章中的引述:「HTTP協議無法保證所有此類緩存條目都被標記爲無效。」剩下的問題是什麼是正確的操作方法(根據REST)? – Gili
您的第三點每當我創建一家新公司時,我想使與GET /公司關聯的緩存無效。我解釋瞭如何爲服務器緩存實現這一點。對於瀏覽器緩存檢查,您可能需要使用ETAGS。 – Satish
這個問題從來沒有關於服務器端緩存(我鏈接到的文章是關於客戶端緩存)。這個問題已經提到可能使用'ETag',但還不清楚其他緩存頭應該與'ETag'一起返回。我在尋找最佳實踐的參考,而不僅僅是「這對我有用」的解決方案。 – Gili