Python脚本如何规范缓存键值命名规则

wen python案例 32

本文目录导读:

Python脚本如何规范缓存键值命名规则

  1. 基本原则
  2. 具体规范规则
  3. 实际应用示例
  4. 高级命名策略
  5. 最佳实践总结

我来详细说明Python脚本中缓存键值命名的规范规则:

基本原则

命名格式

[prefix]:[entity]:[field]:[identifier]:[version/suffix]

示例

# 通用格式
"app:user:profile:12345:v1"
"cache:product:price:67890"
"session:token:abc123"

具体规范规则

使用分隔符

# 推荐使用冒号(:)作为分隔符
KEY_TEMPLATE = "{prefix}:{entity}:{action}:{id}"
# 不推荐
"user_12345_profile"  # 使用下划线和数字混合难以解析
"user12345"           # 缺乏结构化信息

支持命名空间

class CacheKeys:
    """缓存键管理类"""
    @staticmethod
    def user_profile(user_id: int) -> str:
        return f"user:profile:{user_id}:v1"
    @staticmethod
    def product_detail(product_id: int) -> str:
        return f"product:detail:{product_id}:v2"
    @staticmethod
    def order_list(user_id: int, page: int) -> str:
        return f"user:{user_id}:orders:page:{page}"

实际应用示例

使用函数生成键

import hashlib
from typing import Optional
class CacheKeyGenerator:
    """缓存键生成器"""
    def __init__(self, prefix: str = "app"):
        self.prefix = prefix
        self.version = "v1"
    def user_key(self, user_id: int, field: str = "profile") -> str:
        """用户相关缓存键"""
        return f"{self.prefix}:user:{field}:{user_id}:{self.version}"
    def product_key(self, product_id: int) -> str:
        """产品缓存键"""
        return f"{self.prefix}:product:detail:{product_id}:{self.version}"
    def list_key(self, entity: str, filters: dict) -> str:
        """列表缓存键(根据参数生成唯一键)"""
        # 对过滤条件进行排序和哈希
        sorted_filters = sorted(filters.items())
        filter_hash = hashlib.md5(
            str(sorted_filters).encode()
        ).hexdigest()[:8]
        return f"{self.prefix}:{entity}:list:{filter_hash}:{self.version}"

使用枚举管理键名

from enum import Enum
class CacheNamespace(str, Enum):
    """缓存命名空间枚举"""
    USER = "user"
    PRODUCT = "product" 
    ORDER = "order"
    SESSION = "session"
class CacheField(str, Enum):
    """缓存字段枚举"""
    PROFILE = "profile"
    DETAIL = "detail"
    LIST = "list"
    TOKEN = "token"
class CacheKeys:
    """统一的缓存键生成"""
    @staticmethod
    def generate(
        namespace: CacheNamespace,
        field: CacheField,
        identifier: str,
        version: str = "v1"
    ) -> str:
        return f"{namespace.value}:{field.value}:{identifier}:{version}"
    # 使用示例
    @staticmethod
    def user_profile(user_id: int) -> str:
        return CacheKeys.generate(
            CacheNamespace.USER,
            CacheField.PROFILE,
            str(user_id)
        )

高级命名策略

版本控制

class VersionedCacheKey:
    """带版本控制的缓存键"""
    def __init__(self, prefix: str, version: int = 1):
        self.base_prefix = prefix
        self.cache_version = version
    def get_key(self, entity: str, identifier: str) -> str:
        """获取带版本的缓存键"""
        return f"{self.base_prefix}:{entity}:{identifier}:v{self.cache_version}"
    def invalidate_old_keys(self, entity: str) -> None:
        """使旧版本键失效"""
        old_version = self.cache_version - 1
        pattern = f"{self.base_prefix}:{entity}:*:v{old_version}"
        # 调用缓存删除操作
        # redis_client.delete_by_pattern(pattern)

复合键处理

from dataclasses import dataclass
from typing import Dict, Any
@dataclass
class CompositeCacheKey:
    """复合缓存键"""
    namespace: str
    entity: str
    identifiers: Dict[str, Any]
    version: str = "v1"
    def __str__(self) -> str:
        # 对标识符进行排序确保一致性
        sorted_ids = sorted(self.identifiers.items())
        id_parts = [f"{k}:{v}" for k, v in sorted_ids]
        return f"{self.namespace}:{self.entity}:" + ":".join(id_parts) + f":{self.version}"
    @classmethod
    def from_params(cls, **kwargs) -> 'CompositeCacheKey':
        """从参数创建缓存键"""
        version = kwargs.pop('_version', 'v1')
        namespace = kwargs.pop('_namespace', 'app')
        entity = kwargs.pop('_entity', 'default')
        return cls(namespace, entity, kwargs, version)
# 使用示例
key = CompositeCacheKey.from_params(
    _entity="user",
    user_id=123,
    role="admin",
    status="active",
    _version="v2"
)
print(str(key))  # app:user:role:admin:status:active:user_id:123:v2

最佳实践总结

命名规则清单

  1. 使用小写字母"user:profile:123"
  2. 使用冒号分隔"app:user:profile:123"
  3. 包含版本信息"user:profile:123:v2"
  4. 适当的长度控制:不超过128字符
  5. 避免特殊字符:只使用字母、数字、冒号

工具函数示例

import re
from typing import List
class CacheKeyValidator:
    """缓存键验证器"""
    @staticmethod
    def validate(key: str) -> bool:
        """验证缓存键格式"""
        pattern = r'^[a-z]+:[a-z]+:[a-z0-9_-]+(:[a-z0-9]+)*$'
        return bool(re.match(pattern, key))
    @staticmethod
    def parse(key: str) -> List[str]:
        """解析缓存键返回各部分"""
        return key.split(':')
    @staticmethod
    def sanitize(key_part: str) -> str:
        """清理键的某一部分"""
        # 只保留字母、数字、下划线和连字符
        return re.sub(r'[^a-z0-9_-]', '', key_part.lower())
# 使用示例
validator = CacheKeyValidator()
key = "user:profile:123:v1"
if validator.validate(key):
    parts = validator.parse(key)
    print(f"命名空间: {parts[0]}")
    print(f"实体: {parts[1]}")
    print(f"ID: {parts[2]}")
    print(f"版本: {parts[3]}")

这样的命名规则确保了缓存键的可读性、可维护性和可扩展性,同时也便于进行缓存管理和调试。

抱歉,评论功能暂时关闭!