我正在读一本关于NodeJS的书,下面的例子引起了我的注意:
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
var tweets = []
app.listen('8000', '172.27.6.69', () => {
console.log(`Server running on http://localhost:8000`)
})
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.get('/', (req, res) => {
res.send('Welcome to Twitter!')
})
app.post('/tweet', (req, res) => {
if (req.body && req.body.tweet) {
tweets.push(req.body.tweet)
res.send({ error: false, message: 'Tweet received' })
} else {
res.send({ error: false, message: 'No tweet received' })
}
})
app.get('/tweets', (req, res) => {
res.send({ error: false, data: tweets, pid: process.pid })
})
如果我在任何服务器上发布代码并且有几个人尝试发推文,那么它们存储在数组推文中,任何发出GET请求的人都可以看到所有的推文,我们得到相同的PID。所以,我的问题是:这些数据是否始终保留在内存中?为什么NodeJS与所有用户共享内存?为什么我们得到相同的PID?
答案 0 :(得分:0)
你提出了正确的问题。如果只有以node.js开头的人都会问这些问题!
该数据是否始终保留在内存中?
是的,直到进程崩溃,正常关闭或数据被垃圾收集,因为您的代码无法再访问它,就像您覆盖tweets数组或其他内容一样。为了使数据保持不变 - 例如,即使您的进程崩溃并重新启动,仍然可以保留数据 - 您需要使用某种持久性,如数据库或存储的东西磁盘上的数据。 Redis,MySQL和MongoDB是不同持久性工具的示例。
为什么NodeJS与所有用户共享内存?
在node.js进程中没有用户或每用户内存的概念。单个进程有一个内存地址空间,整个进程可以看到并使用它认为合适的任何方式,并且相同的进程继续运行,请求后提供请求。在该过程内执行的程序负责控制谁可以查看哪些数据。例如,您可以将会话中间件添加到Express,这将为每个用户(由浏览器cookie标识)提供他们自己的小私有" stash"数据的。如果你这样做了,那么你可能会有req.user
这样的东西,你可以将它们粘贴到推文列表上。会话数据存储可以在内存中,或者(更常见地)由Redis或MongoDB等持久性存储支持。
为什么我们得到相同的PID?
这是因为您的服务器显然在单个node.js进程中运行。它还可以通过在同一台机器上运行一组node.js进程来扩展您的服务器,所有进程都可以轮流使用#34;提供传入的HTTP请求。如果你这样做,你就会开始看到不同请求的不同PID。您还可以看到不同的推文,因为每个进程都有单独的内存(因此它自己独立的tweets
数组),它们彼此不共享。此外,在最终用户的POV中,在任何给定时间出现的推文基本上是随机的。这是您不能依赖内存数据存储的另一个原因,因为您几乎总是希望跨多个流程,多台机器,甚至多个数据中心和区域进行扩展,但始终提供一致性数据集。
然而,所有这些都说,在试验和学习node.js时,使用内存数据存储是完全正常的。一旦你对事物有所了解,你就可以单独扩展。如果你试图在没有理解记忆如何工作的情况下进行扩展,那么记住内存存储可能会让你感到高兴,因此这些都是很好的问题。