请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

没太理解 内存炸和多线程不能共享的问题

cookie会暴露username所以 在cookie中存储userid
让server端对应username 这种解决方案称为 session
session 直接是js变量 在node.js的内存中

问题1:
如果http请求进行访问,进程内存有限。
可是其他的数据 还有一些函数之类的 不是也都在node.js的进程内存中吗
如果是教学中的session 似乎只是一个很小的字符串而已,相比于那些函数来说
其实没有多大意义,老师的意思是 session在实际开发中可能很大
所以才会导致内存炸掉,需要redis吗

问题2:
另外也不是很能理解
多线程不能访问彼此的内存的话,也没事吧
因为http请求发送了cookie (session)
cookie返回是否带有userid 如果有的话,就不再设置userid
那这样对各个线程的node.js来说不是可以共享这个cookie吗?

希望老师解答一下

正在回答

2回答

先回答你题干中的两个问题。

  1. 真正的线上请求,在线用户多了,session 会很大,可能会撑满内存。另外,如果开启多进程,session 存储在各个进程中,进程中数据不能共享。即,你登录时访问的是进程 P1 ,记录了 session ,你下次操作正好访问了进程 P2 ,此时就拿不到这个 session ,因为 session 在 P1 中。

  2. 多进程可以共享 cookie ,但是无法共享 session (除非 sessoin 统一放在 redis 中)。cookie 中 userid 传过来了,但是没有 session 数据,光有 userid 啥也干不了,连用户名是谁都不知道。

1 回复 有任何疑惑可以回复我~
  • 提问者 Inuyasha__ #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-08-05 21:09:20
提问者 Inuyasha__ 2019-08-05 20:43:33

好像可以理解session的内存爆炸的问题了,因为每次访问都要经过www.js 这里session的访问频率很高,不过仍有其他js变量存储在www.js中,session很大吗?

0 回复 有任何疑惑可以回复我~
  • 双越 #1
    每次有请求过来,都会走 www.js ,函数中的变量也会创建。但是,请求结束之后,这些函数中的变量就会释放,被垃圾回收。就像一个函数中的局部变量,执行完了也就释放了。而 session 不能随着请求结束就释放,必须一定时间存储在内存中,因此会持续累积。
    回复 有任何疑惑可以回复我~ 2019-08-05 21:06:55
  • 提问者 Inuyasha__ 回复 双越 #2
    谢谢老师
    回复 有任何疑惑可以回复我~ 2019-08-05 21:09:41
  • 老师,我有个一个疑惑,(1)session为什么不能随着请求结束就释放呢,session不应该是每个用户的数据里都有这个变量吗?为什么是所有用户都共享这个变量呢?
    回复 有任何疑惑可以回复我~ 2020-01-16 12:10:11
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信