Skip to content

Instantly share code, notes, and snippets.

@selam
Created September 29, 2015 13:21
Show Gist options
  • Save selam/5da8b4032d6805e5b574 to your computer and use it in GitHub Desktop.
Save selam/5da8b4032d6805e5b574 to your computer and use it in GitHub Desktop.
Libketama and keyspace supported redis client, keyspace seperated with column ( : )
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gredis.client import AsyncRedis
import tempfile
import ketama
class AsyncRedisClient(object):
def __init__(self, settings={}):
self.servers = {}
self.connections = {}
self.keyspaces = settings
if "_" not in self.keyspaces:
self.keyspaces['_'] = [
"127.0.0.1 1"
]
self._prepare()
def _prepare(self):
for keyspace in self.keyspaces.keys():
_file = tempfile.NamedTemporaryFile()
for server in self.keyspaces[keyspace]:
if "\t" not in server:
server = server.replace(" ", "\t")
_file.write("{server}\n".format(server=server))
addr = server.split("\t")[0]
if addr not in self.connections:
self.connections[addr] = AsyncRedis(host=addr)
_file.seek(0)
self.servers[keyspace] = ketama.Continuum(_file.name)
def __getattr__(self, command):
def wrapper(*args, **kwargs):
if 0 < len(args):
keyspace = args[0].split(":")[0] if isinstance(args[0], basestring) else None
cont = self.servers.get(keyspace, None)
if not cont:
cont = self.servers.get("_")
server_node = cont.get_server(args[0])
server = self.connections.get(server_node[1], None)
if not server:
raise Exception("We coudnt find a connection for given redis key")
return getattr(server, command)(*args, **kwargs)
return wrapper
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment