环境:
集群:把众多的访问量分担到其他的服务器上,让每个服务器的压力减少。
通俗的解释就是:把一项任务交由一个开发人员处理总会有上限处理能力,这时可以考虑增加开发人员来共同处理这项任务,多人处理同一项任务时就会涉及到调度问题,即任务分配,这和多线程理念是一致的。代理在这里的角色相当于任务分配者。
如我们第一次访问 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’]);