import time
import threading

# 缓存实现说明
# 这个缓存装饰器主要用于函数缓存 ，区别于cache_page,后者是用于http的缓存。
# ​​缓存“页面”用 cache_page，缓存“数据”或“逻辑”用 cache_decorator​​。
# 主要特性
# ​​线程安全​​：使用锁机制确保多线程环境下的安全性
# ​​可配置超时​​：支持设置缓存超时时间，timeout=None表示永久缓存
# ​​自动过期​​：缓存项超时后会自动删除
# ​​基于参数的缓存​​：相同的参数会返回缓存结果，不同参数会重新计算
# 参数说明
# timeout=300：表示缓存5分钟，你可以根据业务需求调整：
# 较短的超时时间（如60秒）：适合授权信息可能频繁变化的场景
# 较长的超时时间（如3600秒）：适合授权信息相对稳定的场景
# timeout=None：永久缓存，直到程序重启


# 缓存装饰器实现
def cache_decorator(timeout=None):
    """
    缓存装饰器，支持超时时间和线程安全
    timeout: 缓存超时时间（秒），None表示永久缓存
    """
    cache = {}
    lock = threading.Lock()

    def decorator(func):

        def wrapper(*args, **kwargs):
            # 生成缓存键，基于函数名和参数
            key = (func.__name__, args, tuple(sorted(kwargs.items())))

            current_time = time.time()

            # 检查缓存是否存在且未过期
            with lock:  # 线程安全
                if key in cache:
                    result, timestamp = cache[key]
                    if timeout is None or current_time - timestamp <= timeout:
                        return result
                    else:
                        # 缓存过期，删除
                        del cache[key]

            # 执行函数获取结果
            result = func(*args, **kwargs)

            # 更新缓存
            with lock:
                cache[key] = (result, current_time)

            return result

        return wrapper

    return decorator


# 应用缓存装饰器
# @cache_decorator(timeout=300)  # 缓存5分钟，根据需求调整
