怎么实现redis连接池?有没有案例demo什么的? 我用框架里的redis incr自增之后的结果高并发起来数据会错乱

helloworlds


不但不连贯 还有很多重复数据?
是什么情况?

2388 1 0
1个回答

walkor

用redis扩展。在onWorkerStart里初始化redis,不要在其它地方初始化redis。

  • helloworlds 2021-02-23

    <?php

    /**

    /**

    • 用于检测业务代码死循环或者长时间阻塞等问题
    • 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload
    • 然后观察一段时间workerman.log看是否有process_timeout异常
      */
      //declare(ticks=1);
      use Workerman\Redis\Client;
      /**
    • 聊天主逻辑
    • 主要是处理 onMessage onClose
      */
      class Events
      {
      public static function onWorkerStart($businessWorker){
      global $redis;
      $redis = new Client('redis://'.Common::getEnv("REDIS.REDIS_HOST").':'.Common::getEnv("REDIS.REDIS_PORT"));
      }
      /**
      • 有消息时
      • @param int $client_id
      • @param mixed $message
        */
        public static function onMessage($client_id, $message)
        {
        try {
        global $redis;
        $key = 'live_socket_user_online';
        $redis->incr($key, function ($result, $redis) {
        var_dump($result);
        });
        } catch (\Exception $e) {
        file_put_contents("TCP连接错误JSON.txt", json_encode([$e]) . "\n", 8);
        }
        }

    }

  • helloworlds 2021-02-23

    是这样吗?

  • helloworlds 2021-02-23

    是因为异步的原因造成的 incr 结果不连贯吗?

  • walkor 2021-02-23

    wokerman/redis是用于redis异步订阅的。除此之外请使用redis扩展,不要用wokerman/redis

  • helloworlds 2021-02-24

    wokerman中无法使用redis连接池?

  • walkor 2021-02-24

    redis扩展是同步阻塞模式,用不到连接池。单例是性能最好的。

  • helloworlds 2021-02-24

    如果万人同时在线,redis链接会同步阻塞掉,导致后进入的人无法连接redis,整个聊天系统崩溃掉

  • helloworlds 2021-02-24

    这种情况只能搞redis分布式?

  • walkor 2021-02-24

    redis足够快,单机1秒可以支持几万请求,每个请求都是几毫秒级别,基本上和非阻塞一样快,不用担心。
    还有并不是万人在线就有一万个redis连接,redis连接数和进程数一致,比如你开了32个进程,那么只有32个redis连接,并且连接是长连接,一直复用的,不会出现redis连接数过多无法连接redis的情况。

  • helloworlds 2021-02-24

    好的 感谢解答

年代过于久远,无法发表回答
🔝