Boost.Redis will coalesce requests into a single one when it can. When a request is issued using async_exec, the following happens:
If no request is in the process of being written, the request is written to the socket.
Otherwise, the request will wait until the socket is idle. Any subsequent incoming requests will be merged with it, until the socket is idle again.
I still advise to pipeline explicitly as much as you can when building the requests to be used with async_exec. The request class has native pipeline support - just call request::push several times to create a pipeline.