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