Coroutine\Redis

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

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

  • 需要安装一个第三方的异步Redis库hiredis
sudo make
sudo make install
sudo ldconfig
  • 需要在编译时增加--enable-async-redis来开启此功能
  • 请勿同时使用异步回调和协程Redis

使用示例


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

订阅模式

$redis = new Swoole\Coroutine\Redis();
$redis->connect('127.0.0.1', 6379);
while (true) 
{
    $msg = $redis->subscribe(array("msg_1"));
}

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时候,能够设置多长时间没有操作,就自动断开连接吗,我发现连接上后,一直占用着连接数,不知道怎么断开