docs: def connect(self):
          "Connects to the Redis server if not already connected"
          if self._sock:
              return
          try:
              sock = self._connect()
          except socket.timeout:
              raise TimeoutError("Timeout connecting to server")
          except socket.error:
              e = sys.exc_info()[1]
              raise ConnectionError(self._error_message(e))
  
          self._sock = sock
          self._selector = DefaultSelector(sock)
          try:
              self.on_connect()
          except RedisError:
              # clean up after any error in on_connect
              self.disconnect()
              raise
  
          # run any user callbacks. right now the only internal callback
          # is for pubsub channel/pattern resubscription
          for callback in self._connect_callbacks:
              callback(self)