|
@@ -2,7 +2,7 @@
|
|
|
"""
|
|
|
Created on 2023-03-01
|
|
|
---------
|
|
|
-@summary: redis集群/单机过滤器
|
|
|
+@summary: 集群/单机/多台单机 redis 过滤器
|
|
|
---------
|
|
|
@author: dzr
|
|
|
@email: dongzhaorui@topnet.net.cn
|
|
@@ -16,17 +16,15 @@ import feapder.utils.tools as tools
|
|
|
class RedisFilter(BaseFilter):
|
|
|
redis_db = None
|
|
|
|
|
|
- def __init__(self, ip_ports=None, redis_url=None, expire_time=None):
|
|
|
- if isinstance(ip_ports, list) and len(ip_ports) > 1:
|
|
|
+ def __init__(self, ip_ports=None, user_pass=None, redis_url=None, expire_time=None):
|
|
|
+ if ip_ports:
|
|
|
self.__class__.redis_db = RedisDB(
|
|
|
ip_ports=ip_ports,
|
|
|
- user_pass='',
|
|
|
+ user_pass=user_pass,
|
|
|
decode_responses=True,
|
|
|
) # 集群
|
|
|
elif redis_url:
|
|
|
self.__class__.redis_db = RedisDB(redis_url=redis_url) # 单机
|
|
|
- else:
|
|
|
- self.__class__.redis_db = RedisDB(ip_ports=ip_ports) # 单机
|
|
|
|
|
|
self._ex = expire_time or 86400 * 365 * 2 # 2年 = 86400 * 365 * 2
|
|
|
self._prefix1 = 'list_'
|
|
@@ -99,3 +97,65 @@ class RedisFilter(BaseFilter):
|
|
|
temp_set.add(key)
|
|
|
|
|
|
return is_exist if is_list else is_exist[0]
|
|
|
+
|
|
|
+
|
|
|
+class MRedisFilter(RedisFilter):
|
|
|
+ redis_dbs = {}
|
|
|
+
|
|
|
+ def __init__(self, redis_conf=None, **kwargs):
|
|
|
+ super(MRedisFilter, self).__init__(**kwargs)
|
|
|
+ if not redis_conf:
|
|
|
+ self.__class__.redis_dbs[self._prefix2] = RedisDB()
|
|
|
+ else:
|
|
|
+ if not isinstance(redis_conf, dict):
|
|
|
+ raise ValueError("redis_conf 必须是一个 dict")
|
|
|
+
|
|
|
+ for prefix, conf in redis_conf.items():
|
|
|
+ self.__class__.redis_dbs[prefix] = RedisDB(
|
|
|
+ ip_ports=conf['redisdb_ip_port'],
|
|
|
+ user_pass=conf['redisdb_user_pass'],
|
|
|
+ db=conf['redisdb_db']
|
|
|
+ )
|
|
|
+
|
|
|
+ def __repr__(self):
|
|
|
+ return "<MRedisFilter: {}>".format(self.redis_dbs)
|
|
|
+
|
|
|
+ def exists(self, key):
|
|
|
+ """lua增量检索/python增量检索"""
|
|
|
+ if '&&' in key:
|
|
|
+ md5, sha256 = key.split("&&")
|
|
|
+ mixture = tools.get_sha256(md5)
|
|
|
+ else:
|
|
|
+ mixture = sha256 = key
|
|
|
+
|
|
|
+ for prefix, redis_db in self.redis_dbs.items():
|
|
|
+ if any([
|
|
|
+ redis_db.exists(prefix + sha256) > 0,
|
|
|
+ redis_db.exists(prefix + mixture) > 0
|
|
|
+ ]):
|
|
|
+ return True
|
|
|
+ return False
|
|
|
+
|
|
|
+ def add(self, keys, *args, **kwargs):
|
|
|
+ """
|
|
|
+ 添加数据
|
|
|
+ @param keys: 检查关键词在 redis 中是否存在,支持列表批量
|
|
|
+ @return: list / 单个值(如果数据已存在 返回 False 否则返回 True, 可以理解为是否添加成功)
|
|
|
+ """
|
|
|
+ is_list = isinstance(keys, list)
|
|
|
+ keys = keys if is_list else [keys]
|
|
|
+
|
|
|
+ redis_db = self.redis_dbs[self._prefix2]
|
|
|
+
|
|
|
+ is_added = []
|
|
|
+ for key in keys:
|
|
|
+ if not self.exists(key):
|
|
|
+ if '&&' in key:
|
|
|
+ md5, sha256 = key.split("&&")
|
|
|
+ else:
|
|
|
+ sha256 = key
|
|
|
+ is_added.append(redis_db.set(self._prefix2 + sha256, 1, ex=self._ex))
|
|
|
+ else:
|
|
|
+ is_added.append(False)
|
|
|
+
|
|
|
+ return is_added if is_list else is_added[0]
|