Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Lua module for parsing raw redis responses
Perl C

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
t
.gitignore
Makefile
README
ddebug.h
redis-parser.c

README

lua-redis-parser

This lua library implementes a thin and fast redis raw response parser
that constructs corresponding lua data strucutres, as well as a
function that constructs redis raw requests.

To maximize speed, this module is implemented in pure C.

Here's the usage of the parse_reply method:

    local parser = require('redis.parser')

    -- assuming the reply variable holds the (single) redis response
    --  to be parsed:
    local res, typ = parser.parse_reply(reply)

    if typ == parser.BAD_REPLY then
        -- res is the textual error message from the parser
    elseif typ == parser.INTEGER_REPLY then
        -- res is an integer, like 3, returned from the redis server
    elseif typ == parser.ERROR_REPLY then
        -- res is the error message from the redis2 server
    elseif typ == parser.STATUS_REPLY then
        -- res is the textual message from the redis server
    elseif typ == parser.BULK_REPLY then
        --- res is a string for the bulk data
    elseif typ == parser.MULTI_BULK_REPLY then
        -- res is a lua (array) table that holds the individual bulks
    end

You can use the parse_replies method to parse multiple pipelined
redis responses, for example

    local parser = require('redis.parser')

    -- assuming the replies variable holds n redis responses
    --  to be parsed:
    local results = parser.parse_replies(replies, n)
    for i, result in ipairs(results) do
        local res = result[1]
        local typ = result[2]

        -- res and typ have exactly the same meaning as in
        --  the parse_reply method documented above
    end

We also have a build_query function that helps construct raw redis requests from
simple lua values. It simply accepts a lua table, a list of parameters including
the command name.

Let's check out the complete list of redis 2.0 commands:

   http://redis.io/commands

For the first command in that list, "APPEND   key value", we can just use

local req = parser.build_query({'APPEND', 'some-key', 'some-value'})

to construct a binary request in the return value. Because the redis
command is case insensitive, I usually just use 'append', the lower
case form, as the first element of that list, as in

    local req = parser.build_query({'set', 'foo', 'some value'})
        -- req is the raw TCP request ready to send to the remote redis server
        -- over the TCP connection

null values should be specified by "parser.null" (without quotes) rather
than Lua's "nil".

Boolean values will be converted to 1 or 0, for true and false, respectively.

Background

This module is originally written for ngx_lua + ngx_redis2:

    http://github.com/chaoslawful/lua-nginx-module

    https://github.com/agentzh/redis2-nginx-module

Installation
    # To use /usr/include/lua5.1/ and install to /usr/lib/lua/5.1:
    make
    make install

    To use a different Lua other than /usr/include/lua5.1, use the following:

    make LUA_INC=/opt/lua/include

    and install this module to a different location than /usr/lib/lua/5.1:

    make INSTALL_PATH=/opt/lua-exts install

    Please edit the Makefile file to use a custom lua and/or install
    this module into a custom location.

TODO
    redis pipelining response parsing and query support

Something went wrong with that request. Please try again.