I agree with you about the single threading but:
* redis works at maximum throughput when sending multiple commands at once (pipelined or multivalued commands), because we avoid the RTT
* imagine if you must perform multiple commands to redis but those commands are one depending on the previous one... Lua scripts allow to implement this logic directly on the server (e.g. an auto-merge) and we do not need to do 2 or more calls (thus 2 RTTs)
* another use is when you have to do more than a simple put... (e.g. store a key with score & store the data with the lpush on another key)
* implement an new redis command and make it atomic