Grokzen/redis-py-cluster — pull request #12 by 72squared (2014-07-28 16:11:17+00:00)
Title: Get all supported commands working functionally correct

I can break these patches out into individual changesets but each one is really small and it was easier to submit them as a collection. If you need me to break them out, let me know and I'll do so.

* keys now returns a list instead of set (same behavior as redis-py)
* zinterstore and zunionstore now work but only on keys in the same key slot. relies on server cluster to toss an exception.
* delete command now works with multiple keys similar to how mget works, by sending each command individually (functionally correct but needs refactor).
* fix for brpoplpush. on timeout it returns None, doesn't raise timeout exception as far as I can tell.
* fixed tests for ttl and pttl. redis-py tests we borrowed were flawed, designed for redis 2.6. We need redis 2.8+ behavior.

Regarding zinterstore and zunionstore, I feel like we can support them in limited fashion by just passing them through like other key commands. Redis cluster server will return an error response if the keys don't map to the same key slot, so we can support the command and it is up to the application developer to only use keys that map to the same slot like these keys:
* A{foo}
* B{foo}
* C{foo}
If they don't they'll get an ResponseError exception with a message about `CROSSSLOT KEYS` from the server which to me feels good enough.