class RedisPool(object): instance = None def __init__(self, host='192.168.2.129', port=7000, password='C11O47S@xxx', db=5): self.host = 'localhost' if debug == 1 else host self.port = 6379 if debug == 1 else port self.password = 'root' if debug == 1 else password self.db = '0' if debug == 1 else db self.pool = redis.ConnectionPool(host=self.host, port=self.port, password=self.password, db=self.db) self.conn = redis.Redis(connection_pool=self.pool) self.keys = None # self.p = self.conn.pipeline(transaction=False) def __new__(cls, *args, **kwargs): if cls.instance: return cls.instance else: return super().__new__(cls) def __enter__(self): if not hasattr(self, 'keys') or self.keys is None: self.keys = self.fetch_keys() return self def __exit__(self, exc_type, exc_val, exc_tb): try: # self.p.close() self.conn.close() except: raise Exception("关闭redis链接异常") def fetch_keys(self): keys = self.conn.keys() return [key.decode() for key in keys if 'list' in self.conn.type(key.decode()).decode()] def push_to_key(self, key, line): self.conn.lpush(key, line) def total_by_key(self, key): return self.conn.llen(key) def pop_key(self, key): return self.conn.lpop(key) def fetch_from_redis(self, rediskey=None): if rediskey is None: return None try: line = self.pop_key(rediskey) except Exception as e: print("{key} has no records".format(key=rediskey)) return None return line