Browse Source

fixbug - 布隆过滤器的redis分布式锁问题修复

dongzhaorui 2 years ago
parent
commit
5af3b0ab1d

+ 1 - 1
find_source/crawler/bloom_filter/RedisBloomFilter.py

@@ -92,7 +92,7 @@ class RedisFilter(BloomFilter):
         lock = acquire_lock_with_timeout(self.server, key)
         for time in range(self._hash_num):
             key_hashed_idx = mmh3.hash(key, self._hash_seed[time]) % self._bit_num
-            if not int(self.server.getbit(keyname, key_hashed_idx)):    # 类型?
+            if not int(self.server.getbit(keyname, key_hashed_idx)):
                 release_lock(self.server, key, lock)
                 return False
         release_lock(self.server, key, lock)

+ 23 - 15
find_source/crawler/bloom_filter/utils.py

@@ -34,19 +34,27 @@ def release_lock(conn, lockname, identifier):
     pipe = conn.pipeline(True)
     lockname = 'lock:' + lockname
     while True:
-        try:
-            pipe.watch(lockname)
-            # 判断标志是否相同
-            if str(pipe.get(lockname), encoding='utf-8') == identifier:
-                pipe.multi()
-                pipe.delete(lockname)
-                pipe.execute()
-                return True
-
-            # 不同则直接退出 return False
-            pipe.unwatch()
-            break
-
-        except (redis.exceptions.WatchError, TypeError):
-            pass
+        # try:
+        pipe.watch(lockname)
+        # 判断标志是否相同
+        if pipe.get(lockname) is not None and str(pipe.get(lockname), encoding='utf-8') == identifier:
+            pipe.multi()
+            pipe.delete(lockname)
+            pipe.execute()
+            return True
+
+        # 不同则直接退出 return False
+        pipe.unwatch()
+        break
+
+        # except (redis.exceptions.WatchError, TypeError):
+        #     pass
     return False
+
+
+# if __name__ == '__main__':
+#     from common.databases import redis_client
+#     server = redis_client()
+#     identifier = acquire_lock_with_timeout(server, 'dzr')
+#     print(identifier)
+#     release_lock(server, 'dzr', identifier)