swoft-cloud / swoft

🚀 PHP Microservice Full Coroutine Framework
https://swoft.org
Apache License 2.0
5.58k stars 786 forks source link

内置的redis类,hgetall\hmset等命令的问题 #337

Closed allovine closed 6 years ago

allovine commented 6 years ago
Q A
Swoft version 1.0.0
Swoole version 4.0.3
PHP version 7.1.20
Runtime environment Mac

hgetall 返回的不是key=>value的形式,而是把所有的 key\value 都放到了数组里面

set\hmset\hset 时候,如果是整形的,设置完之后无法 hincrby 或者 incrby ,提示不是一个整形数字

例如如下代码: $rd2 = new \Redis(); $rd2->connect("127.0.0.1",6379); $rd2->select(6); $rd2->hMset('myms3', array('name' => 'Joe', 'salary' => 2000));

$this->gameRedis->hMset('myms1', array('name' => 'Joe', 'salary' => 2000));
$this->gameRedis->hSet("myms1","d",4);

用原装的redis类执行后和内置的redis执行后,redis-cli 看到的是如图: 127.0.0.1:6379[6]> hgetall myms1

"name" "s:3:"Joe";" "salary" "i:2000;" "d" "i:4;" 127.0.0.1:6379[6]> hgetall myms3 "name" "Joe" "salary" "2000" "salery" "111" 而 myms1 是无法用 hincrby myms1 salary 1 的命令的,会提示 salary 不是整形

hgetall的问题,处理的时候就是不用 hgetall ,改用 hmget 就没事儿,但是 hmset 的int型字段实在没办法了。紧急求助!!!!!难道要抛弃内置的redis,采用原装的\Redis,自己再链接?

allovine commented 6 years ago
    读了下源码,怀疑是hiredis安装问题,然后测试下直接使用 CoRedis 试试,发现也没问题,肯定是swoft框架下的类处理出了问题。
    $rd2 = new \Redis();
    $rd2->connect("127.0.0.1",6379);
    $rd2->select(6);
    $rd2->hMset('myms3', array('name' => 'Joe', 'salary' => 2000));

    $this->gameRedis->hMset('myms1', array('name' => 'Joe', 'salary' => 2000));
    $this->gameRedis->hSet("myms1","d",4);

    $rd3 = new CoRedis();
    $rd3->connect("127.0.0.1",6379);
    $rd3->select(6);
    $rd3->hMset('myms4', array('name' => 'Joe', 'salary' => 2000));

127.0.0.1:6379[6]> hgetall myms1 1) "name" 2) "s:3:\"Joe\";" 3) "salary" 4) "i:2000;" 5) "d" 6) "i:4;" 127.0.0.1:6379[6]> hgetall myms4 1) "name" 2) "Joe" 3) "salary" 4) "2000" 127.0.0.1:6379[6]> hgetall myms3 1) "name" 2) "Joe" 3) "salary" 4) "2000" 5) "salery" 6) "111"

huangzhhui commented 6 years ago

你的 swoft/redis 组件的版本是多少?

allovine commented 6 years ago

这个组件没看到什么地方写了版本号,只有 composer.json 里面要求是 "swoft/redis": "^1.0",

另外我跟踪到如下代码的时候还没问题:

/**

输出的都还正常,正在看可变参数的解析

allovine commented 6 years ago

看不到 Swoole\Coroutine\Redis 怎么解析的可变参数,不知道怎么办,老大能帮帮忙吗? @huangzhhui

allovine commented 6 years ago

配置里面REDIS_SERIALIZE=1的问题,谢谢回复 @huangzhhui