From 48fb7a00951f91bdc707e5dd2d196e5bccb752c3 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期三, 18 六月 2025 18:41:30 +0800
Subject: [PATCH] 异常保护

---
 code_attribute/gpcode_first_screen_manager.py |  144 ++++++++++++++++++++++++++++--------------------
 1 files changed, 84 insertions(+), 60 deletions(-)

diff --git a/code_attribute/gpcode_first_screen_manager.py b/code_attribute/gpcode_first_screen_manager.py
index c56e69c..a1ef0c2 100644
--- a/code_attribute/gpcode_first_screen_manager.py
+++ b/code_attribute/gpcode_first_screen_manager.py
@@ -8,76 +8,106 @@
 from db.redis_manager_delegate import RedisUtils
 from utils import tool
 from db import redis_manager_delegate as redis_manager
-from third_data import block_info
-
-__redisManager = redis_manager.RedisManager(0)
 
 
-def __get_redis():
-    return __redisManager.getRedis()
+class FirstCodeDataManager:
+    __instance = None
+    __redisManager = redis_manager.RedisManager(0)
+    __db = 0
+    __first_code_data_cache = {}
 
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(FirstCodeDataManager, cls).__new__(cls, *args, **kwargs)
+            cls.__load_data()
+        return cls.__instance
 
-__first_code_data_cache = {}
+    # 鍔犺浇鏁版嵁
+    @classmethod
+    def __load_data(cls):
+        keys = RedisUtils.keys(cls.__get_redis(), "first_code_data-*")
+        for k in keys:
+            val = RedisUtils.get(cls.__get_redis(), k)
+            code = k.split("-")[-1]
+            if val:
+                cls.__first_code_data_cache[code] = json.loads(val)
 
+    @classmethod
+    def __get_redis(cls):
+        return cls.__redisManager.getRedis()
 
-# 淇濆瓨棣栨澘绁ㄧ殑鏁版嵁
-# 1.棣栨娑ㄥ仠鏃堕棿
-# 2.鏈�杩戞定鍋滄椂闂�
-# 3.棣栨鐐稿紑鏃堕棿
-# 4.鏈�杩戠偢寮�鏃堕棿
-# 5.鏄惁宸茬粡娑ㄥ仠
-def __save_first_code_data(code, data):
-    tool.CodeDataCacheUtil.set_cache(__first_code_data_cache, code, data)
-    RedisUtils.setex(__redisManager.getRedis(), f"first_code_data-{code}", tool.get_expire(), json.dumps(data))
+    # 淇濆瓨棣栨澘绁ㄧ殑鏁版嵁
+    # 1.棣栨娑ㄥ仠鏃堕棿
+    # 2.鏈�杩戞定鍋滄椂闂�
+    # 3.棣栨鐐稿紑鏃堕棿
+    # 4.鏈�杩戠偢寮�鏃堕棿
+    # 5.鏄惁宸茬粡娑ㄥ仠
+    def save_first_code_data(self, code, data):
+        tool.CodeDataCacheUtil.set_cache(self.__first_code_data_cache, code, data)
+        RedisUtils.setex_async(self.__db, f"first_code_data-{code}", tool.get_expire(), json.dumps(data))
 
+    def get_first_code_data(self, code):
+        val = RedisUtils.get(self.__get_redis(), f"first_code_data-{code}")
+        if val is None:
+            return None
+        return json.loads(val)
 
-def __get_first_code_data(code):
-    val = RedisUtils.get(__get_redis(), f"first_code_data-{code}")
-    if val is None:
+    def get_first_code_data_cache(self, code):
+        cache_result = tool.CodeDataCacheUtil.get_cache(self.__first_code_data_cache, code)
+        if cache_result[0]:
+            return cache_result[1]
         return None
-    return json.loads(val)
 
 
-def __get_first_code_data_cache(code):
-    cache_result = tool.CodeDataCacheUtil.get_cache(__first_code_data_cache, code)
-    if cache_result[0]:
-        return cache_result[1]
-    val = __get_first_code_data(code)
-    tool.CodeDataCacheUtil.set_cache(__first_code_data_cache, code, val)
-    return val
+class FirstNoScreenCodesManager:
+    __instance = None
+    __redisManager = redis_manager.RedisManager(0)
+    __db = 0
+    __first_no_screen_codes_cache = set()
 
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(FirstNoScreenCodesManager, cls).__new__(cls, *args, **kwargs)
+            cls.__load_data()
+        return cls.__instance
 
-# 娣诲姞杩涢鏉挎湭绛涢�夌エ
-def __add_first_no_screen_codes(codes):
-    redis = __redisManager.getRedis()
-    try:
+    # 鍔犺浇鏁版嵁
+    @classmethod
+    def __load_data(cls):
+        codes = RedisUtils.smembers(cls.__get_redis(), "first_no_screen_codes")
+        cls.__first_no_screen_codes_cache = codes
+
+    @classmethod
+    def __get_redis(cls):
+        return cls.__redisManager.getRedis()
+
+    # 娣诲姞杩涢鏉挎湭绛涢�夌エ
+    def add_first_no_screen_codes(self, codes):
+        redis = self.__get_redis()
         if codes:
             for code in codes:
-                RedisUtils.sadd(redis, "first_no_screen_codes", code, auto_free=False)
-            RedisUtils.expire(redis, "first_no_screen_codes", tool.get_expire(), auto_free=False)
-    finally:
-        RedisUtils.realse(redis)
+                self.__first_no_screen_codes_cache.add(code)
+                RedisUtils.sadd_async(self.__db, "first_no_screen_codes", code, auto_free=False)
+            RedisUtils.expire_async(self.__db, "first_no_screen_codes", tool.get_expire(), auto_free=False)
 
+    def clear_first_no_screen_codes(self):
+        self.__first_no_screen_codes_cache.clear()
+        RedisUtils.delete(self.__get_redis(), "first_no_screen_codes")
 
-def clear_first_no_screen_codes():
-    RedisUtils.delete(__redisManager.getRedis(), "first_no_screen_codes")
-
-
-def __remove_first_no_screen_codes(codes):
-    redis = __redisManager.getRedis()
-    try:
+    def remove_first_no_screen_codes(self, codes):
         if codes:
             for code in codes:
-                RedisUtils.srem(redis, "first_no_screen_codes", code, auto_free= False)
-    finally:
-        RedisUtils.realse(redis)
+                self.__first_no_screen_codes_cache.discard(code)
+                RedisUtils.srem_async(self.__db, "first_no_screen_codes", code, auto_free=False)
 
+    def __get_first_no_screen_codes(self):
+        codes = RedisUtils.smembers(self.__get_redis(), "first_no_screen_codes")
+        if not codes:
+            return set()
+        return codes
 
-def __get_first_no_screen_codes():
-    codes = RedisUtils.smembers(__get_redis(), "first_no_screen_codes")
-    if not codes:
-        return set()
-    return codes
+    def get_first_no_screen_codes_cache(self):
+        return self.__first_no_screen_codes_cache
 
 
 # 澶勭悊ticks鏁版嵁
@@ -85,7 +115,7 @@
     for price in prices:
         code = price["code"]
         time_ = price["time"]
-        old_data = __get_first_code_data_cache(code)
+        old_data = FirstCodeDataManager().get_first_code_data_cache(code)
         if old_data is None:
             continue
         limit_up = price["limit_up"]
@@ -99,7 +129,7 @@
                 old_data[2] = time_
             old_data[3] = time_
         old_data[4] = limit_up
-        __save_first_code_data(code, old_data)
+        FirstCodeDataManager().save_first_code_data(code, old_data)
 
 
 def set_target_no_screen_codes(codes):
@@ -112,16 +142,16 @@
     del_codes = old_codes - codes_set
     add_codes = codes_set - old_codes
     if del_codes:
-        __remove_first_no_screen_codes(del_codes)
+        FirstNoScreenCodesManager().remove_first_no_screen_codes(del_codes)
     if add_codes:
         # 娣诲姞杩涢鏉挎湭閫夌エ
-        __add_first_no_screen_codes(add_codes)
+        FirstNoScreenCodesManager().add_first_no_screen_codes(add_codes)
     return add_codes
 
 
 # 鑾峰彇棣栨澘鏈瓫閫夌殑鐩爣绁�
 def get_target_no_screen_codes():
-    return __get_first_no_screen_codes()
+    return FirstNoScreenCodesManager().get_first_no_screen_codes_cache()
 
 
 # 鏄惁闇�瑕佸姞鍏ラ鏉�
@@ -152,11 +182,5 @@
                 return True, "鐐告澘鍚庯紝60鍒嗛挓鍐呴兘鏈洖灏�"
         if now_rate <= 6:
             return True, "鐐告澘鍚庯紝娑ㄥ箙灏忎簬6%"
-    blocks = block_info.get_code_blocks(code)
-    if blocks and len(blocks) == 1:
-        codes = block_info.get_block_codes(blocks[0])
-
-        if codes:
-            pass
 
     return False, "棣栨澘鐐稿紑鍚庯紝娑ㄥ箙鈮�6%"

--
Gitblit v1.8.0