用redis实现跨服务器session

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

这个月我们新开发了一个项目,由于使用到了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,如需转载请自行联系原作者



相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(四)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
2月前
|
NoSQL Redis Docker
在docker中安装redis,并且阿里云服务器配置
在docker中安装redis,并且阿里云服务器配置
181 1
|
5月前
|
缓存 NoSQL fastjson
Shiro Session集群共享存入Redis中SimpleSession的transient 属性不能序列化
Shiro Session集群共享存入Redis中SimpleSession的transient 属性不能序列化
|
15天前
|
存储 缓存 NoSQL
Redis 服务器指南:高性能内存数据库的完整使用指南
Redis 服务器指南:高性能内存数据库的完整使用指南
|
5月前
|
NoSQL Redis
shiro的session信息放redis反序列化异常解决
shiro的session信息放redis反序列化异常解决
|
1月前
|
弹性计算 NoSQL 测试技术
倚天使用|Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
137500 3
|
1月前
|
存储 NoSQL 前端开发
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
【SpringBoot】Redis集中管理Session和自定义用户参数解决登录状态及校验问题
|
1月前
|
缓存 NoSQL 安全
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
48 0
|
3月前
|
NoSQL Redis
redis服务器基础配置
redis服务器基础配置
18 0
|
4月前
|
NoSQL 前端开发 中间件
黑马点评回顾 redis实现共享session
黑马点评回顾 redis实现共享session
33 0

热门文章

最新文章