在python中实现与redis通信的最佳方法是什么?

时间:2013-05-20 12:45:50

标签: python class redis

我正在尝试编写一个与redis通信的模块。到目前为止,它正在做的事情。

  1. 获取令牌
  2. 如果令牌A然后连接到redis A
  3. 其他连接到redis B
  4. 获取特定密钥的数据
  5. 删除密钥
  6. 这是我写的:

    import redis
    
    def get_data(token):
    
        if token == "tokenA" 
            connection = redis.Redis(connection_pool=name_of_redis_engine1)
        else:   
            connection = redis.Redis(connection_pool=name_of_redis_engine2)
    
        data = connection.hgetall(token)
        if not data:
            raise Some Error
    
        return data
    
    def delete_data(token):
    
        connection = redis.Redis(connection_pool=name_of_redis_engine)
    
        data = redis_connection.delete(token)
        if not data:
            raise Some Error
    
        return data
    

    因为,两个函数中都存在一些重复数据,这不是一个好方法。我想知道什么是最好的方法让它整洁也许上课? 。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

你可以把它变成一个班级。鉴于您的具体要求,您可以做的是:

class RedisStore:
    def __init__(self, default_connection, tokenA_connection):
        self._default_connection = default_connection
        self._tokenA_connection = tokenA_connection 

    def _chose_connection(token):
        if token == "tokenA" 
            return self._tokenA_connection
        else:   
            return self._default_connection

    def get_data(self, token):
        connection = self._chose_connection(token)
        data = connection.hgetall(token)
        if not data:
            raise Exception("Some Error")  # you can only raise exceptions, and you should use a more specific one

        return data

    def delete_data(self, token):
        connection = self._chose_connection(token)
        data = connection.delete(token)
        if not data:
            raise Exception("Some Error")  # if that is supposed to raise the same exception, you could generalize further...
        return data

redis_store = new RedisStore(redis.Redis(connection_pool=name_of_redis_engine1), redis.Redis(connection_pool=name_of_redis_engine2))

您可以将类实例化一次,并将其重复用于多次查找/删除。

答案 1 :(得分:0)

让它成为一个班级。

import redis

class RedisOp(object):
    def __init__(self):
        self.connection = redis.Redis(connection_pool=name_of_redis_engine)

    def get_data(self, token):
        data = self.connection.hgetall(token)
        if not data:
            raise Some Error
        return data

    def delete_data(self, token):
        data = self.connection.delete(token)
        if not data:
            raise Some Error
        return data


op = RedisOp()
print op.get_data('mykey')
op.delete_data('mykey')

答案 2 :(得分:0)

谢谢@yarkee。我想出了以下解决方案。如果有人能指出一些更好的方法,我们将不胜感激。

class RedisClass(object):
def __init__(self, token=None):

    self.token = token

    if self.token == "TokenA":
        self.redis_connection = redis.Redis(connection_pool="RedisEngineA")
    else:
        self.redis_connection = redis.Redis(connection_pool="RedisEngineB")

def get_data(self):
    data = self.redis_connection.hgetall(self.token)
    if not data:
        raise AuthenticationError({"status: Invalid token"}, code=200, log_error=False)
    return data

def delete_data(self):
    data = self.redis_connection.delete(self.token)
    if not data:
        raise AuthenticationError({"status: Invalid token"}, code=200, log_error=False)
    return data