Source code for proxypool.db

"""
-------------------------------------------------
    File Name:     db.py
    Description:   数据库操作模块,负责对象与底层数据库
                   的交互。
    Author:        Liu
    Date:          2016/12/9
-------------------------------------------------
"""
import redis

from .error import PoolEmptyError
from .setting import HOST, PORT


[docs]class RedisClient(object): """ Redis数据库操作类。 """ def __init__(self, host=HOST, port=PORT): self.__db = redis.Redis(host, port)
[docs] def get(self, count=1): """从Pool中获取一定量数据。""" proxies = self.__db.lrange("proxies", 0, count - 1) self.__db.ltrim("proxies", count, -1) return proxies
[docs] def put(self, proxy): """将代理压入Pool中。 用Redis的set容器来负责去重,如果proxy能被压入proxy_set, 就将其放入proxy pool中,否则不压入。 """ if self.__db.sadd("proxy_set", proxy): self.__db.rpush("proxies", proxy) else: pass
[docs] def put_many(self, proxies): """将一定量的代理压入Pool。 """ for proxy in proxies: self.put(proxy)
[docs] def pop(self): """弹出一个可用代理。 """ try: return self.__db.blpop("proxies", 30)[1].decode('utf-8') except: raise PoolEmptyError
@property def queue_len(self): """获取proxy pool的大小。 """ return self.__db.llen("proxies")
[docs] def flush(self): """刷新Redis中的全部内容,测试用。 """ self.__db.flushall()