>本教程演示了如何通过实现REDIS缓存层与MongoDB数据库进行交互的Node.js Web服务的性能。 我们将构建一个“ fastlibrary”应用程序来说明该概念。
REDIS缓存的 关键优点:
理解内存层次结构:> 缓存解决了存储容量和速度之间的固有权衡。 硬盘驱动器的容量很大,但访问缓慢,而RAM更快但较小。 CPU寄存器最快,但容量最小。 缓存充当高速中介,将常见的数据存储在更快的内存中(如RAM)。 下图说明了以下内容:
> 我们将创建一个具有两个端点的简单Web服务:
POST /book
:通过标题检索书的内容。
GET /book/:title
步骤1:项目设置:创建一个项目目录并初始化npm:>
>安装依赖项:mkdir fastLibrary && cd fastLibrary && npm init
npm install express mongodb redis --save
>
文件设置Express Server并连接到MongoDB:
>access.js
>步骤3:集成redis缓存:
<code class="language-javascript">module.exports.saveBook = (db, title, author, text, callback) => { db.collection('text').save({ title, author, text }, callback); }; module.exports.findBookByTitle = (db, title, callback) => { db.collection('text').findOne({ title }, (err, doc) => { if (err || !doc) callback(null); else callback(doc.text); }); };</code>>
index.js
在
<code class="language-javascript">// ... (require statements and MongoDB connection as before) ... app.post('/book', (req, res) => { // ... (save book logic as before) ... }); app.get('/book/:title', (req, res) => { // ... (get book logic, updated later with caching) ... }); // ... (app.listen as before) ...</code>>
修改
index.js
>
<code class="language-javascript">const redis = require('redis').createClient({ url: 'redis://localhost:6379' }); redis.connect().catch(console.error);</code>
access.js
的端点以使用findBookByTitleCached
:<code class="language-javascript">module.exports.findBookByTitleCached = (db, redis, title, callback) => { redis.get(title, (err, reply) => { if (err) callback(null); else if (reply) callback(JSON.parse(reply)); // Cache hit else { // Cache miss db.collection('text').findOne({ title }, (err, doc) => { if (err || !doc) callback(null); else { redis.set(title, JSON.stringify(doc)); // Add to cache callback(doc.text); } }); } }); };</code>
GET /book/:title
>
index.js
启动启用LRU启动REDIS和一个内存限制(根据需要进行调整):findBookByTitleCached
<code class="language-javascript">app.get('/book/:title', (req, res) => { access.findBookByTitleCached(db, redis, req.params.title, (book) => { if (!book) res.status(404).send('Book not found'); else res.send(book); }); });</code>>
>添加一个端点以更新书籍并相应地更新缓存。 这需要将函数添加到和
>>>>>。 (为简洁而省略了实现细节,但类似于上面的缓存逻辑)。
>性能测试和结论:
实施缓存后,在有没有缓存的情况下比较性能指标(响应时间)以观察改进。 请记住,过早的优化可能是有害的,因此请仔细评估缓存是否需要和适合您的应用。 考虑诸如读/写比例,查询复杂性和数据一致性要求之类的因素。 提供的常见问题解答提供了这些注意事项的其他见解。
>以上是用REDIS缓存mongoDB数据库的详细内容。更多信息请关注PHP中文网其他相关文章!