From c20c3c10635ce78db4a86ce9c0bb1d02e90f525d Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 08 八月 2023 17:40:42 +0800
Subject: [PATCH] 单例+缓存优化

---
 third_data/kpl_data_manager.py |   89 +++++++++++++++++++-------------------------
 1 files changed, 39 insertions(+), 50 deletions(-)

diff --git a/third_data/kpl_data_manager.py b/third_data/kpl_data_manager.py
index a0dd0c0..b841f41 100644
--- a/third_data/kpl_data_manager.py
+++ b/third_data/kpl_data_manager.py
@@ -1,7 +1,9 @@
 import json
 import os
+import time
 
 import constant
+from db.redis_manager import RedisUtils
 from utils import tool
 
 # 寮�鐩樺暒鍘嗗彶娑ㄥ仠鏁版嵁绠$悊
@@ -14,34 +16,6 @@
 from third_data.kpl_util import KPLPlatManager, KPLDataType
 
 
-# 浠g爜绮鹃�夋澘鍧楃鐞�
-class KPLCodeJXBlockManager:
-    __redisManager = redis_manager.RedisManager(3)
-    __code_blocks = {}
-
-    def __get_redis(self):
-        return self.__redisManager.getRedis()
-
-    def save_jx_blocks(self, code, blocks):
-        if blocks is None:
-            return
-        # 淇濆瓨鍓�2鏉℃暟鎹�
-        self.__get_redis().setex(f"kpl_jx_blocks-{code}", tool.get_expire(), json.dumps(blocks))
-        self.__code_blocks[code] = blocks
-
-    # 鑾峰彇绮鹃�夋澘鍧�
-    def get_jx_blocks(self, code):
-        if code in self.__code_blocks:
-            return self.__code_blocks[code]
-        val = self.__get_redis().get(f"kpl_jx_blocks-{code}")
-        if val is None:
-            return None
-        else:
-            val = json.loads(val)
-            self.__code_blocks[code] = val
-        return self.__code_blocks[code]
-
-
 class KPLCodeLimitUpReasonManager:
     __redisManager = redis_manager.RedisManager(3)
 
@@ -49,13 +23,13 @@
         return self.__redisManager.getRedis()
 
     def save_reason(self, code, reason):
-        self.__get_redis().setex(f"kpl_limitup_reason-{code}", tool.get_expire(), reason)
+        RedisUtils.setex(self.__get_redis(),f"kpl_limitup_reason-{code}", tool.get_expire(), reason)
 
     def list_all(self):
-        keys = self.__get_redis().keys("kpl_limitup_reason-*")
+        keys = RedisUtils.keys(self.__get_redis(), "kpl_limitup_reason-*")
         dict_ = {}
         for k in keys:
-            val = self.__get_redis().get(k)
+            val = RedisUtils.get(self.__get_redis(), k)
             dict_[k.split("-")[1]] = val
         return dict_
 
@@ -184,16 +158,20 @@
         for b in constant.KPL_INVALID_BLOCKS:
             wheres.append(f"hb.`_hot_block_name` != '{b}'")
         wheres = " and ".join(wheres)
-        sql = f"SELECT GROUP_CONCAT(_hot_block_name) FROM (SELECT hb.`_hot_block_name`,hb.`_day` FROM `kpl_limit_up_record` hb WHERE hb.`_code`='{code}' AND {wheres} ORDER BY hb.`_day` DESC LIMIT 10) a  GROUP BY a._day ORDER BY a._day DESC LIMIT 1"
+        sql = f"SELECT GROUP_CONCAT(_hot_block_name) FROM (SELECT hb.`_hot_block_name`,hb.`_day` FROM `kpl_limit_up_record` hb WHERE hb.`_code`='{code}' AND {wheres} ORDER BY hb.`_day` DESC LIMIT 2) a  GROUP BY a._day ORDER BY a._day DESC LIMIT 1"
         mysqldb = mysql_data.Mysqldb()
         return mysqldb.select_one(sql)
 
     # 鑾峰彇浠g爜鏈�杩戠殑鏉垮潡锛岃繑鍥瀃(鏉垮潡,鏃ユ湡)]
     @classmethod
     def get_latest_infos(cls, code, count, contains_today=True):
+        wheres = []
+        for b in constant.KPL_INVALID_BLOCKS:
+            wheres.append(f"hb.`_hot_block_name` != '{b}'")
+        wheres = " and ".join(wheres)
         # 鍙幏鍙栨渶杩�180澶╃殑鏁版嵁
         min_day = tool.date_sub(tool.get_now_date_str(), 180)
-        sql = f"SELECT GROUP_CONCAT(_hot_block_name),`_day`,_blocks FROM (SELECT hb.`_hot_block_name`,hb.`_day`,hb._blocks FROM `kpl_limit_up_record` hb WHERE hb.`_code`='{code}' and hb.`_day` > '{min_day}' ORDER BY hb.`_day` DESC LIMIT 10) a  GROUP BY a._day ORDER BY a._day DESC LIMIT {count}"
+        sql = f"SELECT GROUP_CONCAT(_hot_block_name),`_day`,_blocks FROM (SELECT hb.`_hot_block_name`,hb.`_day`,hb._blocks FROM `kpl_limit_up_record` hb WHERE hb.`_code`='{code}' and {wheres} and hb.`_day` > '{min_day}' ORDER BY hb.`_day` DESC LIMIT 10) a  GROUP BY a._day ORDER BY a._day DESC LIMIT {count}"
         mysqldb = mysql_data.Mysqldb()
         results = mysqldb.select_all(sql)
         if results and not contains_today and results[0][1] == tool.get_now_date_str():
@@ -202,21 +180,24 @@
 
     @classmethod
     def get_latest_blocks_set(cls, code):
-        results = cls.get_latest_infos(code, 10, False)
+        results = cls.get_latest_infos(code, 2, False)
         bs = set([b[0] for b in results])
         return bs
 
 
 class KPLDataManager:
     __latest_datas = {}
+    kpl_data_update_info = {}
 
-    def __save_in_file(self, key, datas):
+    @classmethod
+    def __save_in_file(cls, key, datas):
         name = f"{tool.get_now_date_str()}_{key}.log"
         path = f"{constant.CACHE_PATH}/{name}"
         with open(path, 'w') as f:
             f.write(json.dumps(datas))
 
-    def __get_from_file(self, key, day=tool.get_now_date_str()):
+    @classmethod
+    def __get_from_file(cls, key, day=tool.get_now_date_str()):
         name = f"{day}_{key}.log"
         path = f"{constant.CACHE_PATH}/{name}"
         if not os.path.exists(path):
@@ -227,7 +208,8 @@
                 return json.loads(lines[0])
         return None
 
-    def get_from_file(self, type, day):
+    @classmethod
+    def get_from_file(cls, type, day):
         name = f"{day}_{type.value}.log"
         path = f"{constant.CACHE_PATH}/{name}"
         if not os.path.exists(path):
@@ -238,8 +220,9 @@
                 return json.loads(lines[0])
         return None
 
+    @classmethod
     # 鑾峰彇鏈�杩戝嚑澶╃殑鏁版嵁锛屾牴鎹棩鏈熷�掑簭杩斿洖
-    def get_latest_from_file(self, type, count):
+    def get_latest_from_file(cls, type, count):
         files = os.listdir(constant.CACHE_PATH)
         file_name_list = []
         for f in files:
@@ -260,17 +243,20 @@
 
         return fresults
 
-    def save_data(self, type, datas):
-        self.__latest_datas[type] = datas
-        self.__save_in_file(type, datas)
+    @classmethod
+    def save_data(cls, type, datas):
+        cls.kpl_data_update_info[type] = (tool.get_now_time_str(), len(datas))
+        cls.__latest_datas[type] = datas
+        cls.__save_in_file(type, datas)
 
-    def get_data(self, type):
+    @classmethod
+    def get_data(cls, type):
         type = type.value
-        if type in self.__latest_datas:
-            return self.__latest_datas[type]
-        result = self.__get_from_file(type)
+        if type in cls.__latest_datas:
+            return cls.__latest_datas[type]
+        result = cls.__get_from_file(type)
         if result is not None:
-            self.__latest_datas[type] = result
+            cls.__latest_datas[type] = result
         return result
 
 
@@ -318,8 +304,11 @@
     return fresults
 
 
+def get_yesterday_limit_up_codes():
+    yesterday_limit_up_data_records = get_current_limit_up_data_records(1)[0][1]
+    yesterday_codes = set([x[0] for x in yesterday_limit_up_data_records])
+    return yesterday_codes
+
+
 if __name__ == "__main__":
-    fresults = get_current_limit_up_data_records(2)
-    for d in fresults:
-        print(d)
-    get_current_limit_up_data_records(2)
+    print(KPLLimitUpDataRecordManager.get_latest_blocks_set("002671"))

--
Gitblit v1.8.0