RedisDB.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. redis_db = None
  13. def __init__(self, redis_url=None, expire_time=None):
  14. self.__class__.redis_db = redis.StrictRedis.from_url(redis_url) # 单机
  15. self._ex = expire_time or 86400 * 365 * 1 # 1年 = 86400 * 365 * 1
  16. def __repr__(self):
  17. return "<RedisFilter: {}>".format(self.redis_db)
  18. def exists(self, key):
  19. """全量检索"""
  20. if self.redis_db.exists(key) > 0:
  21. return True
  22. return False
  23. def add(self, keys, *args, **kwargs):
  24. """
  25. 添加数据 删除数据:redis_db.delete("pylist_" + key)
  26. @param keys: 检查关键词在 redis 中是否存在,支持列表批量
  27. @return: list / 单个值(如果数据已存在 返回 False 否则返回 True, 可以理解为是否添加成功)
  28. """
  29. is_list = isinstance(keys, list)
  30. keys = keys if is_list else [keys]
  31. is_added = []
  32. for key in keys:
  33. if not self.exists(key):
  34. is_added.append(self.redis_db.set(key, 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. is_exist.append(self.exists(key))
  49. # 判断数据本身是否重复
  50. temp_set = set()
  51. for i, key in enumerate(keys):
  52. if key in temp_set:
  53. is_exist[i] = True
  54. else:
  55. temp_set.add(key)
  56. return is_exist if is_list else is_exist[0]
  57. def get_sha256(*args):
  58. """
  59. @summary: 获取唯一的64位值, 用于获取唯一的id
  60. ---------
  61. @param *args: 参与联合去重的值
  62. ---------
  63. @result: 5580c91ea29bf5bd963f4c08dfcacd983566e44ecea1735102bc380576fd6f30
  64. """
  65. sha256 = hashlib.sha256()
  66. for arg in args:
  67. sha256.update(str(arg).encode())
  68. return sha256.hexdigest() # 64位
  69. def rexists(dedup, data):
  70. data = [data] if not isinstance(data, list) else data
  71. args = sorted(data)
  72. pykey = "pylist_" + get_sha256(*args)
  73. if dedup.get(pykey):
  74. ''' 存在 '''
  75. return True
  76. else:
  77. ''' 不存在 '''
  78. return False
  79. def radd(dedup, data):
  80. data = [data] if not isinstance(data, list) else data
  81. args = sorted(data)
  82. pykey = "pylist_" + get_sha256(*args)
  83. state = dedup.add(pykey)
  84. return state