一.提出问题

若session直接是js变量,放在nodejs进程内存中,会存在各种各样的问题:

问题一:第一,进程内存有限,访问量过大,内存暴增怎么办? —— 操作系统会限制一个进程的最大可用内存
SharedScreenshot.jpg
问题二:正式线上运行是多线程,进程之间内存无法共享(即第一次登录时用第一个线程,而下一次登录时又使用其他进程的话就无法验证当前为登录状态)
SharedScreenshot.jpg
正式上线的时候每一个nodejs程序都是分成多个进程跑的,第一个是因为操作系统对一个进程的分配内存空间是有限的(问题一图片中文字的含义)。然而在服务器中内存都很大,如果在内存较大的服务器中只跑一个nodejs程序就会造成内存资源浪费;第二个是因为计算机cpu都是多核的,多核就可以同时多个并行处理多个任务进程。
所以不管从内存的使用量上以及cpu的使用量上都希望是符合服务器当前的一个硬件标准—去启动多个进程。
多进程概括起来—就是多个机器,多个机房,多个集群。如果说是每个进程中都有session的话,进程之间的内存是不能共享的,相互隔离的(即进程之间数据是不能共享的)。那如果我们开了三个进程,第一次访问第一个进程,第二次访问下一个进程,那第一个的session就没有了,因为进程之间数据是不能共享的。那为什么每一次访问都会命中不同的进程呢?—因为前面会有一个分配工具·,它会给你分配内存安排进程的,它会看哪个进程比较闲,他就会给分配到哪个进程中,这样就会保证每一个进程负载的任务数量比较的平均。

二.解决方案redis

特点:
reids — web server最常用的缓存数据库,数据库放在内存中。内存有什么特点:优点就是读写特别快,缺点就是内存比较昂贵(内存比硬盘贵多了),然后内存的空间小一些;还有就是会状态丢失,一挂机就没了。
相比于mysql,访问速度快(内存)— 因为mysql是一个硬盘数据库,虽然说mysql是通过Bit数方式进行的数据组织,访问数据很快,但它还是有硬件上的隔离。内存和硬盘在访问时在速度和数量上都不是同一个数量级,硬盘上的数据不管再怎么优化都干不过读取内存上的数据。
但是成本过高,可存储的数据量更小(内存硬伤)

所以说,一个系统及使用mysql,又使用redis,这是一种结合的方案,有的地方适合mysql,有的地方适合redis,因为它们有不同的特点。
SharedScreenshot.jpg
根据上图的描述,即
将web server 和redis拆分成两个单独的服务;
双方都是独立的,都是可扩展的(例如都扩展成集群)
包括mysql,也是一个单独的服务,也可扩展

也就是说把session放到redis中,就可以完美的解决之前所提到的问题。

三.为何session适合用redis?

1.session为什么不放到mysql中?— session 访问频繁,对性能要求极高

2.session可不考虑断电丢失的情况(内存硬伤)— redis其实也可以做到断电数据不丢失,做一些备份策略的配置即可,所以说这不是主要原因—但是还是比较麻烦的;

3.session数据量不会太大(相比于mysql中存储的数据)
**

四.为何网站数据不适合用redis

1.操作频率不是太高(相比于session操作)

2.断电不能丢失,必须保留

3.数据量太大,内存成本太高