# 工具函數 API
Redis Toolkit 提供多種實用工具函數和異常類別。
# 序列化函數
# serialize_value()
def serialize_value(
value: Any,
serializer: str = 'auto'
) -> bytes:
"""
序列化值為二進制數據
參數:
value: 要序列化的值
serializer: 序列化器類型 ('auto', 'json', 'pickle')
返回:
bytes: 序列化後的數據
異常:
SerializationError: 序列化失敗時
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# deserialize_value()
def deserialize_value(
data: bytes,
default: Any = None
) -> Any:
"""
反序列化二進制數據
參數:
data: 要反序列化的數據
default: 反序列化失敗時的默認值
返回:
反序列化後的值
異常:
SerializationError: 反序列化失敗且未提供默認值時
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用示例
from redis_toolkit.utils import serialize_value, deserialize_value
# 自動選擇序列化器
data = {'name': 'Alice', 'age': 30}
serialized = serialize_value(data) # 使用 JSON
# 指定序列化器
import numpy as np
array = np.array([1, 2, 3, 4, 5])
serialized = serialize_value(array, serializer='pickle')
# 反序列化
restored = deserialize_value(serialized)
# 使用默認值
restored = deserialize_value(b'invalid_data', default={})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 重試裝飾器
# simple_retry()
def simple_retry(
max_attempts: int = 3,
delay: float = 1.0,
backoff: float = 2.0,
exceptions: Tuple[Type[Exception], ...] = (Exception,)
):
"""
簡單重試裝飾器
參數:
max_attempts: 最大重試次數
delay: 初始延遲時間(秒)
backoff: 延遲時間倍數
exceptions: 要捕獲的異常類型
使用:
@simple_retry(max_attempts=3, delay=1.0)
def unstable_operation():
# 可能失敗的操作
pass
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# with_retry()
def with_retry(
func: Callable,
max_attempts: int = 3,
delay: float = 1.0,
backoff: float = 2.0,
exceptions: Tuple[Type[Exception], ...] = (Exception,)
) -> Any:
"""
使用重試執行函數
參數:
func: 要執行的函數
max_attempts: 最大重試次數
delay: 初始延遲時間
backoff: 延遲時間倍數
exceptions: 要捕獲的異常類型
返回:
函數執行結果
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用示例
from redis_toolkit.utils import simple_retry, with_retry
import random
# 使用裝飾器
@simple_retry(max_attempts=3, delay=0.5)
def fetch_data():
if random.random() < 0.7:
raise ConnectionError("網絡錯誤")
return "數據"
# 直接調用
result = fetch_data()
# 使用函數形式
def unstable_task():
if random.random() < 0.5:
raise ValueError("隨機錯誤")
return "成功"
result = with_retry(
unstable_task,
max_attempts=5,
delay=1.0,
exceptions=(ValueError,)
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 驗證工具
# validate_key()
def validate_key(key: str, max_length: int = 512) -> None:
"""
驗證 Redis 鍵名
參數:
key: 要驗證的鍵名
max_length: 最大長度
異常:
ValidationError: 鍵名無效時
"""
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# validate_value_size()
def validate_value_size(
value: Any,
max_size: int = 10 * 1024 * 1024
) -> None:
"""
驗證值的大小
參數:
value: 要驗證的值
max_size: 最大大小(字節)
異常:
ValidationError: 值太大時
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用示例
from redis_toolkit.utils import validate_key, validate_value_size
# 驗證鍵名
try:
validate_key("user:123:profile")
validate_key("a" * 1000) # 太長
except ValidationError as e:
print(f"鍵名無效: {e}")
# 驗證值大小
large_data = {"data": "x" * 1000000}
try:
validate_value_size(large_data, max_size=500000)
except ValidationError as e:
print(f"值太大: {e}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 連接池管理
# pool_manager
全域連接池管理器實例。
from redis_toolkit import pool_manager
# 配置連接池
pool_manager.configure_pool(
'default',
host='localhost',
port=6379,
max_connections=50
)
# 獲取連接池
pool = pool_manager.get_pool('default')
# 清理連接池
pool_manager.cleanup_pool('default')
# 清理所有連接池
pool_manager.cleanup_all()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 異常類別
# RedisToolkitError
所有 Redis Toolkit 異常的基類。
class RedisToolkitError(Exception):
"""Redis Toolkit 基礎異常類"""
1
2
2
# SerializationError
序列化相關錯誤。
class SerializationError(RedisToolkitError):
"""序列化錯誤"""
1
2
2
# ValidationError
驗證相關錯誤。
class ValidationError(RedisToolkitError):
"""驗證錯誤"""
1
2
2
# ConnectionPoolError
連接池相關錯誤。
class ConnectionPoolError(RedisToolkitError):
"""連接池錯誤"""
1
2
2
# SubscriberError
訂閱者相關錯誤。
class SubscriberError(RedisToolkitError):
"""訂閱者錯誤"""
1
2
2
# 異常處理示例
from redis_toolkit import RedisToolkit
from redis_toolkit.exceptions import (
RedisToolkitError,
SerializationError,
ValidationError,
ConnectionPoolError
)
toolkit = RedisToolkit()
try:
# 可能出錯的操作
toolkit.set('key', complex_object)
except SerializationError as e:
print(f"無法序列化對象: {e}")
except ValidationError as e:
print(f"驗證失敗: {e}")
except ConnectionPoolError as e:
print(f"連接池錯誤: {e}")
except RedisToolkitError as e:
print(f"Redis Toolkit 錯誤: {e}")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 輔助函數
# get_redis_info()
獲取 Redis 服務器信息。
def get_redis_info(client: Redis) -> Dict[str, Any]:
"""
獲取 Redis 服務器信息
參數:
client: Redis 客戶端
返回:
服務器信息字典
"""
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# format_bytes()
格式化字節大小。
def format_bytes(size: int) -> str:
"""
格式化字節大小為人類可讀格式
參數:
size: 字節大小
返回:
格式化的字符串(如 "1.5 MB")
"""
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 使用示例
from redis_toolkit.utils import get_redis_info, format_bytes
# 獲取服務器信息
info = get_redis_info(toolkit.client)
print(f"Redis 版本: {info['redis_version']}")
print(f"已用內存: {format_bytes(info['used_memory'])}")
# 格式化大小
size = 1536000 # 字節
print(format_bytes(size)) # "1.5 MB"
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 最佳實踐
- 錯誤處理:始終捕獲特定的異常類型
- 重試策略:合理設置重試次數和延遲
- 驗證:在存儲前驗證數據
- 序列化:選擇適合的序列化器
- 連接池:使用全域連接池管理器
# 相關文檔
← 配置 API