A1:Có, chúng sử dụng cùng một nhóm kết nối.
A2:Đây không phải là một thực hành tốt. Vì bạn không thể kiểm soát việc khởi tạo phiên bản này. Một giải pháp thay thế có thể là sử dụng 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)
Sau đó, RedisClient
sẽ là một lớp singleton. Không quan trọng bạn gọi client = RedisClient()
bao nhiêu lần , bạn sẽ nhận được cùng một đối tượng.
Vì vậy, bạn có thể sử dụng nó như:
from RedisClient import RedisClient
client = RedisClient()
species = 'lion'
key = 'zoo:{0}'.format(species)
data = client.conn.hmget(key, 'age', 'weight')
print(data)
Và lần đầu tiên bạn gọi client = RedisClient()
sẽ thực sự khởi tạo phiên bản này.
Hoặc bạn có thể muốn nhận phiên bản khác nhau dựa trên các đối số khác nhau:
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]