Проблемы с загрузкой замедляют работу вашего приложения и расстраивают пользователей? Не парься! У нас есть секретный рецепт, как превратить ваше приложение в молниеносную электростанцию, которая заставит пользователей хотеть большего.

Попытка улучшить производительность приложения может показаться исследованием живых пещер кролика. Вы настраиваете базу данных, оптимизируете запросы, но все равно сталкиваетесь с узкими местами при загрузке. Не бойтесь, мы собираемся представить революционное решение: Redis, непревзойденный ускоритель скорости.

Redis: революционный подход к оптимизации производительности

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

// Redis connection setup
const redis = require("redis");
const client = redis.createClient();

// Caching data in Redis
client.set("key", "value", "EX", 3600); // Set a key-value pair with an expiration of 1 hour

// Retrieving cached data from Redis
client.get("key", (err, result) => {
  if (err) throw err;
  console.log(result); // Outputs the cached value
});

Создание эффективных ключей кэша

Redis творит чудеса, сохраняя часто используемые данные в памяти, но ключ к раскрытию всего его потенциала лежит в искусстве создания ключей кэша. Создание идеального ключа кэша имеет решающее значение для использования преимуществ кэширования Redis. Это как найти золотую середину между уникальностью и универсальностью.

// Caching expensive database query using Redis
app.get("/data", async (req, res) => {
  const cachedData = await client.getAsync("cachedData");
  if (cachedData) {
    res.json(JSON.parse(cachedData));
  } else {
    const newData = await fetchAndProcessData(); // Expensive database query and processing
    client.set("cachedData", JSON.stringify(newData));
    res.json(newData);
  }
});

Совет. При создании ключей кеша соблюдайте баланс между уникальностью и универсальностью. Если ключ не уникален, вы рискуете получить неверные данные кэша. С другой стороны, если ключ слишком специфичен, шансы на повторное использование кеша уменьшаются. Стремитесь к ключу, который фиксирует суть данных, допуская широкое повторное использование.

// Example of cache key creation
const cacheKey = `user:${userId}:profile`;

// Retrieving cached user profile data
client.get(cacheKey, (err, result) => {
  if (err) throw err;
  console.log(result); // Outputs the cached user profile data
});

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

Кэширование только для "READ" API

При использовании кэширования с Redis крайне важно помнить о времени и контексте использования кэша. Хотя кэширование может значительно повысить производительность операций с большим количеством операций чтения, таких как извлечение данных из базы данных или внешних API-интерфейсов, важно проявлять осторожность при применении кэширования к API-интерфейсам с возможностью записи.

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

// Writable API endpoint for creating a new user
app.post('/api/users', (req, res) => {
  // Process the request and create a new user in the database
  
  // Avoid caching the response of writable APIs
  res.sendStatus(201);
});

// Read API endpoint for retrieving user profile data
app.get('/api/users/:userId', (req, res) => {
  const { userId } = req.params;

  // Check if the user profile data is available in cache
  client.get(`user:${userId}:profile`, (err, cachedData) => {
    if (err) throw err;
    
    if (cachedData) {
      // If cached data exists, return it
      res.json(JSON.parse(cachedData));
    } else {
      // If not cached, fetch the data from the database
      // and cache it for future use
      const userProfile = // Fetch user profile data from the database
      
      // Store the fetched data in cache
      client.setex(`user:${userId}:profile`, 3600, JSON.stringify(userProfile));
      
      // Return the fetched user profile data
      res.json(userProfile);
    }
  });
});

В приведенном выше примере доступный для записи API /api/users отвечает за создание новых пользовательских записей и не должен кэшировать ответ. С другой стороны, API чтения /api/users/:userId извлекает данные профиля пользователя и включает кэширование для повышения производительности. Тщательно выбирая API для кэширования, вы можете найти правильный баланс между оптимизацией производительности и согласованностью данных.

Максимальная эффективность кэширования с истечением срока действия и предварительным кэшированием

Чтобы обеспечить актуальность ваших данных и найти правильный баланс между производительностью и точностью данных, крайне важно учитывать срок действия кэша. Установка соответствующего срока действия для ключей кэша позволяет периодически автоматически обновлять данные. Помните о характере ваших данных и частоте обновлений, чтобы определить оптимальное время истечения срока действия. Таким образом, вы можете предоставлять своим пользователям актуальную информацию, сохраняя при этом преимущества кэширования.

Еще одним методом повышения эффективности кэширования является предварительное кэширование. Предварительно загружая часто используемые данные в кеш, вы можете уменьшить задержку, связанную с получением данных из базы данных или внешних служб. Определите критически важные данные, к которым обычно обращаются, и заблаговременно извлекайте их в непиковые периоды. Этот упреждающий подход к кэшированию гарантирует, что данные будут легко доступны, когда это необходимо, сводя к минимуму время ожидания пользователя и улучшая общее взаимодействие с пользователем.

// Pre-caching frequently accessed data
function preloadDataIntoCache() {
  const popularProducts = // Fetch popular products from the database
  const featuredArticles = // Fetch featured articles from external service

  // Store popular products and featured articles in cache
  client.setex('popular_products', 3600, JSON.stringify(popularProducts));
  client.setex('featured_articles', 3600, JSON.stringify(featuredArticles));
}

// Preload data into cache during non-peak periods
app.listen(3000, () => {
  // Preload data into cache at application startup
  preloadDataIntoCache();

  // Preload data into cache periodically (e.g., once a day)
  schedule('0 0 * * *', preloadDataIntoCache);
});

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

🔗 Ознакомьтесь с эксклюзивной программой членства на it.works для получения дополнительных ресурсов по Javascript, руководств и поддержки сообщества.

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .