簡體   English   中英

在python中實現與redis通信的最佳方法是什么?

[英]what is the best way to implement communication with redis in python

我正在嘗試編寫一個與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

因為,兩個函數中都存在一些重復數據,這不是一個好方法。 我想知道什么是最好的方法讓它整潔也許上課? 將非常感謝任何幫助。

你可以把它變成一個類。 根據您的具體要求,您可以做的是:

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

您可以將類實例化一次,並將其重復用於多次查找/刪除。

讓它成為一個班級。

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

謝謝@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM