Coroutine\Redis

推荐使用Swoole\Runtime::enableCoroutine + phpredis 或 predis 的 方式, 一键协程化原生PHP的redis客户端使用, 减小开发成本.

4.2.6版本及以后不再需要手动安装和启用async-redis, 而是swoole自带

  • 需要安装一个第三方的异步Redis库hiredis
sudo make
sudo make install
sudo ldconfig

v4.3.0以后不再需要添加编译参数, 内置了此依赖

  • 需要在编译时增加--enable-async-redis来开启此功能

  • 请勿同时使用异步回调和协程Redis

使用示例


$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
$val = $redis->get('key');

defer特性

const REDIS_SERVER_HOST = '127.0.0.1';
const REDIS_SERVER_PORT = 6379;


go(function () {
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
    $redis->setDefer();
    $redis->set('key1', 'value');

    $redis2 = new Swoole\Coroutine\Redis();
    $redis2->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
    $redis2->setDefer();
    $redis2->get('key1');

    $result1 = $redis->recv();
    $result2 = $redis2->recv();

    var_dump($result1, $result2);
});

pipeline

Redis服务器支持多条指令并发执行。可使用defer特性启用pipeline

const REDIS_SERVER_HOST = '127.0.0.1';
const REDIS_SERVER_PORT = 6379;


go(function () {
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
    $redis->setDefer();
    $redis->set('key1', 'value');
    $redis->get('key1');

    $result1 = $redis->recv();
    $result2 = $redis->recv();

    var_dump($result1, $result2);
});

subscribe pSubscribe无法用于defer(true)的情况。



  • LLLokAu

    一启动就提示 PHP Fatal error: Class 'Swoole\Coroutine\Redis' not found,请问怎么才能解决这问题? hiredis已经安装好了,编译也没有少参数。

  • 小菜

    协程Redis怎么取消订阅?貌似没有unsubscribe这个方法

  • copy

    同问 我也遇到了这种情况。swoole使用的是2.0.6版本 。hiredis 使用的是0.13.3 版本

  • 高秋亭-北京展程科技有限

    安装完hiredis 执行ldconfig 再编译呢? 我这样执行就好了

  • 摆渡人

    之前直接安装编译的swoole,然后看到这里后,先执行的make clean,然后在编译的时候加上了哪两个参数,最后编译的hiredis,最后出现PHP Fatal error: Uncaught Error: Class 'Swoole\Coroutine\Redis' not found in /home/wwwroot/tp5/ceshi.php:2

  • 摆渡人

    已经解决,swoole版本错了,应该是2.0版本以上的

  • 秒秒安祥(xhc)

    啥时候能支持 eval 呢?

  • 伤心一百回

    php71: async.c:602: __redisAsyncCommand: Assertion `p != ((void *)0)' failed. [2017-09-26 10:52:03 $18833.0] WARNING swManager_check_exit_status: worker#0 abnormal exit, status=0, signal=

  • 伤心一百回

    $this->redis->zrevrange( $key, $page, $pagesize, $score ); $score 为false的时候会出这个bug

  • 罗大发冲上云霄

    hgetall为什么会自动把字符串值反串行化呢?

  • invalley

    $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $val = $redis->get('key'); 运行之后: Fatal error: Swoole\Coroutine\Redis::connect(): must be called in the coroutine. in /home/s/server/redis.php on line 3

  • 小峰

    并发5000测试 while(true){xxx} 会出现subscribe的数据有漏掉,只监听到3000多条,只能改用异步redis了,这是要怎么改

  • 晒了PI_MY

    请问连接redis时候,能够设置多长时间没有操作,就自动断开连接吗,我发现连接上后,一直占用着连接数,不知道怎么断开

  • EternaL

    swoole_http_server下的ontask方法里面,调用Swoole\Coroutine\Redis出现,PHP Fatal error: Swoole\Coroutine\Redis::connect(): must be called in the coroutine,请问是咋回事呀?是只能在onRequest下面调用嘛?

  • Dr杨小昆

    这个pipeline的例子在4.3.4上没法运行了,第二个动作(get)返回false,errMsg = "redis client is waiting for response."

  • Dr杨小昆

    尝试出方案了:

    $r->multi(SWOOLE_REDIS_MODE_PIPELINE);
    $r->get('abc');
    $r->set('abc', 2);
    var_dump($r->exec());
    

  • 谈天说地

    redis记不住中文,输出结果为空,你们是这样吗?

    $server->handle('/', function ($request, $response) {

        $redis = new Swoole\Coroutine\Redis();
        $redis->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
        $redis->setDefer();
        // $redis->set('key1', '中文可以吧!How to display Chinese?在这里记住redis');
        $redis->set('key2', '中文');
    
        $response->end("Index");
    });
    
    $server->handle('/test', function ($request, $response) {
    
        $response->end("Test");
    });
    
     $server->handle('/getredis', function ($request, $response) {
    
        $redis2 = new Swoole\Coroutine\Redis();
        $redis2->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
        $redis2->setDefer();
        // $redis2->get('key1');
        $redis2->get('key2');
    
        $result2 = $redis2->recv();
    
        $response->end("MyRedis:".$result2);
    });
    

  • 谈天说地

    redis记不住中文,输出结果为空,你们是这样吗? 安装了hiredis这个,结果还是空。版本是swoole4.4 php7.2.5 操作系统是centos7

    $server->handle('/', function ($request, $response) {

        $redis = new Swoole\Coroutine\Redis();
        $redis->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
        $redis->setDefer();
        // $redis->set('key1', '中文可以吧!How to display Chinese?在这里记住redis');
        $redis->set('key2', '中文');
    
        $response->end("Index");
    });
    
    $server->handle('/test', function ($request, $response) {
    
        $response->end("Test");
    });
    
     $server->handle('/getredis', function ($request, $response) {
    
        $redis2 = new Swoole\Coroutine\Redis();
        $redis2->connect(REDIS_SERVER_HOST, REDIS_SERVER_PORT);
        $redis2->setDefer();
        // $redis2->get('key1');
        $redis2->get('key2');
    
        $result2 = $redis2->recv();
    
        $response->end("MyRedis:".$result2);
    });
    

  • 两年❤

    乱码的 , 首先保证 在终端打印不是乱码。。。。。。。。 给Response 设置 utf-8
    $response->header('Content-Type',"text/html;charset=utf-8");

  • 对方正在输入中...

    可以输入中文

  • 、O.o?

    redis密码和选库 怎么传参

  • xin6841414

    密码有个auth($password)方法, 选库,有个 select($dbindex)

  • Jacob Law

    函数列表呢?