Allow size of reads from socket to be tuned
authorPedro Melo <melo@simplicidade.org>
Sat, 7 Aug 2010 11:53:26 +0000 (12:53 +0100)
committerPedro Melo <melo@simplicidade.org>
Sat, 7 Aug 2010 12:26:48 +0000 (13:26 +0100)
If you have big keys, values, or big responses, increasing read_size
will improve your performance, by reducing the number of system calls we
will make to read them.

Defaults to 8Kb

Signed-off-by: Pedro Melo <melo@simplicidade.org>
lib/Redis.pm

index 3da5f28..ef4e53c 100644 (file)
@@ -54,7 +54,9 @@ sub new {
     PeerAddr => $self->{server},
     Proto    => 'tcp',
   ) || confess("Could not connect to Redis server at $self->{server}: $!");
     PeerAddr => $self->{server},
     Proto    => 'tcp',
   ) || confess("Could not connect to Redis server at $self->{server}: $!");
-  $self->{rbuf} = '';
+
+  $self->{read_size} = 8192;
+  $self->{rbuf}      = '';
 
   $self->{is_subscriber} = 0;
 
 
   $self->{is_subscriber} = 0;
 
@@ -202,7 +204,9 @@ sub __read_sock {
   my $rbuf = \($self->{rbuf});
 
   my ($data, $type) = ('', '');
   my $rbuf = \($self->{rbuf});
 
   my ($data, $type) = ('', '');
-  my $read_size = defined $len ? $len + 2 : 8192;
+  my $read_size = $self->{read_size};
+  $read_size = $len + 2 if defined $len && $len + 2 > $read_size;
+
   while (1) {
     ## Read NN bytes, strip \r\n at the end
     if (defined $len) {
   while (1) {
     ## Read NN bytes, strip \r\n at the end
     if (defined $len) {
@@ -237,7 +241,7 @@ sub __can_read_sock {
 
   return 1 if $$rbuf;
   __fh_nonblocking($sock, 1);
 
   return 1 if $$rbuf;
   __fh_nonblocking($sock, 1);
-  my $bytes = sysread $sock, $$rbuf, 8192, length $$rbuf;
+  my $bytes = sysread $sock, $$rbuf, $self->{read_size}, length $$rbuf;
   __fh_nonblocking($sock, 0);
   return 1 if $bytes;
   return 0;
   __fh_nonblocking($sock, 0);
   return 1 if $bytes;
   return 0;