| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- """
- -------------------------------------------------
- File Name: db.py
- Description: 数据库操作模块,负责对象与底层数据库
- 的交互。
- Author: Liu
- Date: 2016/12/9
- -------------------------------------------------
- """
- import redis
- from .error import PoolEmptyError
- from .setting import HOST, PORT
- class RedisClient(object):
- """
- Redis数据库操作类。
- """
- def __init__(self, host=HOST, port=PORT):
- self.__db = redis.Redis(host, port)
- def get(self, count=1):
- """从Pool中获取一定量数据。"""
- proxies = self.__db.lrange("proxies", 0, count - 1)
- self.__db.ltrim("proxies", count, -1)
- return proxies
- 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
- def put_many(self, proxies):
- """将一定量的代理压入Pool。
- """
- for proxy in proxies:
- self.put(proxy)
- 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")
- def flush(self):
- """刷新Redis中的全部内容,测试用。
- """
- self.__db.flushall()
|