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

В этом посте мы рассмотрим, как использовать ts-cache-mongoose для ускорения запросов и агрегатов Mongoose.

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

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

Зачем кэшировать запросы и агрегаты Mongoose?

Когда приложение Node.js делает запрос к базе данных MongoDB, база данных должна выполнить поиск по всем документам в коллекции, чтобы найти документы, соответствующие запросу. Этот процесс может быть медленным, особенно если коллекция содержит большое количество документов.

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

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

Как кэшировать запросы и агрегаты Mongoose с помощью ts-cache-mongoose?

npm install ts-cache-mongoose
yard add ts-cache-mongoose

Этот плагин требует установки mongoose >=6.6.x || 7.x в качестве одноранговой зависимости.

# For mongoose 6
npm install mongoose@legacy
yarn add mongoose mongoose@legacy
# For mongoose 7
npm install mongoose@latest
yarn add mongoose@latest

Затем просто используйте его в своем приложении по выбору

// On your application startup
import mongoose from 'mongoose'
import cache from 'ts-cache-mongoose'

// In-memory example 
cache.init(mongoose, {
  engine: 'memory',
})

// Redis example
cache.init(mongoose, {
  engine: 'redis',
  engineOptions: {
    host: 'localhost',
    port: 6379,
  },
})

mongoose.connect('mongodb://localhost:27017/my-database')

// Somewhere in your code
const users = await User.find({ role: 'user' }).cache('10 seconds').exec()
// Cache hit
const users = await User.find({ role: 'user' }).cache('10 seconds').exec()

const book = await Book.findById(id).cache('1 hour').exec()
const bookCount = await Book.countDocuments().cache('1 minute').exec()
const authors = await Book.distinct('author').cache('30 seconds').exec()

const books = await Book.aggregate([
  {
    $match: {
      genre: 'fantasy',
    },
  },
  {
    $group: {
      _id: '$author',
      count: { $sum: 1 },
    },
  },
  {
    $project: {
      _id: 0,
      author: '$_id',
      count: 1,
    },
  }
]).cache('1 minute').exec()