Step 1 - Challenge: Protocol Handling

In this step your goal is to build the functionality to serialise and de-serialise Redis Serialisation Protocol (RESP) messages. This is the protocol used to communicate with a Redis Server. You may want to refer to the RESP protocol specification.

Redis uses RESP as a request-response protocol in the following way:

  • Clients send commands to a Redis Server as a RESP Array of Bulk Strings.

  • The server replies with one of the RESP types according to the command implementation.

In RESP, the first byte determines the data type:

  • For Simple Strings, the first byte of the reply is "+"

  • For Errors, the first byte of the reply is "-"

  • For Integers, the first byte of the reply is ":"

  • For Bulk Strings, the first byte of the reply is "$"

  • For Arrays, the first byte of the reply is "*"

RESP can represent a Null value using a special variation of Bulk Strings: "$-1\r\n" or Array: "*-1\r\n".

Your challenge now, is to write the code required to serialise and de-serialise messages. I suggest you build on the tests in the previous lesson and build tests for some example messages, i.e.:

  • "$-1\r\n"

  • "*1\r\n$4\r\nping\r\n”

  • "*2\r\n$4\r\necho\r\n$5\r\nhello world\r\n”

  • "*2\r\n$3\r\nget\r\n$3\r\nkey\r\n”

  • "+OK\r\n"

  • "-Error message\r\n"

  • "$0\r\n\r\n"

  • "+hello world\r\n”

Plus some invalid test cases to test outside the happy path. It makes sense to work through them in the order of the types listed above, i.e. string, then errors then integers and so on.

You should create the following directory structure for your project:

ccpyredis
  README.md
  pyredis
    protocol.py
  tests
    test_protocol.py
  venv

Update your project README with details of how to run the tests to verify the correct functionality of the protocol handling code.