antirez / RESP3

RESP protocol V3 repository. Contains the specification, and other related resource
229 stars 41 forks source link

Additional "processing instruction" type #17

Open coleifer opened 5 years ago

coleifer commented 5 years ago

In a project I've been hacking on, a redis-like frontend for LMDB, I implemented and extended the Redis protocol with a few additional types.

One of these I think may interest you I'm calling a "processing instruction". It allows the client to send additional metadata along with a single command. Currently I am only using this functionality to allow the client to specify a different database for a single command (LMDB, like Redis, supports multiple databases within a single environment). So rather than having the client do:

I can just explicitly SELECT 0 once, and when I need to run a single command against DB 15, I send (along with the command) a processing instruction that indicates the DB for that command should be db 15:

Another usage for processing commands could be to set/modify the expiration time on the key being operated on.

AngusP commented 5 years ago

Would this not be possible by sending a attribute type with the request from the client? For example,

|1<CR><LF>
    %1<CR><LF>
        +use-database<CR><LF>
        :1<CR><LF>
*3<CR><LF>
    LPUSH<CR><LF>
    somekey<CR><LF>
    someval<CR><LF>

While Redis looks like it will only be allowing array-type requests from clients, the protocol can work in full-duplex. In this way you could put arbitrarily complex meta and state in the 'header' using attribute type data.

coleifer commented 5 years ago

Yeah exactly, it would just be a question of how the server supported and interpreted such.