RedisDB.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2024-02-27
  4. ---------
  5. @summary: redis 去重
  6. ---------
  7. @author: Lzz
  8. """
  9. import hashlib
  10. import redis
  11. class RedisFilter:
  12. def __init__(self, url, expire_time=None):
  13. self.redis_db = redis.StrictRedis.from_url(url)
  14. self._ex = expire_time or 86400 * 365 * 1 # 1年 = 86400 * 365 * 1
  15. def __repr__(self):
  16. return "<RedisFilter: {}>".format(self.redis_db)
  17. def exists(self, key):
  18. """全量检索"""
  19. if self.redis_db.exists(key) > 0:
  20. return True
  21. return False
  22. def add(self, keys):
  23. """
  24. 添加数据
  25. @param keys: 检查关键词在 redis 中是否存在,支持列表批量
  26. @return: list / 单个值(添加失败返回False, 添加成功返回True)
  27. """
  28. is_list = isinstance(keys, list)
  29. keys = keys if is_list else [keys]
  30. is_added = []
  31. for key in keys:
  32. pkey = "pylist_" + self.fingerprint(key)
  33. if not self.exists(pkey):
  34. is_added.append(self.redis_db.set(pkey, 1, ex=self._ex))
  35. else:
  36. is_added.append(False)
  37. return is_added if is_list else is_added[0]
  38. def get(self, keys):
  39. """
  40. 检查数据是否存在
  41. @param keys: list / 单个值
  42. @return: list / 单个值 (存在返回True 不存在返回False)
  43. """
  44. is_list = isinstance(keys, list)
  45. keys = keys if is_list else [keys]
  46. is_exist = []
  47. for key in keys:
  48. pkey = "pylist_" + self.fingerprint(key)
  49. is_exist.append(self.exists(pkey))
  50. # 判断数据本身是否重复
  51. temp_set = set()
  52. for i, key in enumerate(keys):
  53. if key in temp_set:
  54. is_exist[i] = True
  55. else:
  56. temp_set.add(key)
  57. return is_exist if is_list else is_exist[0]
  58. def fingerprint(self, *args):
  59. """
  60. @summary: 获取唯一的64位值,获取唯一数据指纹
  61. ---------
  62. @param args: 去重数据集合
  63. ---------
  64. @result: 5580c91ea29bf5bd963f4c08dfcacd983566e44ecea1735102bc380576fd6f30
  65. """
  66. args = sorted(args)
  67. sha256 = hashlib.sha256()
  68. for arg in args:
  69. sha256.update(str(arg).encode())
  70. return sha256.hexdigest()