ARTS打卡第十二周

M-LAG技术原理 M-LAG技术原理、应用场景、技术优势。 简介: M-LAG:就是跨设备链路聚合组,是一种实现跨设备链路聚合的机制。 将两台接入交换机以同一个状态和被接入的设备进行链路聚合协商,从而把链路可靠性从单板级别提升到设备级别,组成双活系统。 名词解释 DFS group:动态交换服务组,用于MLAG之间配对,用于进行MLAG双归设备之间的接口状态,表项等进行同步。 peer-link:是一条直连必须聚合的链路,用于交换协商报文及传输部分流量。 技术原理: MLAG建立过程(画图) DFS Group配对:当两台 阅读详情

Algorithm:141. 环形链表
https://leetcode-cn.com/problems/linked-list-cycle/submissions/

给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

进阶:
你能用 O(1)(即,常量)内存解决此问题吗?

解法一:用hashSet缓存遍历过的节点,遇到相同节点表示有环。时间复杂度O(n),空间复杂度O(n)

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet<>();
        
        while(head != null) {
            if(set.contains(head))
                return true;
            
            set.add(head);
            head = head.next;
        }
        return false;
    }
}

解法二(进阶):将遍历过的节点指向一个特殊节点,最后如果又回到这个特殊节点,就表示有环。时间复杂度O(n),空间复杂度O(1).
这个算法的弊端是破话了原链表。

    public boolean hasCycle(ListNode head) {
        ListNode special = new ListNode(-1);
        ListNode p = head;
        ListNode q = head == null ? null : head.next;
        
        while(q != null && q != special)  {
            p.next = special;
            p = q;
            q = q.next;
        }
        
        return q == special;
    }

解法三(进阶):快慢指针,快指针比慢指针多移动一步,如果有环,最终快指针会追上慢指针。时间复杂度O(n),空间复杂度O(1).

    public boolean hasCycle(ListNode head) {
        ListNode fast = head == null ? null : head.next;
        ListNode slow = head;
        
        while(fast != null && fast != slow) {
            if(fast.next == null)
                return false;
            fast = fast.next.next;
            slow = slow.next;
        }
        return fast != null && fast == slow;
    }

Review: What Is MLAG Networking?

原文链接:http://www.fiber-optic-cable-sale.com/mlag-networking-wiki.html

MLAG,全称是Multi-Chassis Link Aggregation Group(多机架链路聚合组),是一种链路聚合技术,Juniper将其称为MC-LAG,Cisco将其称为mLACP 。

MLAG既可以增加带宽,又可以增强可靠性。MLAG从LAG发展而来,但相比于LAG的链路冗余,MLAG提供节点级别的冗余;相比于STP(Spanning Tree Protocol),HA MLAG不需要浪费端口就能防止拓扑环路。

参考资料:
https://en.wikipedia.org/wiki/MC-LAG
详解交换机虚拟化技术VRRP、堆叠、M-LAG及其区别-信锐技术

Tip: 使用Jersey的Response返回JDK自带数据类型的集合

例如,我们想返回一个String类型的list。

List<String> stringList = Arrays.asList("a", "b", "c");

比较方便的做法是用一个POJO类型包装一下:

@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class StringListVO implements Serializable {
    private List<String> data;
}

#然后在代码里直接返回这个POJO对象
StringListVO stringListVO = new StringListVO();
stringListVO.setData(stringList);
return ResponseUtil.success(stringListVO);

这种做法有一个坑要注意,就是POJO类不能定义有参构造方法,否则就会抛出MessageBodyWriter not found 异常

一些尝试

我们无法直接将List<String> 放到Response的entity里,也就是说像下面的写法都是不行的,都会抛出MessageBodyWriter not found 异常:

#写法一:
return Response.ok(stringList).build();
#写法二:
GenericEntity<List<String>> entity = new GenericEntity<List<String>>(stringList){};
return Response.ok(entity).build();

如果是`String[]`数组,将其直接放到Response里,是可以的,只不过显示效果是这样的:
[
	{
		"type": "string",
		"value": "a"
	},
	{
		"type": "string",
		"value": "b"
	},
	{
		"type": "string",
		"value": "c"
	},		
]

如果我们想把StringListVO搞得更通用一些,定义成范型,就像这样:

@Data
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ListVO<T> implements Serializable {
    private List<T> data;
}

#然后在代码里返回这个POJO对象
ListVO<T> stringListVO = new ListVO<>();
stringListVO.setData(stringList);
GenericEntity<ListVO<String>> entity = new GenericEntity<ListVO<String>>(stringListVO){};
return Response.ok(entity).build();

这样也是不行的,而且没有异常输出。

Share: 分析源码,学会正确使用 Java 线程池

https://my.oschina.net/editorial-story/blog/3107684

异常处理

  1. 通过new Thread 方式创建的线程,Runnable 接口不允许抛出异常,异常只会发送到 System.err 。可以通过设置 UncaughtExceptionHandler 来捕获异常。
  2. 通过 execute 方法提交到线程池,可以继承 ThreadPoolExecutor 重写其 afterExecute 方法处理异常。
  3. 通过 submit 方法提交到线程池,其异常只有在调用返回的 Future 的 get 方法的时候,异常才会抛出来,抛出ExecutionException异常,那么调用它的getCause方法就可以拿到最原始的异常对象了。

线程数设置

  1. CPU密集型,建议核心线程数设为CPU核数+1,最大线程数设为CPU核数*2;
  2. IO密集型,建议核心线程数设为CPU核数4,最大线程数设为CPU核数5;

如何正确关闭一个线程池

shutdown 方法优雅关闭,会拒绝新任务,但已添加到线程池的任务仍然会执行;
shutdownNow 方法立即关闭,会拒绝新任务,并丢弃已经在线程池队列中的任务,同时设置每个线程的中断标记;

建议:先调用shutdown 方法拒绝新任务,然后调用awaitTermination方法设置超时时间。当awaitTermination方法返回false时,表示超时了,此时可以尝试调用 shutdownNow 方法,这就要求提交到线程池的任务能够响应中断,做一些资源回收的工作。

线程池中的其他有用方法

prestartAllCoreThreads 是ThreadPoolExecutor 类的方法,用来预先创建所有的核心线程,避免第一次调用时创建线程的开销。
setCorePoolSize方法和setMaximumPoolSize方法,在线程池创建完毕之后更改其线程数。建议的一种临时扩容的方法:

  1. 起一个定时轮询线程(守护类型),定时检测线程池中的线程数,具体来说就是调用getActiveCount方法。
  2. 当发现线程数超过了核心线程数大小时,可以考虑将CorePoolSize和MaximumPoolSize的数值同时乘以2,当然这里不建议设置很大的线程数,因为并不是线程越多越好的,可以考虑设置一个上限值,比如50、100之类的。
  3. 同时,去获取队列中的任务数,具体来说是调用getQueue方法再调用size方法。当队列中的任务数少于队列大小的二分之一时,我们可以认为现在线程池的负载没有那么高了,因此可以考虑在线程池先前有扩容过的情况下,将CorePoolSize和MaximumPoolSize还原回去,也就是除以2。

其他注意事项

  • 线程池中的队列是共享的,所以会有很多锁。如果想提高性能,可以创建一个单线程的线程池列表,用这个线程池列表来实现多线程,这就是Netty EventLoop的思路。也可以使用Disruptor。

  • 任何情况下都不应该使用可伸缩线程池(线程的创建和销毁开销是很大的),这个似乎有些绝对,但绝大多数情况下是不应该用的。典型例子就是 Executors.newCachedThreadPool,线程数量不可控,创建和销毁开销大,这种线程池应该用在使用频率很低并且性能不敏感的场景,且最好自定义线程数量。

  • 任何情况下都不应该使用无界队列,单测除外。有界队列常用的有ArrayBlockingQueue和LinkedBlockingQueue,前者基于数组实现,后者基于链表。从性能表现上来看,LinkedBlockingQueue的吞吐量更高但是性能并不稳定,实际情况下应当使用哪一种建议自行测试之后决定。顺便说一句,Executors的newFixedThreadPool采用的是LinkedBlockingQueue。

  • 推荐自行实现RejectedExecutionHandler,JDK自带的都不是很好用,你可以在里面实现自己的逻辑。如果需要一些特定的上下文信息,可以在Runnable实现类中添加一些自己的东西,这样在RejectedExecutionHandler中就可以直接使用了

别再为3D抓取发愁了!Halcon手眼标定保姆级教程(Eye-to-Hand模式,含完整代码) 本文提供Halcon手眼标定的保姆级教程,详细讲解Eye-to-Hand模式下的3D抓取实现方法。从硬件配置、坐标系系统到标定流程和核心算法,涵盖完整代码和实战经验,帮助用户快速掌握工业自动化中的精准抓取技术。 阅读详情

相关推荐

Android Qcom USB Driver学习(五)

在前面的第二期中,我们知道一些非标的USB的充电类型Floatingcharger,其具有和普通DCP相似的大电流能力,但在最初检测的时候会限制Inputcurrentlimit到100mA,来进行检测是否是SDP类型,所以要支持大电流输入就需要进行vote操作,前面的几篇都有涉及,所以本文学习一下pmicusbcharger都相关的vote机制。...

Android驱动开发 2901

华为M-LAG跨设备链路聚合技术理论讲解

M-LAG(Muntichassis Link Aggregation Group)跨设备链路聚合组,将不同设备上的不同端口组成一个聚合组,达到跟普通LAG一样的功能,主要应用场景是“双归接入”场景,即用户侧双归接入到两台设备上对于下游设备来说,认为上游设备是一台设备。

m0_49864110的博客 3万+

C#海康威视摄像头控制,将IntPtr转换成Bitmap图片

C#通过skd控制海康威视摄像头,获取bitmap格式图片

ReflexMechanism的博客 6586

M-LAG原理描述

M-LAG理论基础 定义: M-LAG(Multichassis Link Aggregation Group)即跨设备链路聚合组,是一种实现跨设备链路聚合的机制,将一台设备与另外两台设备进行跨设备链路聚合,从而把链路可靠性从单板级提高到了设备级,组成双活系统。 目的: M-LAG作为一种跨设备链路聚合的技术,除了具备增加带宽、提高链路可靠性、负载分担的优势外,还具备以下优势: 1)、更高的可靠性:把链路可靠性从单板级提高到了设备级。 2)、简化组网及配置:可以将M-LAG理解为一种横向虚拟化技术,将双归接

weixin_51045259的博客 1万+

MCP协议桥接AdsPower:AI原生时代的浏览器自动化新范式

浏览器自动化是Web开发和数据采集领域的核心技术,其核心原理是通过程序控制浏览器内核执行页面导航、元素交互和数据提取等操作。传统方案如Selenium和Playwright虽功能强大,但在管理多实例、指纹隔离等复杂场景下,配置和维护成本较高。随着AI原生应用的发展,Model Context Protocol(MCP)作为一种标准化协议,为AI助手与外部工具间的通信提供了统一接口,显著提升了自动化流程的构建效率和自然语言交互能力。通过MCP Server桥接AdsPower指纹浏览器的本地API,开发者可将

weixin_30552811的博客 296

UVM(5)-TLM通信

TLM是一种基于事务 (transaction) 的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。

2301_76431006的博客 2106

交换设备横向虚拟化---M-LAG技术

一、基础概念 M-LAG定义: 跨设备链路聚合组(Multi-Chassis Link Aggregation - (M-LAG)) 通过M-LAG跨设备链路聚合的机制,能够实现多台设备间的链路聚合,从而把链路可靠性提高到了设备级,组成双活系统。 M-LAG特点与优势: 1)、更高的可靠性:把链路可靠性从单板级提高到了设备级。 2)、简化组网及配置:可以将M-LAG理解为一种横向虚拟化技术,将双归接入的两台设备在逻辑上虚拟成一台设备。M-LAG提供了一个没有环路的二层拓扑同时实现冗余备份,不再需要.

mukouping82的博客 4888

基于MediaPipe的智能俯卧撑计数与姿势矫正系统

在现代健身和体能训练中,俯卧撑是最基础也是最有效的自重训练动作之一。然而,许多人在进行俯卧撑训练时常常存在姿势不正确、计数不准确等问题。本文将介绍如何利用计算机视觉和姿态估计技术,开发一个智能的俯卧撑计数与姿势矫正系统。

qq_36224726的博客 916

M-LAG的配置与使用

M-LAG的配置与使用

Caiden_Young的博客 4994

避坑指南:RK3576+Android14适配移远5G模组(RG200U)时,我遇到的3个‘巨坑’及解决方案

本文详细记录了RK3576芯片适配Android14系统与移远RG200U 5G模组过程中遇到的三大技术难题:RIL服务启动失败、HIDL兼容性矩阵配置错误及ttyUSB权限冲突。通过实战案例提供了动态库拷贝、HIDL版本链声明和SELinux策略调整等解决方案,帮助开发者高效完成5G模组集成,特别适用于基于kernel6.1的嵌入式开发场景。

weixin_30664051的博客 390

Java语音革命:用代码打造永不疲倦的AI客服,让客户支持效率飙升300%!

客户支持领域常面临“薛定谔困境”,即无法预知客户来电的意图是投诉还是表扬。通过Java技术,尤其是语音识别和自然语言处理(NLP),可以有效解决这一问题。文章展示了如何利用Java代码构建“声纹量子引擎”,实现客户支持的自动化。核心技术包括录音与预处理、语音识别和语义理解。通过百度AI API和Stanford NLP,系统能够快速、准确地识别客户语音并理解其意图。数据表明,优化后的AI处理时间从15分钟缩短至18秒,语音识别准确率提升至98.5%,并发处理能力达到单实例1000+请求。这些技术显著提升了客

墨夶的博客 1035

ARTS挑战打卡第十二周

Algorithm-一周至少一道算法题Review-阅读并点评至少一篇英文技术文章Tip-学习至少一个技术技巧,总结和归纳在日常工作中所遇到的知识点Share-分享一篇有观点和思考的技术...

yipiankongbai的专栏 345

【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果(2025/12/11补充)

如果我们视角移动转向,武器如果不跟着进行摇摆,会感觉我们的动作很生硬,特别是射击类游戏,如下实现武器摇摆这里主要分享两种实现方法,一种是改变武器位置,一种是修改武器旋转想要使用哪种方法都可以,看你自己喜欢,如果是我,我会选择第二种,比较简单,参数也少,而且个人感觉效果也更好,已枪中心做旋转更符合现实。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1470

ARTS第十二周打卡

1.Algorithm   https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-by-leetcode/ 2.Review   3.Tip  https://blog.youkuaiyun.com/qq_35619711/article/details/72233011 cookie 和sessi...

diaozuo6485的博客 130

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《左耳听风》-ARTS-打卡记录-第十二周

Algorithm 350. 两个数组的交集 II 这次查看了官方的做法,原来采用了哈希表的方法,真是很巧妙啊. class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { if (0 == num...

Stephen___Qin的博客 590

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ARTS打卡第十二周(2021.3.27)

Algorithm 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输入 [1,2,4,7,11,15],15 返回值 [4,11] 代码 import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {

weixin_41122292的博客 178

ARTS第七周打卡

ARTS打卡是陈皓(左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。

小陈的博客 941

ARTS打卡第2周

ARTS打卡第2周Algorithm解法一解法二ReviewTipsShare Algorithm 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 解法一 使用双重循环去遍历数组和其后元素,若遇相等,则返回元素,时间复杂度为O(N^2)。 c...

sinat_36182436的博客 1437

ARTS挑战打卡的100天,我学到了这些

前言知道ARTS打卡计划是来源于陈皓的极客时间教程。在大学期间就知道了陈皓,左耳朵耗子,骨灰级程序员,差不多就是看着他的博客成长。后来在极客时间上发现了他的课程,就买下来了。现在学习了7...

yipiankongbai的专栏 995

ARTS第五周打卡

ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。

小陈的博客 552

ARTS第六周打卡

ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。

小陈的博客 975

ARTS 打卡 第一周,初试ARTS

写到这里,本次的内容分享就基本接近尾声,总体来讲用一周的业余时间来分别研究这4件事情,然后在一周的最后做一个总结,这是一个非常不错的方式,而且也可以帮助自己养成正确的学习习惯,尤其是可以帮助初入职场的开发者树立正确的学习观。经过四件事情的逐一完成,可以逐渐提升自己的编程思维,也可以让自己在潜移默化中不断进步成长!让我们下周见!

全沾软贱开发攻城狮 1万+

ARTS 打卡 第四周,游刃有余

时间过得好快,已经到了第四周学习打卡环节,也是本次活动的最后一周。认识三掌柜的想必都知道,我持续创作技术博客已经有6年时间了,固定每个月发布不少于6篇博文。同时,自己作为一名热爱分享的开发者,像ARTS这样的活动自然少不了我。由于我是打算挤在一起分享,之前都是做了本地文档记录,所以直接把内容整合起来即可,那么接下来就开启我的第四周打卡咯。

全沾软贱开发攻城狮 1万+

ARTS第三周打卡

ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。

小陈的博客 875

ARTS第四周打卡

ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。

小陈的博客 1541
上一篇: 如何批量删除docker中tag为<none>的镜像
下一篇: ARTS打卡第十三周
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值