use sysread (app level buffering) + recv MSG_PEEK

this approach demonstrates equal performance (at least on my virtual machine):

$ ./redis-benchmark.pl
Benchmark: running 00_ping, 10_set, 11_set_r, 20_get, 21_get_r, 30_incr, 30_incr_r, 40_lpush, 50_lpop, 90_h_get, 90_h_set for at least 5 CPU seconds...
   00_ping:  8 wallclock secs ( 1.89 usr +  3.52 sys =  5.41 CPU) @ 5479.30/s (n=29643)
    10_set:  9 wallclock secs ( 2.38 usr +  2.82 sys =  5.20 CPU) @ 6139.23/s (n=31924)
  11_set_r:  9 wallclock secs ( 1.70 usr +  3.71 sys =  5.41 CPU) @ 5900.92/s (n=31924)
    20_get:  9 wallclock secs ( 1.52 usr +  3.85 sys =  5.37 CPU) @ 5970.76/s (n=32063)
  21_get_r:  9 wallclock secs ( 1.88 usr +  3.34 sys =  5.22 CPU) @ 6000.19/s (n=31321)
   30_incr:  9 wallclock secs ( 2.04 usr +  3.22 sys =  5.26 CPU) @ 6095.63/s (n=32063)
 30_incr_r:  9 wallclock secs ( 1.92 usr +  3.37 sys =  5.29 CPU) @ 6034.78/s (n=31924)
  40_lpush:  9 wallclock secs ( 2.06 usr +  3.40 sys =  5.46 CPU) @ 6093.96/s (n=33273)
   50_lpop:  9 wallclock secs ( 1.92 usr +  3.35 sys =  5.27 CPU) @ 5943.26/s (n=31321)
  90_h_get:  8 wallclock secs ( 1.74 usr +  3.43 sys =  5.17 CPU) @ 5837.91/s (n=30182)
  90_h_set:  9 wallclock secs ( 1.68 usr +  3.62 sys =  5.30 CPU) @ 5799.62/s (n=30738)

$ REDIS_USE_SYSREAD=1 ./redis-benchmark.pl
REDIS IS USING SYSREAD
REDIS IS USING SYSREAD
Benchmark: running 00_ping, 10_set, 11_set_r, 20_get, 21_get_r, 30_incr, 30_incr_r, 40_lpush, 50_lpop, 90_h_get, 90_h_set for at least 5 CPU seconds...
   00_ping:  9 wallclock secs ( 1.96 usr +  3.36 sys =  5.32 CPU) @ 5559.77/s (n=29578)
    10_set:  9 wallclock secs ( 1.94 usr +  3.40 sys =  5.34 CPU) @ 6115.36/s (n=32656)
  11_set_r:  9 wallclock secs ( 1.86 usr +  3.54 sys =  5.40 CPU) @ 5911.85/s (n=31924)
    20_get:  9 wallclock secs ( 1.57 usr +  3.64 sys =  5.21 CPU) @ 6044.15/s (n=31490)
  21_get_r:  8 wallclock secs ( 2.39 usr +  2.95 sys =  5.34 CPU) @ 5978.28/s (n=31924)
   30_incr:  9 wallclock secs ( 2.22 usr +  3.03 sys =  5.25 CPU) @ 6107.24/s (n=32063)
 30_incr_r:  8 wallclock secs ( 1.63 usr +  3.38 sys =  5.01 CPU) @ 5990.42/s (n=30012)
  40_lpush:  9 wallclock secs ( 1.22 usr +  4.17 sys =  5.39 CPU) @ 6058.63/s (n=32656)
   50_lpop:  9 wallclock secs ( 1.60 usr +  3.51 sys =  5.11 CPU) @ 6015.26/s (n=30738)
  90_h_get:  8 wallclock secs ( 1.72 usr +  3.59 sys =  5.31 CPU) @ 5789.27/s (n=30741)
  90_h_set:  9 wallclock secs ( 1.64 usr +  3.78 sys =  5.42 CPU) @ 5778.78/s (n=31321)