RedisDB.py 2.7 KB

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