编程

session 正在被淘汰吗?

861 2022-01-21 15:02:14

首先你需要明白 session 的本质是什么,然后你就会发现 session 一直都在。虽然可能换了个名字,或者换了存储方式,但 session 的本质并没有改变。例如你说的将状态信息写出来 redis,这就是换了个存储方式,目的是利用 redis 的共享性和速度。

session 的实现方式有很多种,redis 只是其中之一。除了像 JWT 这种将状态信息存储在客户端的“异类”,其他将信息存于服务端并通过唯一 ID 寻址的都是 session。

http 无状态,所以为了实现有状态 http,才有了会话(session)的概念。说实话,网上很多关于会话的讨论都过于具体,会牵扯到不同的实现方案,容易让人误会,下文的“会话”都指的是广义的 web 会话。

客户端保管方式

credential 由客户端保管,客户端怎么存放几乎不关服务器的事,浏览器,安卓 app,ios app,桌面应用等都是客户端

浏览器一般把 credential 放在 cookie 里,就像把曲奇饼(cookie)放在小罐子里,cookie 特殊的地方在于,浏览器会听服务器的话,比如服务器在设置cookie时指定了“http only”,那浏览器就不会允许 js 拿到,至于其他的客户端,想放哪放哪,直接存文件或存本地数据库都行,或者还有其他骚操作都行。

 

session 的实质就是前端保存一个 id,后端根据这个 id 来识别会话,存取数据。仅此而已,至于这个 id 怎么保存,可以放在 url 后面,可以放在 cookie 里,甚至可以放在 header 里。

在我看来,只要用到这种模式的都算 session,只不过这种 id(专业点叫token)的实现方式不同。session 的缺点就是数据保存在哪里的问题,既然要保存,分布式的时候肯定要保证 session 一致性。

http 是无状态的,业务是有状态的,cookie 也好,session 也好,都是为了实现这个需求而创造的工具,无论技术怎么演进,万变不离其宗,还是会有个地方存储业务的状态,区别只是方式和实现的不同,本质并没有变。

此基本流程之上,cookie session https 存内存还是存 redis 还是存磁盘,存 1 天,1 周,1 个月,自有协议,通用协议等等,并无本质区别,没谁死,都活得好好的

“大型网站”就没几个,一天 1 亿 PV,qps 160.25,乘 5 乘 8 随意也就 1000 qps 峰值,存这些登录态 7 天活跃能有多大,百万级别至多了吧,一台 4 核 16G 的 netty 机器足够了,开 swap 都没啥大不了的…,不够?那是因为你缺台热备机,用到 redis 也就是因为切换主备用户最好没感知(对哦,我这可是叫做集群喔,毕竟 2 台机器+redis+小负载均衡网关),你要操心的所有问题可能都是mysql。

狭义的 session,是基于 http 协议,通过浏览器 cookie 和服务端 session 对应来鉴权和保存用户状态。说到集群,php 原生支持部署 session 到 redis,memcached,mysql 等。只需要几行简单的配置即可.