用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都要分别序列化和反序列化?性能上不是有影响?讨论一下吧~~
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都要分别序列化和反序列化?性能上不是有影响?讨论一下吧~~
然后用sessionid做key
个人认为,session_id作为key没有问题
但是$_SESSION是一个hash数组,也就是说整个session是一个2维的 sessionid=>(key=>value)的结构
那感觉用 redis的hash结构更加符合啊
key =session id
field = $_SESSION 的 key
value = session的value
而且相对于文件存储的session,用phpredis会有session值的并发一致性问题
如果用php代码实现,显见得有点得不偿失文件存储的session 利用了操作系统的文件锁功能(将并行转为串行)来解决并发一致性
恩,感谢感谢,我看了相关的源码。了解了一些不过,对于phpredis的并发一致性问题,应该怎么办? redis自己并没有锁,或者说phpredis在session handle也并没有去实现锁
操作前先检查该字,处于置位时就等待