基于Redission实现的延时队列

该博客介绍了如何利用Redission的延时队列功能和RocketMQ结合,来实现更灵活的延时订单关闭操作。在对比了不同延时队列实现方案后,选择了Redission,因为它能支持更精确的延时控制。文中详细阐述了生产者和消费者端的实现逻辑,以及内部原理,包括Redis中的数据存储结构。虽然这种方案具有高可靠性和MQ的持久化优势,但也可能面临线程数增加带来的性能影响以及数据突增可能导致的实际延迟时间延长的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于Redission实现的延时队列

背景

  • 当前业务中存在着超时关闭各种类型的订单的场景。
  • 项目里已集成了RocketMq,可以基于此实现延时队列。
  • 由于采用RocketMq实现延时队列有个缺点,那就是它不能灵活的支持各个精度的延时,只能按照事先配置好的延时级别进行。
  • 基于以上三点考虑,并在对比各种实现延时队列的方案后,决定采用Redission(项目里也有集成Redission)+ RocketMq 进行实现。

实现

几个重要的API

  • RBlockingQueue
  • RDelayedQueue

生产者
参数说明:

  • QueueEntity :业务实体,里面就是封装具体的业务数据。
public void addQueue(QueueEntity queueEntity, TimeUnit timeUnit, Long time) {
        RBlockingQueue<String> queue = redissonClient.getBlockingQueue(queueEntity.getRedisQueueEnum().getQueueKey());
        RDelayedQueue rDelayedQueue = redissonClient.getDelayedQueue(queue);
        String value = JSON.toJSONString(queueEntity);
        rDelayedQueue.offer(value, time, timeUnit);
        //释放队列
        rDelayedQueue.destroy();
      
    }

消费者
关于消费者的实现,可以在项目启动时,就开启监听:

@Component
public class QueueRunner implements CommandLineRunner {

    @Autowired
    private RDelayQueueTask rDelayQueueTask;

    @Override
    public void run(String... args) throws Exception {
        rDelayQueueTask.comsumeQueue();
    }
}

RDelayQueueTask实现:

  • RedisQueueEnum: 这个也是业务里定义的一个枚举类,存放所有需要延时操作的枚举key。
public void comsumeQueue() {
        for (RedisQueueEnum redisQueueEnum : RedisQueueEnum.values()) {
            RBlockingQueue<String> queue = redissonClient.getBlockingQueue(redisQueueEnum.getQueueKey());
            // 重新初始化一次延时队列
            // 有多少枚举就启动多少个线程进行监听
            new Thread(() -> {
                while (true) {
                    String json = null;
                    try {
                        json = queue.take();
						// 发送到MQ
                    
                    } catch (Exception e) {
                       
                        
                    }
                }
            }).start();
        }
    }

原理

图片来自:Redis延时队列,这次彻底给你整明白了
在这里插入图片描述
两个重要延时队列:

  • redisson_delay_queue:
  • redisson_delay_queue_timeout:

通过观察redis种的数据存储,可以发现前者是个list类型数据结构,后者是一个ZSet类型数据结构。

  • 在消费端启动的时候,就会订阅这redisson_delay_queue
  • 当生产者有数据offer时,redisson先把数据放到redisson_delay_queue_timeout (ZSet集合,按延时到期时间的时间戳为score排序)。
  • 同时发布内容到上面订阅的key,此时客户端进程开启一个延时任务,延时时间为发布的timeout。(HashedWheelTimer,时间轮)
  • 客户端进程的延时任务到了时间执行,从zset分页取出过了当前时间的数据,再将数据rpush到第一步的阻塞队列里。
  • 最终回调到 RBlockingQueue 的 take方法上,从而取到数据。

总结

优点:通过结合RocketMQ,基于Redission实现的延时队列会更具有可靠性。在MQ的重试机制、持久化等手段加持下,会更加可靠和可控。

缺点:随着业务规模的发展,越来越多的延时操作会导致线程数目不断增加,这里可能会有性能影响。另一方面如果某个时间点的数据突增,可能会产生一种情况,实际发送消息的时间比定好的延迟时间会更加久。

其它

有赞延时队列的实现方案
6种实现延时队列的方案

<think>嗯,用户问的是AD软件中换层的快捷键。首先,我需要确定AD指的是哪个软件。通常,AD可能指Altium Designer,这是一款常用的电子设计自动化软件,用于电路板设计。所以用户可能是在使用Altium Designer时想要快速切换层,提高工作效率。 接下来,我需要回忆或查找Altium Designer中关于层切换的快捷键。根据之前的知识,Altium Designer中确实有一些快捷键用于切换不同的层。比如,小键盘的数字键可能对应不同的层,例如1是Top Layer,2是Mid Layer 1,依此类推。不过,不同版本可能会有些差异,所以需要确认这一点是否正确。 另外,用户可能还不太清楚如何自定义这些快捷键,或者是否有其他方式快速换层。比如,使用快捷键L调出层设置面板,或者通过Preferences设置自定义快捷键。这可能是用户潜在的需求,想要更灵活地调整快捷键以适应自己的习惯。 还要考虑用户可能的操作环境,比如是否在使用英文版软件,或者是否有安装不同版本的Altium Designer,因为不同版本快捷键可能不同。此外,用户可能对层的概念不太熟悉,比如信号层、电源层、丝印层等,是否需要简要解释这些层的用途,以帮助用户更好地理解换层的意义。 另外,是否有其他相关功能,比如切换层的同时切换走线层,或者如何在多层板中快速跳转,这些也可能是用户需要的信息。比如在布线时按数字键切换层并自动添加过孔,这样的操作是否可行,需要确认正确性。 总结一下,回答需要包括: 1. 常用默认快捷键,如小键盘数字键对应各层。 2. 如何通过快捷键L打开层设置面板。 3. 自定义快捷键的方法。 4. 可能需要注意的版本差异或操作细节。 5. 简要说明层的类型和用途,帮助用户理解为何需要换层。 需要确保信息准确,避免错误,比如Altium Designer是否真的使用小键盘数字键作为默认切换层的快捷键。可能需要查阅官方文档或可靠来源确认。此外,提醒用户如果快捷键不起作用,可能需要检查键盘设置或软件版本,确保兼容性。 最后,组织回答时要结构清晰,分点说明,便于用户理解。如果有不确定的地方,建议用户参考软件帮助文档或官方资源,以确保信息的正确性。</think>在 Altium Designer(AD)中,**换层快捷键**是提高 PCB 设计效率的重要工具。以下是常用操作说明: --- ### 一、默认快捷键 1. **小键盘数字键** - 按下数字键 **1~6** 可快速切换至对应信号层(例如:1=Top Layer,2=Mid Layer 1,依此类推)。 - **+/- 键**:切换至下一层/上一层(需开启小键盘的 Num Lock)。 2. **信号层与平面层切换** - **Shift+Ctrl+鼠标滚轮**:按住后滚动滚轮可快速切换层(需按住快捷键)。 3. **特殊层快捷键** - **L**:打开层设置面板(快速启用/禁用层显示)。 - **Ctrl+Shift+G**:切换到丝印层(Top Overlay)。 - **Ctrl+Shift+M**:切换到阻焊层(Top Solder Mask)。 --- ### 二、自定义快捷键 1. 通过 **Preferences > PCB Editor > Shortcuts** 修改快捷键。 2. 搜索功能关键词(如 `Layer Next`、`Layer Previous`)绑定自定义按键。 --- ### 三、实用技巧 1. **布线时自动换层**: 布线过程中按下对应层数字键,软件会自动添加过孔并切换至目标层。 2. **层高亮显示**: 按 **Shift+S** 进入单层模式,按层数字键可快速高亮特定层。 --- ### 四、注意事项 - 不同版本快捷键可能略有差异,建议通过 **Help > Shortcuts** 确认当前版本设置。 - 若快捷键失效,检查键盘输入法或软件冲突。 如果需要更详细的层管理(如创建/删除层),可通过 **Design > Layer Stack Manager** 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

legendaryhaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值