I guess "redis-cli- r" is a poor benchmark, because it does not use
pipelining at all. If you have 700K items to process, you will
likely have to use pipelining as far as possible.
By benchmarking the retrieval of a single object, packet size
can skew your results. It all depends on the size of your objects.
If it is lower or higher than 1500 (ethernet MTU), you may have
huge variations.
Please note the protocol buffer data representation is very
compact, so protobuf encoded strings likely results in
less data on the wire (and in Redis memory).
You can use strace on redis-cli to evaluate the difference
in size between a protobuf encoded string, and a hash
object encoded with hgetall.
> strace -e read,write ./redis-cli ping
...
write(3, "*1\r\n$4\r\nping\r\n", 14) = 14
read(3, "+PONG\r\n", 16384) = 7
...
Here the query weights 14 bytes, and the reply 7 bytes.
Regards,
Didier.