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 还是?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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服务器进行部署.
其实上面两种方案都是可行的,首先第一种可以构建一个redis集群,来提高服务的稳定与性能,避免单点故障,导致session缓存数据的丢失。第二种可以在额外的机器上另开一个redis服务,为了提高服务的稳定,可以构建一个主从。cookie和session类似于你在redis上面的key-value