📜  如何访问 Node.js 中的缓存数据?

📅  最后修改于: 2022-05-13 01:56:40.267000             🧑  作者: Mango

如何访问 Node.js 中的缓存数据?

缓存:缓存是一种用于提高服务器和日常生活中使用的许多设备性能的技术。
在缓存中,某些计算或任务的结果存储在某处,如果再次需要相同的计算,则从该位置本身提供服务,而不是再次进行计算。这减少了计算并提高了性能,从而提供了更好的用户体验。
许多应用程序在第一次被触发时缓存数据,因此能够有效地提供响应。同样,大多数服务器都为在大多数时间提供相同响应的端点提供了高级缓存机制。

可以使用各种技术存储缓存,例如内存缓存、文件缓存或单独的缓存数据库。
本文演示了使用 node-cache 包在 Node.js 中使用缓存,这是一个内存缓存模块。

使用节点缓存实现缓存演示。

创建基本节点 js 服务器。使用 express 构建简单的 nodejs REST API

通过以下命令确保已安装节点:

node -v

使用以下命令导航到所需的项目目录并安装 express(用于创建服务器)和 node-cache npm 包:

npm i express node-cache

项目结构:

示例:使用以下代码在目录中创建文件server.js

server.js
// Importing express module
const express = require('express')
    
// Creating an express object
const app = express()
    
// Starting server using listen function on port 8000
app.listen(8000, err => { 
   if(err) 
        console.log("Error while starting server")
   else
        console.log("Server has been started at port 8000")
})
  
app.get('/', (req, res)=>{
    res.send('Home page !')
})


server.js
function heavyComputation(){
     let temp = 0;
     for(let i=0; i<100000; i++)
          temp = (Math.random()*5342)%i;
     return 123;
}
  
app.get('/api', (req, res)=>{
     let result =  heavyComputation();
     res.send("Result: "+result);
})


server.js
// Importing express module
const express = require('express')
  
// Importing NodeCache and creating a 
// new object called myCache
const NodeCache = require('node-cache')
const myCache = new NodeCache()
    
// Creating an express object
const app = express()
    
// Starting server using listen
// function on port 8000
app.listen(8000, err => { 
   if(err) 
        console.log("Error while starting server")
   else
        console.log(
        "Server has been started at port 8000")
})
  
app.get('/', (req, res)=>{
    res.send('Home page !')
})
  
// Function to demonstrate heavy computation
// like API requests, database queries, etc.
function heavyComputation(){
     let temp = 0;
     for(let i=0; i<100000; i++)
          temp = (Math.random()*5342)%i;
     return 123;
}
  
app.get('/api', (req, res)=>{
      
     // If cache has key, retrieve value
     // from cache itself
     if(myCache.has('uniqueKey')){
          console.log('Retrieved value from cache !!')
            
          // Serve response from cache using
          // myCache.get(key)
          res.send("Result: " + myCache.get('uniqueKey'))
     }else{
  
          // Perform operation, since cache 
          // doesn't have key
          let result =  heavyComputation()
            
          // Set value for same key, in order to 
          // serve future requests efficiently
          myCache.set('uniqueKey', result)
            
          console.log('Value not present in cache,'
                + ' performing computation')
          res.send("Result: " + result)
     }
})


运行以下命令:

node server.js

输出:在所需浏览器中打开链接:http://localhost:8000/ 进行验证

主页

创建一个简单的 API,执行昂贵的操作来提供响应(模拟外部 API/数据库查询)。

server.js末尾添加以下代码

服务器.js

function heavyComputation(){
     let temp = 0;
     for(let i=0; i<100000; i++)
          temp = (Math.random()*5342)%i;
     return 123;
}
  
app.get('/api', (req, res)=>{
     let result =  heavyComputation();
     res.send("Result: "+result);
})

通过Ctrl+C停止服务器并通过node server.js重新启动。
在浏览器中,打开 Chrome 开发工具中的网络选项卡并检查获得响应所需的时间。

实现 node-cache:导入 Node-cache npm 模块并创建一个新的 NodeCache 对象

const NodeCache = require( "node-cache" );
const myCache = new NodeCache();

Node-cache 具有以下主要功能:

  • .set(key, val, [ ttl ]):用于设置与缓存中特定键对应的一些值。必须使用相同的键来检索该值。
  • .get(key):用于获取设置为指定键的值。如果键不存在,则返回未定义。
  • has(key):用于检查缓存是否已经为指定的键设置了一些值。如果存在则返回 true,否则返回 false。

使用以下方法实现缓存:

  • 在 API 请求中,使用 has(key)函数检查缓存是否已经设置了密钥
  • 如果缓存有key,则通过get(key)函数获取缓存值并使用它,而不是再次执行操作。 (这样可以节省时间)
  • 如果缓存没有键,则执行所需的操作,并在发送响应之前,设置该键的值,以便可以通过缓存数据直接响应进一步的请求。

server.js 中的最终代码:

服务器.js

// Importing express module
const express = require('express')
  
// Importing NodeCache and creating a 
// new object called myCache
const NodeCache = require('node-cache')
const myCache = new NodeCache()
    
// Creating an express object
const app = express()
    
// Starting server using listen
// function on port 8000
app.listen(8000, err => { 
   if(err) 
        console.log("Error while starting server")
   else
        console.log(
        "Server has been started at port 8000")
})
  
app.get('/', (req, res)=>{
    res.send('Home page !')
})
  
// Function to demonstrate heavy computation
// like API requests, database queries, etc.
function heavyComputation(){
     let temp = 0;
     for(let i=0; i<100000; i++)
          temp = (Math.random()*5342)%i;
     return 123;
}
  
app.get('/api', (req, res)=>{
      
     // If cache has key, retrieve value
     // from cache itself
     if(myCache.has('uniqueKey')){
          console.log('Retrieved value from cache !!')
            
          // Serve response from cache using
          // myCache.get(key)
          res.send("Result: " + myCache.get('uniqueKey'))
     }else{
  
          // Perform operation, since cache 
          // doesn't have key
          let result =  heavyComputation()
            
          // Set value for same key, in order to 
          // serve future requests efficiently
          myCache.set('uniqueKey', result)
            
          console.log('Value not present in cache,'
                + ' performing computation')
          res.send("Result: " + result)
     }
})
  • 通过 Ctrl+C 停止服务器并通过节点 server.js 重新启动。
  • 重新加载网页一次。执行该时间计算。它也可以在控制台上看到
  • 重新加载网页。这次数据是从缓存中提供的,如控制台上所见。
  • 进一步的重新加载将从缓存中提供数据,从而节省计算量。

注意:这里的响应时间差异并不显着,因为计算量非常少,但是对于大型和规模化的项目,它提供了巨大的性能提升。
例如,GeeksforGeeks 还为各种目的使用高级缓存机制来实现效率。