当前位置: 首页 > backend >正文

Redis 延迟队列

延时队列的实现可以利用Redis的有序集合(zset),其中消息被序列化为字符串并存储为zset的成员(member)。消息的到期时间被设置为zset的分数(score)。通过多个线程轮询zset以检索并处理到期的任务,保证了系统的高可用性,即使某个线程失败,其他线程也能接管处理。然而,由于存在多个线程,必须确保并发访问时任务不会被多次执行,这可能需要实现适当的并发控制机制。

一个简单的延迟队列示例:

import redis
import time
import uuid
import threading
import random# 链接 redis
r = redis.Redis(host='localhost', port=6379, db=0)def handle_task(task_id):print('handle task', task_id)def process_delay_queue():
# 开启线程后,循环去查询是否有任务存在,有则取出执行,这里有个特殊的点,就是zrem操作while True:task_list = r.zrangebyscore('delay_queue', 0, time.time())if not task_list:# 没有任务print('cost 1s')time.sleep(1)continue# 队列中有任务时,取出首个任务,然后这里用redis里的zrem# 如果将其删除后则返回 true, 若删除失败(也就是已经被删除过了,其他线程在来删除的会肯定会失败),则返回false# 这里能够保证一个任务只能被执行一次task_id = task_list[0]task = r.zrem('delay_queue', task_id) # 删除任务if task: # 防止多线程同时执行任务handle_task(task_id)if __name__ == '__main__':t = threading.Thread(target=process_delay_queue)t.start() # 开启线程for i in range(10):task_id = str(uuid.uuid4()) # 创建任务delay_time = random.randint(10,20) # 延时时间r.zadd('delay_queue', {task_id: time.time() + delay_time}) # 将任务添加到队列中

Redis的ZREM方法在多线程或多进程环境中处理任务争抢时扮演着关键角色。它的返回值表明当前实例是否成功抢到任务。由于process_delay_queue方法可能由多个线程和进程调用,同一任务可能被多个进程或线程尝试获取。通过使用ZREM,可以确保每个任务只有一个唯一的处理者。此外,确保对handle_task方法进行异常捕获是至关重要的,以防止因个别任务处理异常导致整个循环异常退出,从而维护系统的稳定性和可靠性。

http://www.xdnf.cn/news/9870.html

相关文章:

  • 【东枫科技】KrakenSDR 天线阵列设置
  • 1.测试过程之需求分析和测试计划
  • 【LeetCode 热题 100】最小路径和 / 最长回文子串 / 最长公共子序列 / 编辑距离
  • Ubuntu 中安装 PostgreSQL 及常规操作指南
  • JAVA与C语言之间的差异(二)
  • 1614. 括号的最大嵌套深度【 力扣(LeetCode) 】
  • 摩尔信使MThings无法生成机器码的解决方法
  • 腾讯云国际站性能调优
  • 【静电模拟】使用打火机的电子部分模拟手指静电
  • 机器学习-线性回归基础
  • 【Elasticsearch】suggest
  • C++17常量
  • 【Python办公】将Excel表格转json(字典)数据-可自定义key和value
  • TeleAI发布TeleChat2.5及T1正式版,双双开源上线魔乐社区!
  • 实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.6 R语言解题
  • ubuntu mysql 8.0.42 基于二进制日志文件位置和GTID主从复制配置
  • 玛哈特校平机:金属板材加工的精整专家
  • 记一次 Starrocks be 内存异常宕机
  • Ubuntu20.04操作系统ssh开启oot账户登录
  • 大数据学习(125)-hive数据分析
  • HOW - 简历和求职面试宝典(七)
  • 整数加减法测试题
  • API网关和API管理的区别
  • 【PCB工艺】绘制原理图 + PCB设计大纲:最小核心板STM32F103ZET6
  • Day39
  • remote: error: hook declined to update refs/heads.....
  • DrissionPage ChromiumPage模式:浏览器自动化的高效利器
  • 【PhysUnits】15.1 引入P1后的加一特质(add1.rs)
  • DeepSeekMath:突破开放式语言模型中数学推理能力的极限
  • 百度之星2024 初赛第一场 补给