RedisDB.py 2.6 KB

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