目錄
GraphQL自動緩存機制
自動失效緩存
規範化GraphQL緩存
GraphQL緩存的邊緣情況
首頁 web前端 css教學 使用GraphQL緩存

使用GraphQL緩存

Mar 19, 2025 am 09:36 AM

Working With GraphQL Caching

GraphQL緩存機制解析:打破緩存誤區

您可能聽說過諸如“GraphQL不支持緩存”或“GraphQL不關心緩存”之類的說法。對於許多人來說,這是一個大問題。但事實並非如此。 GraphQL官方文檔中提到了多種緩存技術,可見其開發團隊非常重視緩存及其性能優勢。

本文旨在澄清GraphQL與緩存之間的關係,並介紹不同的緩存技術以及如何利用緩存優化GraphQL查詢。

GraphQL自動緩存機制

考慮以下用於獲取帖子及其作者的查詢:

 query getPost {
  post(slug: "working-with-graphql-caching") {
    id
    title
    author {
      id
      name
      avatar
    }
  }
}
登入後複製

實現GraphQL自動緩存的“秘訣”是__typename元字段,所有GraphQL API都提供此字段。顧名思義, __typename返回對象的類型名稱。此字段甚至可以手動添加到現有查詢中,大多數GraphQL客戶端或CDN會自動添加它,例如urql。服務器接收到的查詢可能如下所示:

 query getPost {
  post(slug: "working-with-graphql-caching") {
    __typename
    id
    title
    author {
      __typename
      id
      name
    }
  }
}
登入後複製

包含__typename的響應可能如下所示:

 {
  data: {
    __typename: "Post",
    id: 5,
    title: "Working with GraphQL Caching",
    author: {
      __typename: "User",
      id: 1,
      name: "Jamie Barton"
    }
  }
}
登入後複製

__typename是GraphQL緩存的關鍵,因為它允許我們緩存結果,並知道它包含Post ID 5和User ID 1。

Apollo和Relay等庫也提供一定程度的內置緩存,用於自動緩存。由於它們已經知道緩存中的內容,因此它們可以利用緩存而不是遠程API來獲取客戶端在查詢中請求的內容。

自動失效緩存

假設帖子作者使用editPost變異修改了帖子的標題:

 mutation {
  editPost(input: { id: 5, title: "Working with GraphQL Caching" }) {
    id
    title
  }
}
登入後複製

由於GraphQL客戶端會自動添加__typename字段,因此此變異的結果會立即告訴緩存Post ID 5已更改,並且包含該帖子的任何緩存查詢結果都需要失效:

 {
  data: {
    __typename: "Post",
    id: 5,
    title: "Working with GraphQL Caching"
  }
}
登入後複製

下次用戶發送相同的查詢時,查詢將從源獲取新數據,而不是使用緩存中的過期結果。

規範化GraphQL緩存

許多GraphQL客戶端不會緩存整個查詢結果。相反,它們會將緩存數據規範化為兩種數據結構:一種將每個對象與其數據關聯起來(例如,Post #5:{…},User #1:{…}等);另一種將每個查詢與其包含的對象關聯起來(例如,getPost:{Post #5,User #1}等)。

請參閱urql關於規範化緩存的文檔或Apollo的“Demystifying Cache Normalization”以了解具體的示例和用例。

GraphQL緩存的邊緣情況

GraphQL緩存無法自動處理的一個主要邊緣情況是向列表中添加項目。因此,如果createPost變異通過緩存,它不知道要將該項目添加到哪個特定列表中。

最簡單的“解決方法”是在變異中查詢父類型(如果存在)。例如,在下面的查詢中,我們查詢了post上的community關係:

 query getPost {
  post(slug: "working-with-graphql-caching") {
    id
    title
    author {
      id
      name
      avatar
    }

    # Also query the community of the post
    community {
      id
      name
    }
  }
}
登入後複製

然後我們也可以從createPost變異中查詢該community,並使包含該community的任何緩存查詢結果失效:

 mutation createPost {
  createPost(input: { ... }) {
    id
    title

    # Also query and thus invalidate the community of the post
    community {
      id
      name
    }
  }
}
登入後複製

雖然並不完美,但類型化模式和__typename元字段是使GraphQL API非常適合緩存的關鍵。

您可能認為所有這些都是權宜之計,GraphQL仍然不支持傳統的緩存。您不會錯。由於GraphQL通過POST請求運行,您需要卸載到應用程序客戶端並使用上述“技巧”來利用GraphQL的現代瀏覽器緩存。

但是,這種方法並不總是可行的,也不是管理客戶端緩存的最佳方法。對於更棘手的情況,GraphQL客戶端需要您手動更新緩存,但像GraphCDN這樣的服務提供了“類似服務器”的緩存體驗,還提供了一個手動清除API,允許您執行以下操作以獲得更好的緩存控制:

 # Purge all occurrences of a specific object
mutation {
  purgeUser(id: [5])
}
登入後複製
 # Purge by query name
mutation {
  _purgeQuery(queries: [listUsers, listPosts])
}
登入後複製
 # Purge all occurrences of a type
mutation {
  purgeUser
}
登入後複製

現在,無論您在何處使用GraphCDN端點,都不再需要在移動端、Web端等所有客戶端邏輯中重新實現緩存策略。邊緣緩存使您的API速度非常快,並通過在用戶之間共享緩存並將其與每個用戶的客戶端分開來減少負載。

最近在一個項目中使用了GraphCDN,它幫我處理了客戶端或服務器上的緩存配置,讓我能夠繼續我的項目。例如,我可以將我的端點替換為GraphCDN,並免費獲得查詢複雜性(即將推出)、分析等功能。

那麼,GraphQL是否關心緩存?當然關心!它不僅提供了一些內置的自動緩存方法,而且許多GraphQL庫提供了其他方法來實現和管理緩存。

希望本文能幫助您了解GraphQL緩存機制,以及如何在客戶端實現它,以及如何利用CDN來完成所有工作。我的目標不是說服您在所有項目中都使用GraphQL,但如果您正在選擇查詢語言並且緩存是一個重要因素,請知道GraphQL完全能夠勝任這項任務。

以上是使用GraphQL緩存的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1422
52
Laravel 教程
1316
25
PHP教程
1268
29
C# 教程
1240
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

如何在WordPress主題中構建VUE組件 如何在WordPress主題中構建VUE組件 Apr 11, 2025 am 11:03 AM

內聯式模板指令使我們能夠將豐富的VUE組件構建為對現有WordPress標記的逐步增強。

當您看上去時,CSS梯度變得更好 當您看上去時,CSS梯度變得更好 Apr 11, 2025 am 09:16 AM

我關注的一件事是Lea Verou' s conic-Gradient()Polyfill的功能列表是最後一項:

靜態表單提供商的比較 靜態表單提供商的比較 Apr 16, 2025 am 11:20 AM

讓我們嘗試在這裡造成一個術語:“靜態表單提供商”。你帶上html

See all articles