mdbq 4.0.110__tar.gz → 4.0.111__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mdbq might be problematic. Click here for more details.
- {mdbq-4.0.110 → mdbq-4.0.111}/PKG-INFO +1 -1
- mdbq-4.0.111/mdbq/__version__.py +1 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/redis/redis_cache.py +105 -6
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq.egg-info/PKG-INFO +1 -1
- mdbq-4.0.110/mdbq/__version__.py +0 -1
- {mdbq-4.0.110 → mdbq-4.0.111}/README.txt +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/auth/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/auth/auth_backend.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/auth/rate_limiter.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/js/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/js/jc.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/log/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/log/mylogger.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/myconf/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/myconf/myconf.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/mysql/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/mysql/deduplicator.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/mysql/mysql.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/mysql/s_query.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/mysql/unique_.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/mysql/uploader.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/other/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/other/download_sku_picture.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/other/error_handler.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/other/otk.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/other/pov_city.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/other/ua_sj.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/pbix/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/redis/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/redis/getredis.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/route/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/route/analytics.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/route/monitor.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/route/routes.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/selenium/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/selenium/get_driver.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq/spider/__init__.py +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/setup.cfg +0 -0
- {mdbq-4.0.110 → mdbq-4.0.111}/setup.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
VERSION = '4.0.111'
|
|
@@ -73,6 +73,64 @@ class MySQLDataEncoder(json.JSONEncoder):
|
|
|
73
73
|
return super().default(obj)
|
|
74
74
|
|
|
75
75
|
|
|
76
|
+
class SmartTTLConfig:
|
|
77
|
+
"""智能TTL配置策略"""
|
|
78
|
+
|
|
79
|
+
# TTL策略映射表(秒)
|
|
80
|
+
TTL_STRATEGIES = {
|
|
81
|
+
# 数据库相关缓存
|
|
82
|
+
'sycm_database': 1800, # 数据库列表:30分钟
|
|
83
|
+
'sycm_tables': 1200, # 表列表:20分钟
|
|
84
|
+
'sycm_table_data': 300, # 表数据:5分钟
|
|
85
|
+
|
|
86
|
+
# 用户会话相关
|
|
87
|
+
'user_session': 3600, # 用户会话:1小时
|
|
88
|
+
'user_info': 1800, # 用户信息:30分钟
|
|
89
|
+
|
|
90
|
+
# 静态配置
|
|
91
|
+
'static_config': 86400, # 静态配置:24小时
|
|
92
|
+
'system_config': 43200, # 系统配置:12小时
|
|
93
|
+
|
|
94
|
+
# API相关
|
|
95
|
+
'api_response': 600, # API响应:10分钟
|
|
96
|
+
'api_cache': 900, # API缓存:15分钟
|
|
97
|
+
|
|
98
|
+
# 临时数据
|
|
99
|
+
'temp_data': 300, # 临时数据:5分钟
|
|
100
|
+
'short_cache': 60, # 短期缓存:1分钟
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@classmethod
|
|
104
|
+
def get_ttl(cls, namespace: str, default: int = 3600) -> int:
|
|
105
|
+
"""
|
|
106
|
+
根据命名空间获取对应的TTL值
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
namespace: 缓存命名空间
|
|
110
|
+
default: 默认TTL值(秒)
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
int: TTL值(秒)
|
|
114
|
+
"""
|
|
115
|
+
return cls.TTL_STRATEGIES.get(namespace, default)
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def add_strategy(cls, namespace: str, ttl: int):
|
|
119
|
+
"""
|
|
120
|
+
添加新的TTL策略
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
namespace: 命名空间
|
|
124
|
+
ttl: TTL值(秒)
|
|
125
|
+
"""
|
|
126
|
+
cls.TTL_STRATEGIES[namespace] = ttl
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def get_all_strategies(cls) -> Dict[str, int]:
|
|
130
|
+
"""获取所有TTL策略"""
|
|
131
|
+
return cls.TTL_STRATEGIES.copy()
|
|
132
|
+
|
|
133
|
+
|
|
76
134
|
class CacheConfig:
|
|
77
135
|
"""缓存系统配置类"""
|
|
78
136
|
|
|
@@ -98,6 +156,10 @@ class CacheConfig:
|
|
|
98
156
|
self.max_value_size = 1024 * 1024 # 1MB
|
|
99
157
|
self.batch_size = 100
|
|
100
158
|
|
|
159
|
+
# 热点键配置
|
|
160
|
+
self.max_hot_keys = 1000 # 最大热点键数量
|
|
161
|
+
self.hot_keys_cleanup_threshold = 800 # 热点键清理阈值
|
|
162
|
+
|
|
101
163
|
# MySQL数据库配置
|
|
102
164
|
self.db_name = db_name
|
|
103
165
|
self.table_name = table_name
|
|
@@ -254,6 +316,20 @@ class SmartCacheSystem:
|
|
|
254
316
|
"""记录热点键"""
|
|
255
317
|
cache_key = self._generate_cache_key(key, namespace)
|
|
256
318
|
with self.hot_keys_lock:
|
|
319
|
+
# 检查是否需要清理热点键(防止内存泄漏)
|
|
320
|
+
if len(self.hot_keys) >= self.config.hot_keys_cleanup_threshold:
|
|
321
|
+
# 保留访问次数最高的键,移除访问次数最少的键
|
|
322
|
+
sorted_keys = sorted(self.hot_keys.items(), key=lambda x: x[1], reverse=True)
|
|
323
|
+
# 保留前600个热点键,为新键留出空间
|
|
324
|
+
self.hot_keys = dict(sorted_keys[:600])
|
|
325
|
+
|
|
326
|
+
self.logger.info("热点键内存清理", {
|
|
327
|
+
'清理前数量': len(sorted_keys),
|
|
328
|
+
'清理后数量': len(self.hot_keys),
|
|
329
|
+
'清理阈值': self.config.hot_keys_cleanup_threshold
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
# 记录或更新热点键访问次数
|
|
257
333
|
self.hot_keys[cache_key] = self.hot_keys.get(cache_key, 0) + 1
|
|
258
334
|
|
|
259
335
|
def get(self, key: str, namespace: str = "", default=None) -> Any:
|
|
@@ -290,12 +366,15 @@ class SmartCacheSystem:
|
|
|
290
366
|
return default
|
|
291
367
|
|
|
292
368
|
def set(self, key: str, value: Any, ttl: int = None, namespace: str = "") -> bool:
|
|
293
|
-
"""设置缓存值"""
|
|
369
|
+
"""设置缓存值 - 支持智能TTL策略"""
|
|
294
370
|
start_time = time.time()
|
|
295
371
|
|
|
296
372
|
try:
|
|
297
373
|
cache_key = self._generate_cache_key(key, namespace)
|
|
298
|
-
|
|
374
|
+
|
|
375
|
+
# 使用智能TTL策略
|
|
376
|
+
if ttl is None:
|
|
377
|
+
ttl = SmartTTLConfig.get_ttl(namespace, self.config.default_ttl)
|
|
299
378
|
|
|
300
379
|
# 序列化值
|
|
301
380
|
if isinstance(value, (dict, list, tuple)):
|
|
@@ -313,6 +392,15 @@ class SmartCacheSystem:
|
|
|
313
392
|
response_time = (time.time() - start_time) * 1000
|
|
314
393
|
|
|
315
394
|
self._record_operation('sets', response_time)
|
|
395
|
+
|
|
396
|
+
# 记录TTL策略使用情况
|
|
397
|
+
if namespace and ttl != self.config.default_ttl:
|
|
398
|
+
self.logger.debug("使用智能TTL策略", {
|
|
399
|
+
'namespace': namespace,
|
|
400
|
+
'ttl': ttl,
|
|
401
|
+
'key': key[:50] + "..." if len(key) > 50 else key
|
|
402
|
+
})
|
|
403
|
+
|
|
316
404
|
return bool(result)
|
|
317
405
|
|
|
318
406
|
except Exception as e:
|
|
@@ -532,12 +620,23 @@ class SmartCacheSystem:
|
|
|
532
620
|
self.logger.error(f"提交统计数据到MySQL失败: {e}")
|
|
533
621
|
|
|
534
622
|
def _cleanup_hot_keys(self):
|
|
535
|
-
"""
|
|
623
|
+
"""清理热点键统计 """
|
|
536
624
|
with self.hot_keys_lock:
|
|
537
|
-
|
|
538
|
-
|
|
625
|
+
current_count = len(self.hot_keys)
|
|
626
|
+
|
|
627
|
+
# 如果热点键数量超过最大限制,进行清理
|
|
628
|
+
if current_count > self.config.max_hot_keys:
|
|
629
|
+
# 保留访问次数最高的键
|
|
539
630
|
sorted_keys = sorted(self.hot_keys.items(), key=lambda x: x[1], reverse=True)
|
|
540
|
-
|
|
631
|
+
# 保留80%的热点键
|
|
632
|
+
keep_count = int(self.config.max_hot_keys * 0.8)
|
|
633
|
+
self.hot_keys = dict(sorted_keys[:keep_count])
|
|
634
|
+
|
|
635
|
+
self.logger.info("定期热点键清理", {
|
|
636
|
+
'清理前数量': current_count,
|
|
637
|
+
'清理后数量': len(self.hot_keys),
|
|
638
|
+
'保留比例': '80%'
|
|
639
|
+
})
|
|
541
640
|
|
|
542
641
|
def _cleanup_expired_mysql_data(self):
|
|
543
642
|
"""清理过期的MySQL统计数据"""
|
mdbq-4.0.110/mdbq/__version__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
VERSION = '4.0.110'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|