用redis做跨域session共享,发现一个问题
PhpRedis 中的Session handler存session为什么用string而不是用hash?个人认为,session_id作为key没有问题
但是$_SESSION是一个hash数组,也就是说整个session是一个2维的(sessionid,key,value)的结构
那感觉用 redis的hash结构更加符合啊
key=sessionid
field=$_SESSION的key用如下代码测试:
<?php
ini_set("session.save_handler","redis");
ini_set("session.save_path","tcp://192.168.56.101:6379?timeout=1");session_start();print "session_id:".session_id()."<br>";if($_SESSION['test']=="")
{
    $_SESSION['test']=time();
    $_SESSION['test2']=time();
}print $_SESSION['test'];
?>
get PHPREDIS_SESSION:q4assvtap9c9t685cqkamivcq6
后得到:
"test|i:1333266219;test2|i:1333266219;"type PHPREDIS_SESSION:q4assvtap9c9t685cqkamivcq6
得到:
string也就是它是将$_SESSION序列化之后用string来存$_SESSION的
那不是每次get和set都要分别序列化和反序列化?性能上不是有影响?讨论一下吧~~

解决方案 »

  1.   

    如果不是用序列化(session的序列化已经简化了许多),你认为用什么存放比较合适?
      

  2.   

    key=>value,value再用key=>value的字符串连起来难道不好么。。 存和读都没有压力。
      

  3.   

    把session 存为json格式吧 
    然后用sessionid做key
      

  4.   


    个人认为,session_id作为key没有问题
    但是$_SESSION是一个hash数组,也就是说整个session是一个2维的 sessionid=>(key=>value)的结构
    那感觉用 redis的hash结构更加符合啊
    key  =session id
    field = $_SESSION 的 key
    value = session的value
      

  5.   


    而且相对于文件存储的session,用phpredis会有session值的并发一致性问题
      

  6.   

    session 的序列化是在内部完成的,若需改变算法,就需要修改内核
    如果用php代码实现,显见得有点得不偿失文件存储的session 利用了操作系统的文件锁功能(将并行转为串行)来解决并发一致性
      

  7.   


    恩,感谢感谢,我看了相关的源码。了解了一些不过,对于phpredis的并发一致性问题,应该怎么办? redis自己并没有锁,或者说phpredis在session handle也并没有去实现锁
      

  8.   

    你可能需要对 sessionid 附加一个状态字,open时置位,close时复位
    操作前先检查该字,处于置位时就等待
      

  9.   

    session_set_save_handler 自定义 open write close ……操作不过为了避免脏读,代价不小啊……