При создании приложения 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()