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