Redis::Parser::XS - unified redis protocol parser
use Redis::Parser::XS;
my @output;
my $buf = "+OK" .
"\x0d\x0a";
my $len = parse_redis $buf, \@output;
if (!defined $len) {
warn "incorrect protocol message\n";
} elsif ($len == 0) {
warn "not enough data to parse, " .
"read some more and try again\n";
if (length ($buf) > 16384) { # 16k and still incomplete ?
# better to just bail
...
}
} else { # $len > 0
warn "parsed $len bytes\n";
# got status reply:
# @output = ( [ '+', 'OK' ] )
$buf = substr $buf, $len;
}
Easy way to parse unified redis protocol.
Protocol specification http://redis.io/topics/protocol
Parses redis protocol messages from $buf and pushes each message
into @output. Returns undef on error or total length of parsed
data. Return value of 0 returned as a "0 but true" string and
indicates, that there isn't enough data to parse even one message.
Parsed messages added to the @output in the following format:
@output = (
['+', 'OK' ], # +OK CRLF
#
['-', 'ERROR' ], # -ERROR CRLF
#
[':', '123' ], # :123 CRLF
#
['$', 'foo' ], # $3 CRLF
# foo CRLF
#
['$', undef ], # $-1 CRLF
#
['$', '' ], # $0 CRLF
# CRLF
#
['*', [] ], # *0 CRLF
#
['*', undef ], # *-1 CRLF
#
['*', [ 'foo', # *2 CRLF
['+', 'OK'], # $3 CRLF
... ] # foo CRLF
# +OK CRLF
# ...
#
['*', ['foo', undef ] ], # *2 CRLF
# $3 CRLF
# foo CRLF
# $-1 CRLF
)
Exports only one function:
parse_redis
Here is a sample benchmark against Protocol::Redis::XS, generated by eg/bench.pl:
Status reply
Rate
Protocol::Redis::XS 281098/s
Redis::Parser::XS 367589/s
Multibulk reply
Rate
Protocol::Redis::XS 127999/s
Redis::Parser::XS 270490/s
Protocol::Redis::XS
Alexandr Gomoliako <zzz@zzz.org.ua>
Copyright 2011 Alexandr Gomoliako. All rights reserved.
This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
© 2012 Alexandr Gomoliako