3

redis と通信するモジュールを作成しようとしています。これまでのところ、次のことを行っています。

  1. トークンを取得する
  2. トークン A の場合、redis A に接続します
  3. それ以外の場合は、redis B に接続します
  4. 特定のキーのデータを取得する
  5. キーを削除する

ここに私が書いたものがあります:

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

両方の関数に重複データがあるため、これは適切なアプローチではありません。私はそれをきちんとするための最良の方法は何だろうと思っていました たぶんクラス? . どんな助けにも感謝します。

4

3 に答える 3

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))

クラスを一度インスタンス化して、複数の検索/削除に再利用できます。

于 2013-05-20T14:22:08.540 に答える
0

Thankyou @yarkee. I have come up with the following solution. Will appreciate if anyone can point out some more better way.

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
于 2013-05-20T14:18:31.453 に答える
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')
于 2013-05-20T13:22:31.030 に答える