RabbitMQ 工作队列

每日一句

如果你执意追逐我的幻影,迟早会被真正的我打败。

https://www.ylcoder.top/post/1649241412

概述

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,我们可以在安排任务之后再执行。

我们把任务封装为消息并将其发送到队列,在后台运行的工作进程将弹出任务,并最终执行作业。

当有多个工作线程时,这些工作线程将一起处理这些任务。

轮询分发消息

在这里案例中我们会启动两个工作线程,一个消息发送线程

源码:https://github.com/yltrcc/rabbitmq-demo/tree/master/demo2/src/main/java/com/yltrcc/demo

不公平分发

轮询分发在某些场景下并不是很好。

例子:比如有两个消费者在处理任务,其中有1个消费者1处理任务非常快,另外一个消费者2处理速度很慢。

这个时候采用轮询分发,速度快的消费者1很大部分时间处于空闲状态,处理慢的消费者2一直在处理。

这种情况下其实不太好,但是RabbitMQ不知道,它依然很公平的进行分发。

为了避免这种情况,我们可以设置参数

RabbitMQ 工作队列

它的意思是: 这个任务我还没有处理完或者我还没有应答你,你先别分配给我,我目前只能处理一个任务,然后RabbitMQ就会把任务分配给没有那么忙的那个空闲消费者。

当然如果所有的消费者都没有完成手上的任务,队列还在不停的添加新任务, 队列有可能就会遇到队列被撑满的情况,这个时候就只能添加新的worker或者改变其他存储任务的策略。

预取值

本身消息的发送就是异步发送的,所以在任何时候,channel 上肯定不止只有一个消息另外来自消费者的手动确认本质上也是异步的。

因此这里就存在一个未确认的消息缓冲区,因此希望 开发人员能限制此缓冲区的大小,以避免缓冲区里面无限制的未确认消息问题

这个时候就可以通过使用 basic.qos 方法设置”预取计数”值 来完成的。该值定义通道上允许的未确认消息的最大数量。一旦数量达到配置的数量,
RabbitMQ 将停止在通道上传递更多消息,除非至少有一个未处理的消息被确认。

例如,假设在通道上有未确认的消息 5、6、7,8,并且通道的预取计数设置为 4,此时RabbitMQ 将不会在该通道上再传递任何消息,除非至少有一个未应答的消息被 ack。

比方说 tag=6 这个消息刚刚被确认 ACK,RabbitMQ 将会感知这个情况到并再发送一条消息。

消息应答和 QoS 预取值对用户吞吐量有重大影响。通常,增加预取将提高向消费者传递消息的速度。

面试题

String和StringBuilder、StringBuffer的区别?

String是只读字符串,String 的底层是一个 char[] 通过final关键字进行修饰,所以说它的内容是不能被改变的。
StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,
区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,
这一点可以用javap -c Test.class命令获得class文件对应的JVM字节码指令就可以看出。

Redis 怎么查看所有的key?

列出所有的key
redis> keys *

列出匹配的key
redis>keys apple*
1) apple1
2) apple2

LeetCode 3 无重复字符的最长子串

题目链接

https://leetcode-cn.com/problems/two-sum/

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例

示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示

0

题解

题解一:滑动窗口

用一个例子考虑如何在较优的时间复杂度内通过本题。

以示例一中的字符串abcabcbb为例,找出 从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。

对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:

  • 以 (a)bcabcbb 开始的最长字符串为 (abc)abcbb;
  • 以 a(b)cabcbb 开始的最长字符串为 a(bca)bcbb;
  • 以 ab(c)abcbb 开始的最长字符串为 ab(cab)cbb;
  • 以 abc(a)bcbb 开始的最长字符串为 abc(abc)bb;
  • 以 abca(b)cbb 开始的最长字符串为 abca(bc)bb;
  • 以 abcab(c)bb 开始的最长字符串为 abcab(cb)b;
  • 以 abcabc(b)b 开始的最长字符串为 abcabc(b)b;
  • 以 abcabcb(b) 开始的最长字符串为 abcabcb(b);

如果我们依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的!这里的原因在于,假设我们选择字符串中的第 k 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为 r_k。

那么当我们选择第 k+1 个字符作为起始位置时,首先从 k+1 到 r_k的字符显然是不重复的,并且由于少了原本的第 k 个字符,我们可以尝试继续增大 r_k,直到右侧出现了重复字符为止。

这样一来,我们就可以使用「滑动窗口」来解决这个问题了:

  • 我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表着上文中「枚举子串的起始位置」,而右指针即为上文中的 r_k;
  • 在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着 以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;
  • 在枚举结束后,我们找到的最长的子串的长度即为答案。

判断重复字符

在上面的流程中,我们还需要使用一种数据结构来判断 是否有重复的字符,常用的数据结构为哈希集合(即 C++ 中的 std::unordered_set,Java 中的 HashSet,Python 中的 set, JavaScript 中的 Set)。在左指针向右移动的时候,我们从哈希集合中移除一个字符,在右指针向右移动的时候,我们往哈希集合中添加一个字符。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 哈希集合,记录每个字符是否出现过
        Set occ = new HashSet();
        int n = s.length();
        // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                // 左指针向右移动一格,移除一个字符
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 不断地移动右指针
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            // 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}

复杂度分析

  • 时间复杂度:O(N)O(N),其中 NN 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。
  • 空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。在本题中没有明确说明字符集,因此可以默认为所有 ASCII 码在[0,128) 内的字符,即 ∣Σ∣=128。我们需要用到哈希集合来存储出现过的字符,而字符最多有 ∣Σ∣ 个,因此空间复杂度为O(∣Σ∣)。

你好,我是yltrcc,日常分享技术点滴,欢迎关注我:ylcoder

Original: https://www.cnblogs.com/yltrcc/p/16193152.html
Author: yltrcc
Title: RabbitMQ 工作队列

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/592637/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Effective Java 第三版——80. EXECUTORS, TASKS, STREAMS 优于线程

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    080
  • mybatis批量操作

    List类型 Mapper.java public int updateAccount(List<orderjob> orderJobs);</orderjob&…

    Java 2023年6月9日
    056
  • 线程池线程复用的原理

    前言 线程池最大的作用就是复用线程。在线程池中,经过同一个线程去执行不一样的任务,减少反复地创建线程带来的系统开销,就是线程的复用。那么线程池线程复用的原理是什么呢? 之前面试被问…

    Java 2023年6月5日
    079
  • 第2课第5节_Java面向对象编程_异常_P【学习笔记】

    摘要:韦东山android视频学习笔记 java的异常处理的原则如下: 1、我们先写一个没有对异常处理的程序,在进行除法运算的时候,除数是非零的话,运行时没有问题的,但是除数为零的…

    Java 2023年5月29日
    0103
  • Java import的作用

    可是现在问题来了,因為很多package的名称非常的长,在编程时,要使用一个类要将多个包名.类名完全写出,会让代码变得冗长,减低了简洁度。例如 显得非常麻烦,于是Sun公司就引入了…

    Java 2023年5月29日
    075
  • java 中为什么重写 equals 后需要重写 hashCode

    本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会…

    Java 2023年5月29日
    080
  • linux监控文件夹内的文件数量

    开发的时候遇到一个问题,服务器一旦重启,项目生成的文件就丢失了,感觉很莫名其妙..一开始猜测是文件流没有关闭,检查了代码,感觉没毛病.于是先看看是关机丢失了文件还是开机被删除了.下…

    Java 2023年6月16日
    080
  • Redis分布式锁实现

    Redis分布式锁实现 在分布式环境下,利用Redis实现锁机制,避免资源竞争的做法非常常见。这里探讨一下Redis分布式锁的实现方式、可能存在的问题以及适用场景。 setnx 最…

    Java 2023年6月13日
    098
  • Java基础

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    078
  • Java(12)静态字段与静态方法

    之前我们都定义的 main方法都被标记了 static修饰符,那到底是什么意思?下面我们来看看 静态字段 如果将一个字段定义为 static,每个类只有一个这样的字段。而对于非静态…

    Java 2023年6月9日
    075
  • 数据结构与算法—树的学习

    7.树和二叉树 7.1树的定义 树(Tree)是n(n>=0)个结点的 有限集 若n = 0 称为空树 若n > 0,则它满足如下两个条件 有且仅有一个特定的称为 根的…

    Java 2023年6月5日
    093
  • spring中Bean的生命周期

    1、 实例化bean:反射的方式生成对象 2、 填充bean的属性:populateBean(),进行依赖注入,这里可以扩展出循环依赖问题(三级缓存) 3、 调用aware接口相关…

    Java 2023年6月8日
    084
  • 【docker专栏7】容器自启动与守护进程停止后容器保活

    本文为大家介绍容器自启动以及docker 守护进程挂掉或者docker升级的情况下,如何保证容器服务的正常运行。主要包含三个部分 一、守护进程开机自启 在我们安装docker的时候…

    Java 2023年6月15日
    099
  • uboot常用命令及其使用

    ? 或者 help 第一次使用uboot,通过?查看所有帮助信息 ?cmd 或者 help cmd ? bootz #查看bootz命令的帮助信息 通过该命令查看某个cmd的帮助信…

    Java 2023年6月6日
    055
  • SpringCloud : URL 重定向 和 转发

    Web UI项目中, 很多 Spring controller 视图函数直接返回 html 页面, 还有一些视图函数是要重定向或转发到其他的 url 上. redirect 和 f…

    Java 2023年5月30日
    090
  • mybaitis查询 (数据库与实体类字段名不相同)

    1.这是我的数据库字段名和实体类字段名 2.方法方法一: 查询的结果标题 会跟实体类的属性一一匹配,一定要一致就算数据库字段和属性不一致,我们可以把查询结果设置一个别名,让别名=属…

    Java 2023年6月5日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球