首先你需要明白 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,qps160.25,乘5乘8随意也就1000qps峰值,存这些登录态7天活跃能有多大,百万级别至多了吧,一台4核16G的netty机器足够了,开swap都没啥大不了的。。。,不够?那是因为你缺台热备机,用到redis也就是因为切换主备用户最好没感知(对哦,我这可是叫做集群喔,毕竟2台机器+redis+小负载均衡网关),你要操心的所有问题可能都是mysql。

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