redisClient.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: utf-8 -*-
  2. """
  3. -----------------------------------------------------
  4. File Name: redisClient.py
  5. Description : 封装Redis相关操作
  6. Author : JHao
  7. date: 2019/8/9
  8. ------------------------------------------------------
  9. Change Activity:
  10. 2019/08/09: 封装Redis相关操作
  11. 2020/06/23: 优化pop方法, 改用hscan命令
  12. ------------------------------------------------------
  13. """
  14. __author__ = 'JHao'
  15. from redis.connection import BlockingConnectionPool
  16. from random import choice
  17. from redis import Redis
  18. class RedisClient(object):
  19. """
  20. Redis client
  21. Redis中代理存放的结构为hash:
  22. 原始代理存放在name为raw_proxy的hash中, key为ip:port, value为代理属性的字典;
  23. 验证后的代理存放在name为use_proxy的hash中, key为代理的ip:port, value为代理属性的字典;
  24. """
  25. def __init__(self, **kwargs):
  26. """
  27. init
  28. :param host: host
  29. :param port: port
  30. :param password: password
  31. :param db: db
  32. :return:
  33. """
  34. self.name = ""
  35. kwargs.pop("username")
  36. self.__conn = Redis(connection_pool=BlockingConnectionPool(decode_responses=True, **kwargs))
  37. def get(self):
  38. """
  39. 返回一个代理
  40. :return:
  41. """
  42. proxies = self.__conn.hkeys(self.name)
  43. proxy = choice(proxies) if proxies else None
  44. if proxy:
  45. return self.__conn.hget(self.name, proxy)
  46. else:
  47. return False
  48. def put(self, proxy_obj):
  49. """
  50. 将代理放入hash, 使用changeTable指定hash name
  51. :param proxy_obj: Proxy obj
  52. :return:
  53. """
  54. data = self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
  55. return data
  56. def pop(self):
  57. """
  58. 弹出一个代理
  59. :return: dict {proxy: value}
  60. """
  61. proxies = self.__conn.hkeys(self.name)
  62. for proxy in proxies:
  63. proxy_info = self.__conn.hget(self.name, proxy)
  64. self.__conn.hdel(self.name, proxy)
  65. return proxy_info
  66. else:
  67. return False
  68. def delete(self, proxy_str):
  69. """
  70. 移除指定代理, 使用changeTable指定hash name
  71. :param proxy_str: proxy str
  72. :return:
  73. """
  74. return self.__conn.hdel(self.name, proxy_str)
  75. def exists(self, proxy_str):
  76. """
  77. 判断指定代理是否存在, 使用changeTable指定hash name
  78. :param proxy_str: proxy str
  79. :return:
  80. """
  81. return self.__conn.hexists(self.name, proxy_str)
  82. def update(self, proxy_obj):
  83. """
  84. 更新 proxy 属性
  85. :param proxy_obj:
  86. :return:
  87. """
  88. return self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
  89. def getAll(self):
  90. """
  91. 字典形式返回所有代理, 使用changeTable指定hash name
  92. :return:
  93. """
  94. item_dict = self.__conn.hgetall(self.name)
  95. return item_dict
  96. def clear(self):
  97. """
  98. 清空所有代理, 使用changeTable指定hash name
  99. :return:
  100. """
  101. return self.__conn.delete(self.name)
  102. def getCount(self):
  103. """
  104. 返回代理数量
  105. :return:
  106. """
  107. return self.__conn.hlen(self.name)
  108. def changeTable(self, name):
  109. """
  110. 切换操作对象
  111. :param name: raw_proxy/use_proxy
  112. :return:
  113. """
  114. self.name = name