The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

Redis::Parser::XS - unified redis protocol parser

SYNOPSIS

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; 
}

DESCRIPTION

Easy way to parse unified redis protocol.

Protocol specification http://redis.io/topics/protocol

FUNCTIONS

$len = parse_redis $buf, \@output;

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
)

EXPORT

Exports only one function:

parse_redis

BENCHMARK

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

SEE ALSO

Protocol::Redis::XS

AUTHOR

Alexandr Gomoliako <zzz@zzz.org.ua>

LICENSE

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.