集群中如何实现session共享

环境:

集群:把众多的访问量分担到其他的服务器上,让每个服务器的压力减少。

通俗的解释就是:把一项任务交由一个开发人员处理总会有上限处理能力,这时可以考虑增加开发人员来共同处理这项任务,多人处理同一项任务时就会涉及到调度问题,即任务分配,这和多线程理念是一致的。代理在这里的角色相当于任务分配者。

如我们第一次访问 g.cn 这个域名,可能会对应这个IP 1.1.1.1的服务器,然后第二次访问,IP可能会变为2.2.2.2的服务器,这就是g.cn采用了负载均衡,一个域名对应多个服务器,将访问量分担到其他的服务器,这样很大程度的减轻了每个服务器上访问量

但是,这里有一个问题,如果我们登录了g.cn的一个账号,如网页的网盘,但是每次有可能请求的是不同的服务器,我们知道每个服务器都会有自己的会话session,所以会导致用户每次刷新网页又要重新登录,这是非常糟糕的体验,因此,根据以上问题,希望session可以共享,这样就可以解决集群中同一个域名不同服务器对应不同session的问题。

集群中实现session共享

条件:

1.在集群中,安装配置好了redis服务器端

2.在应用中,安装并使用redis客户端程序,我这里以php为例子

这里有三种实现方式:

1.修改配置文件php.ini

找到配置文件 php.ini,修改为下面内容,保存并重启服务

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

2.代码中动态配置修改

直接在代码中加入以下内容:
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379");

注:如果配置文件redis.conf里设置了连接密码requirepass,save_path需要这样写tcp://127.0.0.1:6379 auth=authpwd ,否则保存session的时候会报错。

测试:

<?php
//ini_set("session.save_handler", "redis");
//ini_set("session.save_path", "tcp://127.0.0.1:6379");

session_start();

//存入session
$_SESSION[‘class’] = array(‘name’ => ‘toefl’, ‘num’ => 8);

//连接redis
$redis = new redis();
$redis->connect(‘127.0.0.1’, 6379);

//检查session_id
echo ‘session_id:’ . session_id() . ‘<br/>’;

//redis存入的session(redis用session_id作为key,以string的形式存储)
echo ‘redis_session:’ . $redis->get(‘PHPREDIS_SESSION:’ . session_id()) . ‘<br/>’;

//php获取session值
echo ‘php_session:’ . json_encode($_SESSION[‘class’]);

集群中如何实现session共享
0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
Scroll to top
0
Would love your thoughts, please comment.x
()
x