From 3cfa1332c0807a74b4ac5a2150500841f5299147 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期三, 08 三月 2023 22:54:09 +0800
Subject: [PATCH] 首板加入,安全笔数与H撤笔数优化

---
 gpcode_manager.py |  261 +++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 227 insertions(+), 34 deletions(-)

diff --git a/gpcode_manager.py b/gpcode_manager.py
index 77ba2f3..c33607e 100644
--- a/gpcode_manager.py
+++ b/gpcode_manager.py
@@ -6,11 +6,144 @@
 import time
 
 import client_manager
+import constant
 from db import redis_manager
 import tool
 import decimal
 
 __redisManager = redis_manager.RedisManager(0)
+
+
+class CodesNameManager:
+    redisManager = redis_manager.RedisManager(0)
+
+    @classmethod
+    def __get_redis(cls):
+        return cls.redisManager.getRedis()
+
+    @classmethod
+    def list_code_name_dict(cls):
+        dict_ = {}
+        val = cls.list_first_code_name_dict()
+        if val is not None:
+            for k in val:
+                dict_[k] = val[k]
+        val = cls.list_second_code_name_dict()
+        if val is not None:
+            for k in val:
+                dict_[k] = val[k]
+        return dict_
+
+    @classmethod
+    def list_first_code_name_dict(cls):
+        val = cls.__get_redis().get("gp_list_names_first")
+        if val is not None:
+            val = json.loads(val)
+            return val
+        return None
+
+    @classmethod
+    def list_second_code_name_dict(cls):
+        val = cls.__get_redis().get("gp_list_names")
+        if val is not None:
+            val = json.loads(val)
+            return val
+        return None
+
+    @classmethod
+    def get_first_code_name(cls, code):
+        val = cls.__get_redis().get("gp_list_names_first")
+        if not val:
+            return None
+        val = json.loads(val)
+        for k in val:
+            if val[k] == code:
+                return k
+        return None
+
+    @classmethod
+    def get_second_code_name(cls, code):
+        val = cls.__get_redis().get("gp_list_names")
+        if not val:
+            return None
+        val = json.loads(val)
+        for k in val:
+            if val[k] == code:
+                return k
+
+    @classmethod
+    def get_first_name_code(cls, name):
+        val = cls.__get_redis().get("gp_list_names_first")
+        if not val:
+            return None
+        val = json.loads(val)
+        return val.get(name)
+
+    @classmethod
+    def get_second_name_code(cls, name):
+        val = cls.__get_redis().get("gp_list_names")
+        if not val:
+            return None
+        val = json.loads(val)
+        return val.get(name)
+
+    # 璁剧疆棣栨澘浠g爜鍚嶇О
+    @classmethod
+    def set_first_code_names(cls, datas):
+        cls.__get_redis().set("gp_list_names_first", json.dumps(datas))
+
+    # 璁剧疆浜屾澘浠g爜鍚嶇О
+    @classmethod
+    def set_second_code_names(cls, datas):
+        cls.__get_redis().set("gp_list_names", json.dumps(datas))
+
+    # 鍒犻櫎棣栨澘浠g爜鍚嶇О
+    @classmethod
+    def clear_first_code_names(cls):
+        cls.__get_redis().delete("gp_list_names_first")
+
+    # 璁剧疆浜屾澘浠g爜鍚嶇О
+    @classmethod
+    def clear_second_code_names(cls):
+        cls.__get_redis().delete("gp_list_names")
+
+
+# 棣栨澘浠g爜绠$悊
+class FirstCodeManager:
+    redisManager = redis_manager.RedisManager(0)
+
+    @classmethod
+    def __get_redis(cls):
+        return cls.redisManager.getRedis()
+
+    # 鍔犲叆棣栨澘鍘嗗彶璁板綍
+    @classmethod
+    def add_record(cls, codes):
+        for code in codes:
+            cls.__get_redis().sadd("first_code_record", code)
+        cls.__get_redis().expire("first_code_record", tool.get_expire())
+
+    @classmethod
+    def is_in_first_record(cls, code):
+        if cls.__get_redis().sismember("first_code_record", code):
+            return True
+        else:
+            return False
+
+    # 鍔犲叆棣栨澘娑ㄥ仠杩囦唬鐮侀泦鍚�
+    @classmethod
+    def add_limited_up_record(cls, codes):
+        for code in codes:
+            cls.__get_redis().sadd("first_code_limited_up_record", code)
+        cls.__get_redis().expire("first_code_limited_up_record", tool.get_expire())
+
+    # 鏄惁娑ㄥ仠杩�
+    @classmethod
+    def is_limited_up(cls, code):
+        if cls.__get_redis().sismember("first_code_limited_up_record", code):
+            return True
+        else:
+            return False
 
 
 def __parse_codes_data(code_datas):
@@ -28,64 +161,106 @@
     return codes, name_codes
 
 
+# -------------------------------浜屾澘浠g爜绠$悊---------------------------------
+
 def set_gp_list(code_datas):
     codes, name_codes = __parse_codes_data(code_datas)
     redis_instance = __redisManager.getRedis()
     # 鍒犻櫎涔嬪墠鐨�
     redis_instance.delete("gp_list")
-    redis_instance.delete("gp_list_names")
+    CodesNameManager.clear_second_code_names()
     for d in codes:
         redis_instance.sadd("gp_list", d)
-    redis_instance.set("gp_list_names", json.dumps(name_codes))
+    CodesNameManager.set_second_code_names(name_codes)
 
 
 # 鏂板浠g爜
 def add_gp_list(code_datas):
+    if len(code_datas) > 200:
+        raise Exception("涓嶈兘瓒呰繃200涓暟鎹�")
     redis_instance = __redisManager.getRedis()
     codes, name_codes = __parse_codes_data(code_datas)
     for d in codes:
         redis_instance.sadd("gp_list", d)
-    old_name_codes = get_name_codes()
+    old_name_codes = CodesNameManager.list_second_code_name_dict()
     if old_name_codes is None:
         old_name_codes = name_codes
     else:
         for key in name_codes:
             old_name_codes[key] = name_codes[key]
-    redis_instance.set("gp_list_names", json.dumps(old_name_codes))
+    CodesNameManager.set_second_code_names(old_name_codes)
+
+
+# -------------------------------棣栨澘浠g爜绠$悊-------------------------------
+# 娣诲姞棣栨澘浠g爜
+# code_datas 鎺橀噾杩斿洖鐨勬暟鎹�
+def set_first_gp_codes_with_data(code_datas):
+    redis_instance = __redisManager.getRedis()
+    codes, name_codes = __parse_codes_data(code_datas)
+    codes_set = set()
+    for code in codes:
+        codes_set.add(code)
+    old_codes_set = redis_instance.smembers("gp_list_first")
+    if old_codes_set is None:
+        old_codes_set = set()
+    del_set = old_codes_set - codes_set
+    add_codes = codes_set - old_codes_set
+    for code in add_codes:
+        redis_instance.sadd("gp_list_first", code)
+    for code in del_set:
+        redis_instance.srem("gp_list_first", code)
+    redis_instance.expire("gp_list_first", tool.get_expire())
+
+    old_name_codes = CodesNameManager.list_first_code_name_dict()
+    if old_name_codes is None:
+        old_name_codes = name_codes
+    else:
+        for key in name_codes:
+            old_name_codes[key] = name_codes[key]
+    CodesNameManager.set_first_code_names(old_name_codes)
+
+
+# 绉婚櫎棣栨澘浠g爜
+def remove_first_gp_code(codes):
+    redis_instance = __redisManager.getRedis()
+    for code in codes:
+        redis_instance.srem("gp_list_first", code)
+
+
+# 鑾峰彇棣栨澘浠g爜
+def get_first_gp_codes():
+    redis_instance = __redisManager.getRedis()
+    return redis_instance.smembers("gp_list_first")
+
+
+# 鏄惁鍦ㄩ鏉块噷闈�
+def is_in_first_gp_codes(code):
+    redis_instance = __redisManager.getRedis()
+    return redis_instance.sismember("gp_list_first", code)
 
 
 # 鑾峰彇鍚嶇О瀵瑰簲鐨勪唬鐮�
 def get_name_code(name):
-    redis_instance = __redisManager.getRedis()
-    val = redis_instance.get("gp_list_names")
-    if not val:
-        return None
-    val = json.loads(val)
-    return val.get(name)
+    code = CodesNameManager.get_second_name_code(name)
+    if code is not None:
+        return code
+    code = CodesNameManager.get_first_name_code(name)
+    return code
 
 
 def get_code_name(code):
-    redis_instance = __redisManager.getRedis()
-    val = redis_instance.get("gp_list_names")
-    if not val:
-        return None
-    val = json.loads(val)
-    for key in val:
-        if val[key] == code:
-            return key
-    return None
+    name = CodesNameManager.get_second_code_name(code)
+    if name is not None:
+        return name
+    name = CodesNameManager.get_first_code_name(code)
+    return name
 
 
 def get_name_codes():
-    redis_instance = __redisManager.getRedis()
-    val = redis_instance.get("gp_list_names")
-    if not val:
-        return None
-    val = json.loads(val)
-    return val
+    return CodesNameManager.list_code_name_dict()
 
 
-# 娑ㄥ仠鐘佺鍧�
+# 娑ㄥ仠鏁版嵁淇濆瓨
 def set_limit_up_list(gpset):
     if gpset is None:
         return
@@ -108,16 +283,26 @@
 def rm_gp(code):
     redis_instance = __redisManager.getRedis()
     redis_instance.srem("gp_list", code)
+    remove_first_gp_code([code])
 
 
 def is_in_gp_pool(code):
     redis_instance = __redisManager.getRedis()
-    return redis_instance.sismember("gp_list", code)
+    return redis_instance.sismember("gp_list", code) or is_in_first_gp_codes(code)
 
 
 def get_gp_list():
     redis_instance = __redisManager.getRedis()
-    return redis_instance.smembers("gp_list")
+    codes = redis_instance.smembers("gp_list")
+    first_codes = get_first_gp_codes()
+    return set.union(codes, first_codes)
+
+
+# 鑾峰彇浜屾澘浠g爜
+def get_second_gp_list():
+    redis_instance = __redisManager.getRedis()
+    codes = redis_instance.smembers("gp_list")
+    return codes
 
 
 def get_gp_list_with_prefix(data=None):
@@ -263,6 +448,14 @@
     redis_instance.expire(key, tool.get_expire())
 
 
+# 娓呴櫎鎵�鏈夌洃鍚唬鐮�
+def clear_listen_codes():
+    redis_instance = __redisManager.getRedis()
+    keys = redis_instance.keys("listen_code-*-*")
+    for key in keys:
+        redis_instance.setex(key, tool.get_expire(), "")
+
+
 # 鑾峰彇鍙互鎿嶄綔鐨勪綅缃�
 def get_can_listen_pos(client_id=0):
     client_ids = []
@@ -278,8 +471,10 @@
         random.shuffle(keys)
         codes = []
         for key in keys:
+            index = key.split("-")[-1]
+            if int(index) + 1 > constant.L2_CODE_COUNT_PER_DEVICE:
+                continue
             result = redis_instance.get(key)
-
             if result is None or len(result) == 0:
                 return client_id, int(key.replace("listen_code-{}-".format(client_id), ""))
             else:
@@ -364,8 +559,6 @@
 
 
 if __name__ == '__main__':
-    _start = time.time()
-    redis_instance = __redisManager.getRedis()
-    val = redis_instance.get("code_listen_pos-{}".format("603786"))
-    print(json.loads(val))
-    print((time.time() - _start) * 1000)
+    print(get_code_name("603042"))
+    print(get_name_code("鍗庤剦绉戞妧"))
+    print(get_name_codes())

--
Gitblit v1.8.0