From fb47d36048e94b9a506d5c153e3dd19a01e37df1 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 30 十月 2023 16:30:27 +0800
Subject: [PATCH] bug修复

---
 l2/transaction_progress.py |   76 +++++++++++++++++++++++++++++++------
 1 files changed, 63 insertions(+), 13 deletions(-)

diff --git a/l2/transaction_progress.py b/l2/transaction_progress.py
index 9f2c099..9e38792 100644
--- a/l2/transaction_progress.py
+++ b/l2/transaction_progress.py
@@ -5,58 +5,95 @@
 # 涔板叆闃熷垪
 import itertools
 import json
+import time
 
 import constant
-from db import redis_manager
-import tool
+from db import redis_manager_delegate as redis_manager
+from db.redis_manager_delegate import RedisUtils
+from utils import tool
 import l2.l2_data_util
-from log import logger_l2_trade_buy_queue, logger_l2_trade_buy_progress
+from log_module.log import logger_l2_trade_buy_queue, logger_l2_trade_buy_progress
 
 
 class TradeBuyQueue:
+    buy_progress_index_cache = {}
+    latest_buy_progress_index_cache = {}
+    # 鎴愪氦閫熺巼
+    trade_speed_cache = {}
+
+    __db = 0
     __redis_manager = redis_manager.RedisManager(0)
+    __instance = None
+
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(TradeBuyQueue, cls).__new__(cls, *args, **kwargs)
+            cls.__load_datas()
+        return cls.__instance
 
     def __init__(self):
         self.last_buy_queue_data = {}
 
-    def __getRedis(self):
-        return self.__redis_manager.getRedis()
+    @classmethod
+    def __get_redis(cls):
+        return cls.__redis_manager.getRedis()
+
+    @classmethod
+    def __load_datas(cls):
+        __redis = cls.__get_redis()
+        try:
+            keys = RedisUtils.keys(__redis, "trade_buy_progress_index-*")
+            for k in keys:
+                code = k.split("-")[-1]
+                val = RedisUtils.get(__redis, k)
+                val = json.loads(val)
+                tool.CodeDataCacheUtil.set_cache(cls.buy_progress_index_cache, code, val)
+
+        finally:
+            RedisUtils.realse(__redis)
 
     def __save_buy_queue_data(self, code, num_list):
         key = "trade_buy_queue_data-{}".format(code)
-        self.__getRedis().setex(key, tool.get_expire(), json.dumps((num_list, tool.get_now_time_str())))
+        RedisUtils.setex(self.__get_redis(), key, tool.get_expire(), json.dumps((num_list, tool.get_now_time_str())))
 
     # 杩斿洖鏁版嵁涓庢洿鏂版椂闂�
     def __get_buy_queue_data(self, code):
         key = "trade_buy_queue_data-{}".format(code)
-        val = self.__getRedis().get(key)
+        val = RedisUtils.get(self.__get_redis(), key)
         if val is None:
             return None, None
         val = json.loads(val)
         return val[0], [1]
 
     def __save_buy_progress_index(self, code, index, is_default):
+        tool.CodeDataCacheUtil.set_cache(self.buy_progress_index_cache, code, (index, is_default))
         key = "trade_buy_progress_index-{}".format(code)
-        self.__getRedis().setex(key, tool.get_expire(), json.dumps((index, is_default)))
+        RedisUtils.setex_async(self.__db, key, tool.get_expire(), json.dumps((index, is_default)))
         # 杩斿洖鏁版嵁涓庢洿鏂版椂闂�
 
     def __get_buy_progress_index(self, code):
         key = "trade_buy_progress_index-{}".format(code)
-        val = self.__getRedis().get(key)
+        val = RedisUtils.get(self.__get_redis(), key)
         if val is None:
             return None, True
         val = json.loads(val)
         return int(val[0]), bool(val[1])
 
+    def __get_buy_progress_index_cache(self, code):
+        cache_result = tool.CodeDataCacheUtil.get_cache(self.buy_progress_index_cache, code)
+        if cache_result[0]:
+            return cache_result[1]
+        return None, True
+
     # 鏈�杩戠殑闈炴定鍋滀拱1鐨勬椂闂�
     def __save_latest_not_limit_up_time(self, code, time_str):
         key = "latest_not_limit_up_time-{}".format(code)
-        self.__getRedis().setex(key, tool.get_expire(), time_str)
+        RedisUtils.setex(self.__get_redis(), key, tool.get_expire(), time_str)
 
     def __get_latest_not_limit_up_time(self, code):
         key = "latest_not_limit_up_time-{}".format(code)
         if not constant.TEST:
-            return self.__getRedis().get(key)
+            return RedisUtils.get(self.__get_redis(), key)
         return None
 
     # 淇濆瓨鏁版嵁,杩斿洖淇濆瓨鏁版嵁鐨勬潯鏁�
@@ -145,12 +182,25 @@
 
     # 鑾峰彇鎴愪氦杩涘害绱㈠紩
     def get_traded_index(self, code):
-        index, is_default = self.__get_buy_progress_index(code)
+        index, is_default = self.__get_buy_progress_index_cache(code)
         return index, is_default
 
-    def set_traded_index(self, code, index):
+    # 璁剧疆浜ゆ槗杩涘害
+    def set_traded_index(self, code, index, total_datas = None):
+        last_info = self.latest_buy_progress_index_cache.get(code)
+        if not last_info or last_info[0] != index:
+            if last_info:
+                val = total_datas[last_info[0]]['val']
+                rate = round(val["num"] * float(val["price"]) * 100 / (time.time() - last_info[1]))
+                # 鎴愪氦閫熺巼
+                self.trade_speed_cache[code] = rate
+            self.latest_buy_progress_index_cache[code] = (index, time.time())
         self.__save_buy_progress_index(code, index, False)
 
+    # 鑾峰彇鎴愪氦閫熺巼
+    def get_trade_speed(self, code):
+        return self.trade_speed_cache.get(code)
+
 
 if __name__ == '__main__':
     a = [1, 2, 3, 4]

--
Gitblit v1.8.0