Кэширование объектов мангусты с помощью Redis

Можно ли, к примеру, кэшировать объекты документа mongoose в Redis, возможно, для реализации кеша с обратной записью или сквозной записи с механизмами очистки кэша на основе тайм-аута?

PS: я знаком с https://github.com/conancat/mongoose-redis-cache, но думаю, что он поддерживает только худые запросы, которые здесь не совсем подходят. (Но я могу ошибаться).

2 ответа

Решение

Поскольку объекты Mongoose обертывают документ MongoDB, не было бы никакой причины, по которой вы не могли бы вызвать

JSON.stringify(mongooseObject.toJSON())

который будет возвращать строку, представляющую документ MongoDB. ( toJSON) Вы можете сохранить этот результат в ключе / значении в Redis.

То, где это начинает становиться более сложным, - то, что Вы должны сначала переопределить save а также update функциональность для сохранения любых изменений в вашем магазине Redis, а не в базе данных. Несмотря на то, что выполнимо, Mongoose не был разработан для этого, и вы, вероятно, были бы более успешны, если бы просто использовали встроенные драйверы mongodb и таким образом управляли общими документами. Существует ряд чрезвычайно удобных операторов, с которыми вам нужно работать независимо (например, $push например, который добавил бы одно значение в массив).

Однако реальная проблема заключается в том, что вы теряете почти все возможности MongoDB, не имея возможности использовать механизм запросов или структуру агрегации, если все данные еще не сохранены в MongoDB (и даже если это так, вы все еще в обход вашего слоя кэширования). И, если вы не используете какую-либо из этих функций, то MongoDB может не подойти для ваших нужд (и вместо этого вы можете рассмотреть что-то вроде CouchDB).

Хотя я вижу потенциальную ценность использования уровня кэширования для высокопроизводительной системы MongoDB, сложность кэша стиля обратной записи может быть более сложной, чем она стоит (и не обязательно безопасной).

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

(Кроме того, я не уверен, как бы вы на самом деле управляли тайм-аутами, так как я думал, что redis удалит значения, связанные с ключами, если им назначены время жизни / тайм-аут? Я бы не хотел терять данные в кэш redis, если Вы делали обратную запись).

В Redis вы можете кэшировать только необработанные JSON, но для кэширования целых объектов Mongoose.Documents вы можете использовать мою библиотеку, которая обрабатывает как результаты кэширования в Redis, так и документы мангуста в памяти. Он также имеет основанную на событиях логику для очистки обоих кешей, если появляются некоторые связанные изменения.

https://www.npmjs.com/package/speedgoose

Другие вопросы по тегам