📜  GraphQL-缓存(1)

📅  最后修改于: 2023-12-03 14:41:38.035000             🧑  作者: Mango

GraphQL 缓存

简介

GraphQL 是一种 API 查询语言和运行时环境,其可让客户端精确地指定其需要从 API 中检索的数据。GraphQL 缓存是一种用于缓存 GraphQL 所请求的数据的解决方案,其可以在服务端和客户端上实现。它通过减少网络延迟和服务器负载来提高应用程序性能。

服务端缓存

GraphQL 服务端缓存是一种将 GraphQL 请求缓存到服务器端的技术。当客户端发出相同的查询时,GraphQL 服务器可以直接从缓存中检索相应的数据,从而避免了与数据库或其他外部源的交互。

实现方式

对于服务端缓存,常见的实现方式是使用 Redis 或 Memcached 等内存数据库来缓存查询结果。GraphQL 服务器可以将查询和查询结果的哈希值存储到缓存中,以便下次查询可以快速检索缓存,而无需执行查询逻辑。在执行查询时,GraphQL 服务器必须检查缓存以查看是否有匹配的结果。

示例代码
const { ApolloServer, gql } = require('apollo-server');
const redis = require('redis');
 
const client = redis.createClient();
 
const typeDefs = gql`
  type Book {
    id: ID,
    title: String,
    author: String
  }
 
  type Query {
    book(id: ID!): Book
  }
`;
 
const resolvers = {
  Query: {
    book: async (_, { id }) => {
      const cacheKey = `book_${id}`;
      const cacheResult = await new Promise((resolve, reject) => {
        client.get(cacheKey, (err, result) => {
          if (err) {
            reject(err);
          } else {
            resolve(JSON.parse(result));
          }
        });
      });
 
      if (cacheResult) {
        return cacheResult;
      }
 
      const result = await queryDB(`SELECT * FROM book WHERE id = ${id}`);
      client.set(cacheKey, JSON.stringify(result));
 
      return result;
    }
  }
};
 
const server = new ApolloServer({ typeDefs, resolvers });
 
server.listen().then(({ url }) => {
  console.log(`🚀 Server ready at ${url}`);
});
客户端缓存

GraphQL 客户端缓存是一种将响应缓存到客户端的技术,从而避免了多次查询相同的数据。客户端缓存可以减少对服务器的请求并提高应用程序的响应速度。每当客户端发出新的 GraphQL 查询时,客户端会首先检查其缓存以获取可用的数据。

实现方式

对于客户端缓存,常见的实现方式是使用 Apollo Client 这样的库。通过 Apollo Client,可以在客户端创建一个缓存实例,以便将响应结果缓存到本地。缓存的结果可以通过 key-value 对存储,并根据需要进行清理或更新。

示例代码
import React from 'react';
import ReactDOM from 'react-dom';
import { ApolloClient, HttpLink, InMemoryCache, gql, ApolloProvider } from '@apollo/client';
 
const client = new ApolloClient({
  cache: new InMemoryCache(),
  link: new HttpLink({
    uri: '/graphql',
  }),
});
 
const QUERY_BOOK = gql`
  query GetBook($id: ID!) {
    book(id: $id) {
      id
      title
      author
    }
  }
`;
 
function BookDetails({ bookId }) {
  const { data, error, loading } = useQuery(QUERY_BOOK, {
    variables: {
      id: bookId,
    },
    fetchPolicy: 'cache-first',
  });
 
  if (loading) {
    return <p>Loading...</p>;
  }
 
  if (error) {
    return <p>An error occurred: {error.message}</p>;
  }
 
  const { book } = data;
 
  return (
    <div>
      <h1>{book.title}</h1>
      <h2>{book.author}</h2>
    </div>
  );
}
 
function App() {
  return (
    <ApolloProvider client={client}>
      <BookDetails bookId="1" />
      <BookDetails bookId="2" />
      <BookDetails bookId="3" />
    </ApolloProvider>
  );
}
 
ReactDOM.render(<App />, document.getElementById('root'));
总结

GraphQL 缓存是一种提高应用程序性能的易于实现的解决方案。通过减少网络延迟和服务器负载,可以提高应用程序的响应速度并降低成本。在实现缓存时,我们需要注意缓存清理、数据更新和缓存一致性等问题。同时,我们还需要考虑安全性问题,例如如何保护缓存数据的机密性和完整性。 在实际应用中,我们可以根据不同的需求选择服务端或客户端缓存或二者结合实现缓存。