问题:线上的phpredis有两个不同的版本,旧的phpredis2.2.5,新的phpredis3.1.2
在phpredis2.2.5中,php代码如下:
$redis = new Redis();
$redis->connect("127.0.0.1", 6379);
$key = "abc";
$redis->zrevrank($key, (double)45555);
$redis->zrevrank($key, (float)45555);
$redis->zrevrank($key, 45555);
$redis->zrevrank($key, 45555);
在redis-server中使用monitor进行监控,发现执行的命令如下所示:
"ZREVRANK" "abc" "45555"
"ZREVRANK" "abc" "45555"
"ZREVRANK" "abc" "45555"
"ZREVRANK" "abc" "45555"
从上面的分析中,可以看出,在phpredis2.2.5中,php调用phpredis的方法,无法传递的是double,float,string或者int,执行的命令是相同的。
在phpredis3.1.2中,php代码如下:
$redis = new Redis();
$redis->connect("127.0.0.1", 6379);
$key = "abc";
$redis->zrevrank($key, (double)45555);
$redis->zrevrank($key, (float)45555);
$redis->zrevrank($key, 45555);
$redis->zrevrank($key, 45555);
在redis-server中使用monitor进行监控,发现执行的命令如下所示:
"ZREVRANK" "abc" "4.5555e+4"
"ZREVRANK" "abc" "4.5555e+4"
"ZREVRANK" "abc" "45555"
"ZREVRANK" "abc" "45555"
从上面的分析可以看出,在phpredis3.1.2中,php调用phpredis的方法,传递的member成员如果是double,float是与int,string不相同的。
测试了phpredis的 string,list,set,hash,zset数据类型,发现set和zset存在这样的情况,而且是出现在key中的member中,具体的phpredis源码的实现导致这个问题,稍后会添加上来。