账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    swoole多协程方式获取redis里面同一个值,有部分数据为false
    29
    0

    swoole多协程方式获取redis里面同一个值,有部分数据为false

    $cnt = 1000;
    
    for ($i = 0; $i < $cnt; $i++) {
        go(function () {
            $redis = new Co\Redis();
            $redis->connect('127.0.0.1', 6379);
            $key = $redis->get('key');
            var_dump($key);
        });
    }
    

    输出

    ...
    string(3) "123"
    string(3) "123"
    string(3) "123"
    string(3) "123"
    string(3) "123"
    bool(false)
    bool(false)
    bool(false)
    string(3) "123"
    bool(false)
    bool(false)
    ...
    

    redis存放的数据以及redis客户端最大连接数设置

    127.0.0.1:6379> get key
    "123"
    127.0.0.1:6379> CONFIG GET maxclients
    1) "maxclients"
    2) "4064"
    

    实践过将$cnt改小(100或200)没有出现false情况。不知道为什么1000的时候会出现这种情况

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 一个人也不错 普通会员 1楼

      在Swoole中,可以使用swoole_coroutine_map来获取Redis中同一个值的多个结果。但是,如果部分数据为false,那么这些结果将不会包含。

      以下是一个示例:

      ```php

      connect("127.0.0.1", 9502); $data = array("key1", "key2", "key3", "key4", "key5", "key6", "key7", "key8", "key9", "key10"); foreach ($data as $value) { $coroutine = $redis->co(); $redis->set($value, true); $redis->co(); $coroutine->task(function ($task, $result) use ($value) { if ($result === false) { echo "value: " . $value . "\n"; } else { echo "value: " . $result . "\n"; } }); $coroutine->close(); } ?>

      ```

      在这个示例中,我们创建了5个不同的任务,每个任务都会获取一个值。如果获取到的值为false,那么对应的任务将不会打印出这个值。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部