Вопрос или проблема
Для кэширования ответа API я написал эти простые функции, которые используют файловый API NodeJs для записи и чтения ответа из определенного json-файла в качестве слоя кэширования.
const fs = require("fs");
const path = require("path");
const fileName = path.join(__dirname, "CACHE.json");
const getFileName = (key = "") => {
key = key.replace(/\W/g, "");
return path.join(__dirname, `CACHE${key}.json`);
};
const setCache = (key, value, ttlInSeconds = 60, cachePath) => {
try {
let cache = {};
const fileName = getFileName(cachePath || key);
if (fs.existsSync(fileName)) {
cache = JSON.parse(fs.readFileSync(fileName));
}
cache[key] = {
value,
ttl: Date.now() + ttlInSeconds * 1000,
};
fs.writeFileSync(fileName, JSON.stringify(cache, null, 2));
} catch (error) {
console.log(error);
}
};
const getCache = (key, cachePath) => {
try {
const fileName = getFileName(cachePath || key);
if (!fs.existsSync(fileName)) {
return null;
}
const cache = JSON.parse(fs.readFileSync(fileName));
if (!cache[key]) {
return null;
}
if (cache[key].ttl < Date.now()) {
delete cache[key];
fs.writeFileSync(fileName, JSON.stringify(cache, null, 2));
return null;
}
return cache[key].value;
} catch (error) {
return null;
}
};
const clearCache = (key, cachePath) => {
try {
const fileName = getFileName(cachePath || key);
const cache = JSON.parse(fs.readFileSync(fileName));
delete cache[key];
fs.writeFileSync(fileName, JSON.stringify(cache, null, 2));
} catch (error) {}
};
module.exports = {
setCache,
getCache,
clearCache,
};
Я провел стресс-тест API с использованием Postman. Я доволен результатом.
Я хочу знать, есть ли какие-либо недостатки в использовании этого подхода.
Примечание: Я не хочу использовать Redis в данный момент. Я не могу использовать кэш в памяти, потому что я использую кластеризацию и пагинация дает дублирующиеся значения.
.
Ответ или решение
Использование файловой системы Node.js для кэширования в приложениях на Next.js или Express.js имеет свои плюсы и минусы. Давайте рассмотрим этот вопрос детально.
Плюсы использования файловой системы для кэширования
-
Простота реализации:
Кэширование через файловую систему дает возможность быстро и эффективно сохранить результаты API-запросов, используя простой код для записи и чтения JSON-файлов. Это удобно для разработчиков, которые не хотят зависеть от внешних систем кэширования, таких как Redis. -
Нет необходимости в дополнительных зависимостях:
Использование встроенных модулей Node.js, таких какfs
, устраняет необходимость в установке и настройке сторонних сервисов. Это упрощает настройку и развитие проекта. -
Долговечность кэша:
Кэш в файловой системе сохраняется между запусками вашего приложения. Это значит, что даже после перезагрузки сервер будет иметь доступ к ранее сохраненным данным.
Минусы использования файловой системы для кэширования
-
Производительность:
Чтение и запись файлов на диск значительно медленнее, чем доступ к данным в памяти. Если ваш API получает большое количество запросов, это может стать узким местом в производительности вашего приложения, особенно при работе с высоконагруженными сервисами. -
Ограниченные возможности параллелизма:
При использовании файловой системы вам придется учитывать, что одновременные запросы могут привести к состоянию гонки. Несколько экземпляров вашего приложения могут пытаться одновременно модифицировать один и тот же файл, что может вызвать повреждение данных и ошибки. -
Управление данными:
Необходимо организовать механизм для обработки устаревших записей в кэше. В вашем коде предусмотрены временные метки, но это требует постоянной проверки и очистки кэша, что добавляет дополнительную сложность. -
Безопасность и доступность:
Файлы кэша могут быть уязвимы для атак, если не предприняты меры для их защиты. Неправильная конфигурация может привести к утечкам данных или возможности их изменения извне.
Когда стоит использовать файловую систему для кэширования
Использование файловой системы для кэширования может быть оправдано в следующих сценариях:
- Небольшие приложения с ограниченным объемом данных и небольшим числом запросов.
- Миграция к более сложным решениям, такими как Redis, требует времени, и нужно временное решение.
- Прототипы и тестирование, когда производительность не является критически важной.
Заключение
Хотя использование Node.js и его файловой системы для кэширования API-ответов в Next.js или Express.js может быть подходящим решением в определенных случаях, важно учитывать потенциальные недостатки. В зависимости от требований вашего проекта, возможно, стоит рассмотреть альтернативные решения для кэширования, которые обеспечивают более высокую производительность и безопасность, даже если это требует дополнительных усилий на этапе разработки или развертывания.