Redis
 sql >> база данни >  >> NoSQL >> Redis

Правилен начин за използване на Redis Connection Pool в Python

A1:Да, те използват един и същ пул за връзки.

A2:Това не е добра практика. Тъй като не можете да контролирате инициализацията на този екземпляр. Алтернатива може да бъде използването на singleton.

import redis


class Singleton(type):
    """
    An metaclass for singleton purpose. Every singleton class should inherit from this class by 'metaclass=Singleton'.
    """
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


class RedisClient(object):

    def __init__(self):
        self.pool = redis.ConnectionPool(host = HOST, port = PORT, password = PASSWORD)

    @property
    def conn(self):
        if not hasattr(self, '_conn'):
            self.getConnection()
        return self._conn

    def getConnection(self):
        self._conn = redis.Redis(connection_pool = self.pool)

След това RedisClient ще бъде единичен клас. Без значение колко пъти извиквате client = RedisClient() , ще получите същия обект.

Така че можете да го използвате като:

from RedisClient import RedisClient

client = RedisClient()
species = 'lion'
key = 'zoo:{0}'.format(species)
data = client.conn.hmget(key, 'age', 'weight')
print(data)

И първия път, когато извикате client = RedisClient() всъщност ще инициализира този екземпляр.

Или може да искате да получите различен екземпляр въз основа на различни аргументи:

class Singleton(type):
    """
    An metaclass for singleton purpose. Every singleton class should inherit from this class by 'metaclass=Singleton'.
    """
    _instances = {}

    def __call__(cls, *args, **kwargs):
        key = (args, tuple(sorted(kwargs.items())))
        if cls not in cls._instances:
            cls._instances[cls] = {}
        if key not in cls._instances[cls]:
            cls._instances[cls][key] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls][key]



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Защо redis не може да зададе максимално отворен файл

  2. Spring data redis отменя сериализатора по подразбиране

  3. Как да визуализирате използването на Resque с Node.js, WebSockets и Redis

  4. не може да убие redis-сървър на linux

  5. Грешка в полето в обект 'target' на поле '':отхвърлена стойност []; кодове [typeMismatch.target.,typeMismatch.,typeMismatch.java.util.Date,typeMismatch]