一、cookie
1.什么是cookie?
存储在浏览器的一段字符串(最大5Kb)
跨域不共享
格式如k1=v1;k2=v2因此可以存储结构化数据
每次发送http请求,会将请求域的cookie一起发送给server;
server可以修改cookie并返回给浏览器;
浏览器可以通过js修改cookie(有限制)(后端设置httpOnly可以限制前端对cookie的修改)
二、session
cookie中会暴露一些敏感信息,很危险
解决方法:cookie中存储userid(标识),server端对应username(通过userid去解析,从一个集合中去查出用户信息来)这就是session,即server端存储用户信息
目前session直接是js变量,放在nodejs进程内存中。这时候存在两个问题:
1.进程内存有限,访问量过大,内存暴增怎么办?
(操作系统会限制一个进程的最大可用内存)
2.正式线上运行是多进程,进程之间内存无法共享
----->解决方案:把session放到redis中存储
三、redis
redis是web server最常用的缓存数据库,数据存放在内存中;
相比mysql,访问速度快(内存和硬盘不是一个数量级的);
但是成本更高,可存储的数据量更小(内存的硬伤)
- 将web server和redis拆分成两个单独的服务
- 双方都是独立的,都是可扩展的(例如都扩展成集群)
- (包括mysql,也是一个单独的服务,也可扩展)
- 为何session适合redis?
session访问频繁,对性能要求极高
session可不考虑断电丢失数据的问题(内存的硬伤)
session数据量不会太大(相比于mysql中存储的数据)
2.为何网站数据不适合用redis?
操作频率不是太高(相比于session操作)
断电不能丢失,必须保留
数据量太大,内存成本太高