首页 >web前端 >js教程 >用REDIS缓存mongoDB数据库

用REDIS缓存mongoDB数据库

Jennifer Aniston
Jennifer Aniston原创
2025-02-19 13:00:15975浏览

>本教程演示了如何通过实现REDIS缓存层与MongoDB数据库进行交互的Node.js Web服务的性能。 我们将构建一个“ fastlibrary”应用程序来说明该概念。

REDIS缓存的

关键优点:>

    通过将经常访问的数据存储在Redis快速的内存存储中,可以显着提高读取性能。
  • >
  • >减少MongoDB数据库上的负载,从而防止在数据尺度上进行性能瓶颈。
  • REDIS的LRU(最近使用的最不使用)缓存驱逐策略自动管理内存使用量。

理解内存层次结构:> 缓存解决了存储容量和速度之间的固有权衡。 硬盘驱动器的容量很大,但访问缓慢,而RAM更快但较小。 CPU寄存器最快,但容量最小。 缓存充当高速中介,将常见的数据存储在更快的内存中(如RAM)。 下图说明了以下内容:

Caching a MongoDB Database with Redis

>构建“ fastlibrary”应用程序:

> 我们将创建一个具有两个端点的简单Web服务:

    :在Mongodb中创建一个新书条目。
  • POST /book:通过标题检索书的内容。
  • GET /book/:title步骤1:项目设置:
  • >

创建一个项目目录并初始化npm:>

>安装依赖项:
  1. mkdir fastLibrary && cd fastLibrary && npm init
  2. >
  3. 步骤2:基本mongodb互动: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

中初始化redis客户端:
<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>
>

修改
    添加
  1. index.js>
<code class="language-javascript">const redis = require('redis').createClient({ url: 'redis://localhost:6379' });
redis.connect().catch(console.error);</code>
    更新
  1. > access.js的端点以使用findBookByTitleCached
  2. >
<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>
    >
  1. 步骤4:配置redis lru:GET /book/:title> index.js启动启用LRU启动REDIS和一个内存限制(根据需要进行调整):> findBookByTitleCached
步骤5:处理缓存更新(put端点):
<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn