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

现在提到多服务器的共享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 还是?

阅读 49.2k
8 个回答

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

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

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

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

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

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

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

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

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

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

可以用session_set_save_handle自定义会话机制

核心的一句话就是:保证服务器生成一个唯一的sessionID,那么就是要单独的部署一个保存sessionID的服务器,让这台服务器和其他3台服务器进行交互,保存sessionID的服务器就可以用Redis服务器进行部署.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏