Spec-Zone.ru › Deno 2

Как использовать Redis с Deno

Redis — это хранилище данных в оперативной памяти, которое можно использовать для кэширования, в качестве брокера сообщений или для потоковой передачи данных.

Посмотреть исходный код здесь.

Здесь мы настроим Redis для кэширования данных из вызова API, чтобы ускорить последующие запросы к этим данным. Мы будем:

  • Настроить клиент Redis для сохранения данных из каждого вызова API в памяти
  • Настроить сервер Deno, чтобы мы могли легко запрашивать определенные данные
  • Вызвать API Github внутри обработчика сервера, чтобы получить данные при первом запросе
  • Обслуживать данные из Redis при каждом последующем запросе

Мы можем сделать это в одном файле, main.ts.

Подключение к клиенту Redis

Нам нужны два модуля. Первый — сервер Deno. Мы будем использовать его для получения информации от пользователя для запроса к нашему API. Второй — Redis. Мы можем получить пакет node для Redis, используя модификатор npm:.

import { createClient } from "npm:redis@^4.5";

Мы создаём клиент Redis, используя createClient, и подключаемся к нашему локальному серверу Redis:

// make a connection to the local instance of redis
const client = createClient({
  url: "redis://localhost:6379",
});

await client.connect();

Вы также можете задать хост, пользователя, пароль и порт индивидуально в этом объекте конфигурации.

Настройка сервера

Наш сервер будет действовать как обёртка вокруг API Github. Клиент может обратиться к нашему серверу с именем пользователя Github в пути URL, например, http://localhost:3000/{username}.

Разбор пути и вызов API Github будут происходить внутри функции-обработчика на нашем сервере. Мы удалим ведущий слэш, чтобы получить переменную, которую мы можем передать в API Github как имя пользователя. Затем мы вернём ответ пользователю.

Deno.serve({ port: 3000 }, async (req) => {
  const { pathname } = new URL(req.url);
  // strip the leading slash
  const username = pathname.substring(1);
  const resp = await fetch(`https://api.github.com/users/${username}`);
  const user = await resp.json();
  return new Response(JSON.stringify(user), {
    headers: {
      "content-type": "application/json",
    },
  });
});

Мы запустим это с помощью:

deno run --allow-net main.ts

Если затем мы перейдём по ссылке http://localhost:3000/ry в Postman, мы получим ответ Github:

uncached-redis-body.png

Давайте кэшируем этот ответ с помощью Redis.

Проверка кэша

После получения ответа от API Github мы можем кэшировать его в Redis, используя client.set, с именем пользователя в качестве ключа и объектом пользователя в качестве значения:

await client.set(username, JSON.stringify(user));

В следующий раз, когда мы запросим того же пользователя, мы можем использовать client.get для получения кэшированного пользователя:

const cached_user = await client.get(username);

Это возвращает null, если ключ не существует. Таким образом, мы можем использовать его в некоторой логике управления потоком. Когда мы получаем имя пользователя, мы сначала проверяем, есть ли уже этот пользователь в кэше. Если да, мы отобразим кэшированный результат. Если нет, мы вызовем API Github, чтобы получить пользователя, кэшируем его и отобразим результат API. В обоих случаях мы добавим специальный заголовок, чтобы показать, какую версию мы отображаем:

const server = new Server({
  handler: async (req) => {
    const { pathname } = new URL(req.url);
    // strip the leading slash
    const username = pathname.substring(1);
    const cached_user = await client.get(username);
    if (cached_user) {
      return new Response(cached_user, {
        headers: {
          "content-type": "application/json",
          "is-cached": "true",
        },
      });
    } else {
      const resp = await fetch(`https://api.github.com/users/${username}`);
      const user = await resp.json();
      await client.set(username, JSON.stringify(user));
      return new Response(JSON.stringify(user), {
        headers: {
          "content-type": "application/json",
          "is-cached": "false",
        },
      });
    }
  },

  port: 3000,
});

server.listenAndServe();

Запустив это в первый раз, мы получим тот же ответ, что и выше, и увидим заголовок is-cached, установленный на false.

uncached-redis-header.png

Но вызовите с тем же именем пользователя снова, и мы получим кэшированный результат. Тело идентично:

cached-redis-body.png

Но заголовок показывает, что у нас есть кэш:

cached-redis-header.png

Мы также можем увидеть, что ответ был примерно на 200 мс быстрее!

Вы можете ознакомиться с документацией Redis здесь и пакетом Redis node здесь.

© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/tutorials/how_to_with_npm/redis

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API