Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于Redis的三个问题(swoole-cli 5.0.2) #270

Open
warmbook opened this issue Jul 6, 2023 · 6 comments
Open

关于Redis的三个问题(swoole-cli 5.0.2) #270

warmbook opened this issue Jul 6, 2023 · 6 comments

Comments

@warmbook
Copy link

warmbook commented Jul 6, 2023

1.Server::format方法将数组中的NULL和FlASE都转成了空字符串"$0",但是RESP规范要求的是nil"$-1";

2.不支持多维数组的转换,抛出异常"Array to string conversion in ...",貌似底层是直接将元素转成字符串了,类似于(string)$v,个人理解这里应该递归处理;

3.swoole-cli中集成的redis客户端的scan方法貌似有点问题,我按照RESP规范描述的,在scan处理器中手动拼接字符串 "* 2\r\n:1\r\n*2\r\n$1\r\na\r\n$2\r\nbc\r\n",即数组[1,['a','bc']],客户端的scan方法返回值依然是false,游标值也是0,不知道是不是我自己写的有问题。

@jingjingxyk
Copy link
Contributor

jingjingxyk commented Jul 6, 2023

@warmbook 如何复现?

现状: 本扩展默认: --enable-redis-igbinary --enable-redis-lzf 都没有启用

#启动redis
bash sapi/src/UnitTest/scripts/database/start.sh

vi test_redis.php

如何验证 ?

        $redis = new Redis();
        $res = $redis->connect('127.0.0.1', 6379);
        if ($res) {
            $redis->set('a', '9e8e9840-1bee-11ee-a044-734c6941ae95');
            var_dump($redis->get('a'));
            $iterator=null;
            var_dump($redis->scan($iterator, 'a'));
            $redis->close();
        }

暂时:猜测判断,是序列化的问题

@warmbook
Copy link
Author

warmbook commented Jul 9, 2023

@jingjingxyk 所以确实是bug吗?如果是的话啥时候能修复呢?

@jingjingxyk
Copy link
Contributor

jingjingxyk commented Jul 9, 2023

@warmbook 你提的问题,如何才能复现?你把复现代码发上来,或者复现方法发上来。便于排查!

我看你的问题,大概猜测是是序列化方面的问题,但是我不知道如何复现你的问题!所以目前并没有排查出是什么问题。

@warmbook
Copy link
Author

warmbook commented Jul 11, 2023

// 服务端 use Swoole\Redis\Server; $server=new Server('0.0.0.0',6379,SWOOLE_BASE); $server->setHandler('hMGet',function(int $fd,array $data)use(&$server){ return $server->send($fd,Server::format(Server::SET,[NULL,FALSE,''])); }); $server->setHandler('scan',function(int $fd,array $data)use(&$server){ // 这么写会报错 return $server->send($fd,Server::format(Server::SET,[1,['a','b','c']])); // 这么写虽然不报错,但是swoole-cli中的phpredis的scan指令返回值是false,游标也是0 return $server->send($fd,"*2\r\n".Server::format(Server::INT,1).Server::format(Server::SET,['a','b','c'])); }); $server->start();
// 客户端 $client=new \Redis(); $client->connect(127.0.0.1,6379,0); vardump( $client->hMGet('key',['a','b','c']), // 三个都是空字符串,前两个本应该是false $client->scan($idx); // false,本应该是['a','b','c'] ); vardump($idx); // 0,本应该是1

@jingjingxyk
Copy link
Contributor

jingjingxyk commented Jul 13, 2023

上述代码格式化以后如下:

redis server

<?php

ini_set('display_errors', 'on');
ini_set('display_startup_errors', 'on');

error_reporting(E_ALL);


use Swoole\Redis\Server;


$server=new Server('0.0.0.0', 6378, SWOOLE_BASE);


$server->setHandler('hMGet', function (int $fd, array $data) use (&$server) {
    var_dump($data);
    //return $server->send($fd, Server::format(Server::SET, [null,false,'']));
    return $server->send($fd, Server::format(Server::SET, ["php", "is", "best"]));
});

$server->setHandler('set', function (int $fd, array $data) use (&$server) {
    var_dump($data);
    return $server->send($fd, Server::format(Server::SET, [null,false,'']));
});



$server->setHandler('scan', function (int $fd, array $data) use (&$server) {
    var_dump($data);
    var_dump(Server::format(Server::MAP,['b'=>"dd",'c'=>['a','b','c']]));
    //  这么写会报错
    return $server->send($fd, Server::format(Server::MAP,[1,['a','b','c']]));
    // // 这么写虽然不报错,但是swoole-cli中的phpredis的scan指令返回值是false,游标也是0
   // return $server->send($fd,"*2\r\n".Server::format(Server::INT,1).Server::format(Server::SET,['a','b','c'])); });
});

$server->start();

redis client

<?php

ini_set('display_errors', 'on');
ini_set('display_startup_errors', 'on');

error_reporting(E_ALL);


// 客户端
$client=new \Redis();
$client->connect('127.0.0.1', 6378, 0);

//var_dump($client->hMGet('key', ['aaaa','bb','abcdd']));
// 三个都是空字符串,前两个本应该是false $client->scan($idx); // false,本应该是['a','b','c'] );
$i=null;
var_dump($client->scan($i,'*'));
// vardump($idx);
// // 0,本应该是1

建议是再研究下。 和 连接 原生的 redis 服务器作对比。

与之相关的源码:
https://github.com/swoole/swoole-src/blob/9a0c19815358801febd495ed4c8b423df930ea74/ext-src/swoole_redis_server.cc#L68C5-L68C5

@warmbook
Copy link
Author

看不懂源码,见笑了。就是想请教一下这三个问题算不算是bug呢?查了规范貌似不太符,所以才会有这样的疑问。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants