Как использовать 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:

Давайте кэшируем этот ответ с помощью 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.

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

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

Мы также можем увидеть, что ответ был примерно на 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