redis zset score 精度

部署运行你感兴趣的模型镜像

1,799,999,999,999,998 16位不丢精度最大值
1,799,999,999,999,999 会变成1800000000000000
再往上会丢失最小以为精度(变0)

您可能感兴趣的与本文相关的镜像

Facefusion

Facefusion

AI应用

FaceFusion是全新一代AI换脸工具,无需安装,一键运行,可以完成去遮挡,高清化,卡通脸一键替换,并且Nvidia/AMD等显卡全平台支持

在使用 Celery 构建任务管理系统(TaskManager)时,结合 Redis 的 **ZSet(有序集合)** 可以实现更高级的任务调度功能,比如:**延迟队列、优先级队列、定时任务排序、去重和状态追踪等**。Celery 默认并不直接支持“延迟任务”或“精确控制执行时间”,但我们可以借助 Redis ZSet 来构建一个轻量级的延迟任务中间层。 --- ### ✅ 使用 Redis ZSet 实现延迟/优先级任务队列(基于 Celery 的 TaskManager) #### 🧩 核心思想: - 将需要延迟执行的任务放入 Redis 的 `ZSet` 中,score 为任务的预期执行时间戳。 - 启动一个后台进程(守护线程或独立 worker),定期轮询 ZSet,将到达执行时间的任务提交给 Celery。 - Celery 负责实际执行任务,Redis ZSet 负责“暂存 + 排序”。 --- #### 1. 安装依赖 ```bash pip install celery redis ``` --- #### 2. 完整代码示例:`task_manager_zset.py` ```python # task_manager_zset.py import time import json import threading from celery import Celery import redis # ==================== 配置 ==================== celery_app = Celery( 'task_manager', broker='redis://localhost:6379/0', backend='redis://localhost:6379/1' ) redis_client = redis.StrictRedis(host='localhost', port=6379, db=2, decode_responses=True) DELAYED_QUEUE_KEY = "delayed_tasks" # 使用 ZSet 存储延迟任务 # ==================== 延迟任务管理器 ==================== class TaskManager: """ 支持延迟、优先级的任务管理器,底层使用 Redis ZSet """ @staticmethod def schedule_task(task_name, args=None, kwargs=None, delay=None, execute_at=None, priority=0): """ 延迟执行任务(通过 Redis ZSet) :param task_name: Celery 任务名 :param args: 位置参数 :param kwargs: 关键字参数 :param delay: 延迟多少秒执行(如 delay=60) :param execute_at: 在哪个时间戳执行(Unix 时间戳) :param priority: 优先级(score 相同时按字典序排,可结合 score 微调) """ now = time.time() if execute_at is not None: score = execute_at elif delay is not None: score = now + delay else: score = now # 立即执行 task_data = { "task_name": task_name, "args": args or [], "kwargs": kwargs or {}, "scheduled_at": now, "execute_at": score } # 写入 ZSetscore 是执行时间戳 redis_client.zadd(DELAYED_QUEUE_KEY, {json.dumps(task_data): score}) print(f"✅ 已添加延迟任务: {task_name}, 执行时间: {score}") @staticmethod def _process_delayed_tasks(): """轮询 ZSet,提交到期任务到 Celery""" print("🚀 开始轮询延迟任务...") while True: now = time.time() # 获取所有已到期的任务(score <= now) tasks = redis_client.zrangebyscore(DELAYED_QUEUE_KEY, 0, now, withscores=True) for task_json, score in tasks: try: task_data = json.loads(task_json) # 提交到 Celery 异步执行 celery_app.send_task( name=task_data["task_name"], args=task_data["args"], kwargs=task_data["kwargs"] ) print(f"🔥 执行任务: {task_data['task_name']} | 参数: {task_data['args']}") except Exception as e: print(f"❌ 执行失败: {e}") finally: # 无论成功与否,从 ZSet 中移除 redis_client.zrem(DELAYED_QUEUE_KEY, task_json) # 等待 0.5 秒再检查一次 time.sleep(0.5) @staticmethod def start_scheduler_in_background(): """启动调度器为后台线程""" thread = threading.Thread(target=TaskManager._process_delayed_tasks, daemon=True) thread.start() return thread # ==================== 示例 Celery 任务 ==================== @celery_app.task(name="example.add") def add(x, y): print(f"📝 执行加法: {x} + {y} = {x + y}") return x + y @celery_app.task(name="example.notify") def notify(user_id, msg): print(f"📧 发送通知: 用户{user_id} -> {msg}") return f"Notified user {user_id}" # ==================== 启动调度器(仅主进程运行)==================== if __name__ == "__main__": # 启动延迟任务调度器 TaskManager.start_scheduler_in_background() # 示例:安排几个延迟任务 TaskManager.schedule_task("example.add", args=[2, 3], delay=3) TaskManager.schedule_task("example.add", args=[10, 20], delay=5) TaskManager.schedule_task("example.notify", kwargs={"user_id": 123, "msg": "欢迎登录"}, delay=4) print("📌 主程序运行中... 按 Ctrl+C 退出") try: while True: time.sleep(1) except KeyboardInterrupt: print("\n👋 程序退出") ``` --- ### 🔍 解释说明 | 技术点 | 作用 | |--------|------| | **Redis ZSet** | 有序存储任务,score 为执行时间戳,自动排序,便于高效查询到期任务 | | **ZADD / ZRANGEBYSCORE / ZREM** | 分别用于添加、查询、删除任务 | | **后台线程 `_process_delayed_tasks`** | 持续轮询到期任务并提交给 Celery | | **Celery `send_task`** | 动态发送任务到指定队列 | | **JSON 序列化** | 任务元数据序列化后存入 Redis | --- ### ✅ 优势 - ✅ 支持任意延迟时间(毫秒级精度取决于轮询间隔) - ✅ 天然支持任务去重(可通过唯一 ID 控制) - ✅ 可扩展为优先级队列(score = timestamp + priority_weight) - ✅ 不依赖外部复杂系统(如 RabbitMQ TTL 或专用调度器) --- ### ⚠️ 注意事项 1. **轮询延迟**:当前是每 0.5s 检查一次,若需更高精度可用更短 sleep 或改用 `sleep until next task`。 2. **单点故障**:该调度器若崩溃,未处理的延迟任务仍保留在 Redis 中,重启后可继续处理。 3. **并发安全**:多个实例运行时需避免重复消费,可通过分布式锁(如 Redis Lock)解决。 4. **持久化**:确保 Redis 开启持久化(RDB/AOF),防止断电丢失任务。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值