用redis实现跨服务器session-阿里云开发者社区

开发者社区> 技术小胖子> 正文

用redis实现跨服务器session

简介:
+关注继续查看

这个月我们新开发了一个项目,由于使用到了4台机器做web,使用dns做负载均衡,

 

面图上用户通过DNS的调度(一个域名对应多个ip)分别访问到VM2-VM5上,四台机器都访问VM1上的redis,两个redis值主从结构.
因此需要使用跨服务器的session保存用户登录状态,于是我写了一个跨站的session共享的类
 

  1. <?php  
  2.     /*  
  3.      *用redis实现跨服务器session  
  4.      *注意需要安装phpredis模块  
  5.      *  
  6.      *作者:yifangyou  
  7.      *日期:2012-07-23 22:55:00  
  8.     **/ 
  9. class RedisSession{  
  10.     var $expire=86400;//过期时间  
  11.     var $sso_session;//session id  
  12.     var $session_folder;//session目录  
  13.     var $cookie_name;//cookie的名字  
  14.     var $redis;//redis连接  
  15.     var $cache;//缓存session  
  16.     var $expireAt;//过期时间  
  17.     /*  
  18.      *初始化  
  19.      *参数  
  20.      *$redis:php_redis的类实例  
  21.      *$cookie_name:cookie的名字  
  22.      *$session_id_prefix:sesion id的前缀  
  23.     **/ 
  24.     function RedisSession($redis,$expire=86400,$cookie_name="sso_session",$session_id_prefix=""){  
  25.         $this->redis=$redis;  
  26.         $this->cookie_name=$cookie_name;  
  27.         $this->session_folder="sso_session:";  
  28.     //若是cookie已经存在则以它为session的id  
  29.         if(isset($_COOKIE[$this->cookie_name])){  
  30.              $this->sso_session=$_COOKIE[$this->cookie_name];  
  31.         }else{  
  32.             $this->expire=$expire;  
  33.             $this->expireAt=time()+$this->expire;  
  34.          //在IE6下的iframe无法获取到cookie,于是我使用了get方式传递了cookie的名字  
  35.             if(isset($_GET[$this->cookie_name])){  
  36.                     $this->sso_session=$_GET[$this->cookie_name];  
  37.             }else{  
  38.                     $this->sso_session=$this->session_folder.$session_prefix.md5(uniqid(rand(), true));      
  39.             }  
  40.             setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/");  
  41.         }  
  42.     }  
  43.       
  44.     /*  
  45.      *设置过期时间  
  46.      *参数  
  47.     **/ 
  48.     function expire($expire=86400){  
  49.             $this->expire=$expire;  
  50.             $this->expireAt=time()+$this->expire;  
  51.             //设置session过期时间  
  52.             setcookie($this->cookie_name,$this->sso_session,$this->expireAt,"/",".greatwallwine.com.cn");  
  53.             $this->redis->expireAt($this->sso_session, $this->expireAt);  
  54.     }  
  55.       
  56.     /*  
  57.      *设置多个session的值  
  58.      *参数  
  59.      *$array:值  
  60.     **/ 
  61.     function setMutil($array){  
  62.         $this->redis->hMset($this->sso_session,$array);  
  63.     }  
  64.     /*  
  65.      *设置session的值  
  66.      *参数  
  67.      *$key:session的key  
  68.      *$value:值  
  69.     **/ 
  70.     function set($key,$value){  
  71.         $this->redis->hSet($this->sso_session,$key,$value);  
  72.     }  
  73.     /*  
  74.      *设置session的值为对象  
  75.      *参数  
  76.      *$key:session的key  
  77.      *$object:对象  
  78.     **/ 
  79.     function setObject($key,$object){  
  80.         $this->redis->hSet($this->sso_session,$key,serialize($object));  
  81.     }  
  82.       
  83.     /*  
  84.      *获取全部session的key和value  
  85.      @return: array  
  86.     **/ 
  87.     function getAll(){  
  88.         return $this->redis->hGetAll($this->sso_session);  
  89.     }  
  90.       
  91.       
  92.       
  93.     /*  
  94.      *获取一个session的key和value  
  95.      @return: array  
  96.     **/ 
  97.     function get($key){  
  98.         return $this->redis->hGet($this->sso_session,$key);  
  99.     }  
  100.       
  101.   /*  
  102.      *获取session的值为对象  
  103.      *参数  
  104.      *$key:session的key  
  105.      *$value:cookie的名字  
  106.     **/ 
  107.     function getObject($key){  
  108.         return unserialize($this->redis->hGet($this->sso_session,$key));  
  109.     }  
  110.     /*  
  111.      *从缓存中获取一个session的key和value  
  112.      @return: array  
  113.     **/ 
  114.     function getFromCache($key){  
  115.         if(!isset($this->cache)){  
  116.             $this->cache=$this->getAll();  
  117.         }  
  118.         return $this->cache[$key];  
  119.     }  
  120.       
  121.     /*  
  122.      *删除一个session的key和value  
  123.      @return: array  
  124.     **/ 
  125.     function del($key){  
  126.         return $this->redis->hDel($this->sso_session,$key);  
  127.     }  
  128.     /*  
  129.      *删除所有session的key和value  
  130.      @return: array  
  131.     **/ 
  132.     function delAll(){  
  133.         return $this->redis->delete($this->sso_session);  
  134.     }  
  135. }  
  136. ?> 
 

使用方法:

 


  1. <?php  
  2. error_reporting(0);  
  3. $redisHost="192.168.1.2";  
  4. $redisPort="6379";  
  5. $redis = new Redis();  
  6. $redis->connect($redisHost,$redisPort);  
  7. include_once("inc/RedisSession.php");  
  8. $redisSession=new RedisSession($redis);  
  9. /*  
  10. $redisSession->set("name","sdf4");  
  11. $redisSession->set("age",1234);  
  12. $redisSession->set("***","man14");  
  13. $redisSession->set("name","abc4");  
  14. $redisSession->setMutil(array("province"=>"guangdong","city"=>"guangzhou"));  
  15. */ 
  16.  
  17. $redisSession->setObject("obj",array("test1"=>array("test2")));  
  18. $obj=$redisSession->getObject("obj");  
  19. print_r($obj);  
  20. die();  
  21. print_r($redisSession->getAll());  
  22. //$redisSession->del("name");  
  23. print_r($redisSession->get("name"));  
  24. //print_r($redisSession->get("province"));  
  25. //$redisSession->delAll();  
  26. //print_r($redisSession->getAll());  
  27. print_r($redisSession->getFromCache("name"));  
  28. /*  
  29.     $redisSession->del("name");  
  30.     $redisSession->delAll();  
  31. */ 

比较常用的估计是set,get,setObject,getOject
我用sso_session:我主要是方便用phpRedisAdmin管理

 

 

 

 

end




     本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/1041040,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云Linux服务器下Redis服务的安装与配置实践
下载源码 执行命令wget http://download.redis.io/releases/redis-2.8.3.tar.gz 解压 将其移动到usr/local目录下并重命名为redis 4个CPU进行编译 make -j4 将编译后的文件添加到启动目录 make install 将程序安装至系统中。
1322 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10088 0
[ 搭建Redis本地服务器实践系列一 ] :图解CentOS7安装Redis
原文:[ 搭建Redis本地服务器实践系列一 ] :图解CentOS7安装Redis 上一章 [ 搭建Redis本地服务器实践系列 ] :序言 作为开场白介绍了下为什么要写这个系列,从这个章节我们就开始真正的进入正题,开始搭建我们本地的Redis服务器。
1059 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10884 0
阿里云Linux服务器的搭建过程(包括JDK、Tomcat、Redis、MySQL的安装)及遇到的问题与处理:(一)JDK的安装
阿里云Linux服务器的搭建过程(包括JDK、Tomcat、Redis、MySQL的安装)及遇到的问题与处理:(一)JDK的安装 前两天,搞了个Linux系统想尝试一下如何搭建一个服务器,在过程中遇到了一些问题,我觉得需要做个记录。
25688 0
【微信小程序】c# 实现获取openid、session_key 服务端
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tianchao7c/article/details/83413558 c#写一个获取微信小程序 openid和session_key 的方法。
2094 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载