redis集群 - Redis 分布式缓存,是如何实现多台服务器SESSION 实时共享的

【字号: 日期:2022-08-27浏览:31作者:雯心

问题描述

现在提到多服务器的共享session,几乎都是回答用redis。对于redis实现几台服务器共享session,不是很理解。假如一个网站分别部署在A B C 3 台服务器上,他们的代码都是相同的。用户在访问的过程中是随机切换到其他服务器,使用redis来共享session,那么是这3台服务器是如何实现session 实时共享的?

个人猜想的方案

方案一:A B C 三台服务器上每台服务器都部署session,PHP 直接连本台服务器的 127.0.0.1 的REDIS进行操作SESSION,通过本地REDIS进程他们相互的配置好了相互的共享机制?所以就实现了三台服务器SESSION实时共享

方案二:将REDIS 另外的部署到第四台服务器D, A B C 三台服务器上的PHP配置连接的REDIS是这台D服务器。那么就实现了统一的SESSION 实时共享,这样貌似不正确。

很疑惑Redis SESSION 实时共享到底是如何实现的?这三台服务器的PHP 都是连接到本地的127.0.0.1 6379 的REDIS 还是?

问题解答

回答1:

首先要明确session和cookie的区别。浏览器端 存的是cookie每次浏览器发请求到服务端是http 报文头是会自动加上你的cookie信息的。服务端拿着用户的cookie作为key去存储里找对应的value(session).

同一域名下的网站的cookie都是一样的。所以无论几台服务器,无路请求分配到哪一台服务器上同一用户的cookie是不变的。也就是说cookie对应的session也是唯一的。

只要保证多台业务服务器访问同一个redis服务器(或集群)就行了。 这样就能达到你的目的。所以你的方案二是对的

回答2:

既然是共享的,当然是要存储在同一个Redis里,这其中说的就是你的第二种。

用Redis共享Session,关键是Session就是部署在Redis上,就存储在Redis中,本地不再部署文件Session。

回答3:

既然用redis来共享session,本质上就意味着redis对你来讲只有一个实例,但是这个实例是仅仅启动了一个redis服务还是在多个服务器上部署一个redis集群跟你的应用层是无关的。

对于可靠性要求高的应用,redis肯定是部署成集群的,类似你说的方案1,但是这些redis不是孤立的,他们内部之间会有对应的通信机制已实现分片、冗余存储等,访问的时候也不需要限定redis的位置,比如你在A服务器访问B上面的redis也是可以的,B上面的redis实际数据存储又可能位于C服务器,这一切对于应用(客户端)来讲都是一个黑匣子,不需要关心。

回答4:

php.ini里面有配置session的。配置改成redis或者memcache,其他就不用管了

回答5:

个人觉得共享session只是一种共享数据的理念,将本来需要保存到session的数据迁移到redis进行保存,当然也需要像session一样生成一个唯一的sessionID,然后传递给客户端,并保存到cookie,客户端每次请求的时候需要将改cookie一起发送过来,然后从redis中获取对应的数据。其实说到共享session其实就是一个共享缓存而已。

当然我说的是理念,也许有工具可以直接将服务器上的真正的session直接保存到redis,但是我觉得理念就是这样的。

回答6:

其实上面两种方案都是可行的,首先第一种可以构建一个redis集群,来提高服务的稳定与性能,避免单点故障,导致session缓存数据的丢失。第二种可以在额外的机器上另开一个redis服务,为了提高服务的稳定,可以构建一个主从。cookie和session类似于你在redis上面的key-value

相关文章: