redisClient.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. key为ip:port, value为代理属性的字典;
  23. """
  24. def __init__(self, **kwargs):
  25. """
  26. init
  27. :param host: host
  28. :param port: port
  29. :param password: password
  30. :param db: db
  31. :return:
  32. """
  33. self.name = ""
  34. kwargs.pop("username")
  35. self.__conn = Redis(connection_pool=BlockingConnectionPool(decode_responses=True, **kwargs))
  36. def get(self):
  37. """
  38. 返回一个代理
  39. :return:
  40. """
  41. proxies = self.__conn.hkeys(self.name)
  42. proxy = choice(proxies) if proxies else None
  43. if proxy:
  44. return self.__conn.hget(self.name, proxy)
  45. else:
  46. return False
  47. def put(self, proxy_obj):
  48. """
  49. 将代理放入hash, 使用changeTable指定hash name
  50. :param proxy_obj: Proxy obj
  51. :return:
  52. """
  53. data = self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
  54. return data
  55. def pop(self):
  56. """
  57. 弹出一个代理
  58. :return: dict {proxy: value}
  59. """
  60. proxies = self.__conn.hkeys(self.name)
  61. for proxy in proxies:
  62. proxy_info = self.__conn.hget(self.name, proxy)
  63. self.__conn.hdel(self.name, proxy)
  64. return proxy_info
  65. else:
  66. return False
  67. def delete(self, proxy_str):
  68. """
  69. 移除指定代理, 使用changeTable指定hash name
  70. :param proxy_str: proxy str
  71. :return:
  72. """
  73. return self.__conn.hdel(self.name, proxy_str)
  74. def exists(self, proxy_str):
  75. """
  76. 判断指定代理是否存在, 使用changeTable指定hash name
  77. :param proxy_str: proxy str
  78. :return:
  79. """
  80. return self.__conn.hexists(self.name, proxy_str)
  81. def update(self, proxy_obj):
  82. """
  83. 更新 proxy 属性
  84. :param proxy_obj:
  85. :return:
  86. """
  87. return self.__conn.hset(self.name, proxy_obj.proxy, proxy_obj.to_json)
  88. def getAll(self):
  89. """
  90. 字典形式返回所有代理, 使用changeTable指定hash name
  91. :return:
  92. """
  93. item_dict = self.__conn.hgetall(self.name)
  94. return item_dict
  95. def clear(self):
  96. """
  97. 清空所有代理, 使用changeTable指定hash name
  98. :return:
  99. """
  100. return self.__conn.delete(self.name)
  101. def getCount(self):
  102. """
  103. 返回代理数量
  104. :return:
  105. """
  106. return self.__conn.hlen(self.name)
  107. def changeTable(self, name):
  108. """
  109. 切换操作对象
  110. :param name:
  111. :return:
  112. """
  113. self.name = name