java中List对象indexOf方法失效事情的起因是在解析excel文件时,想通过这个方法返回对象对应的行号,结果出现了行号不准确的情况
示例1234567891011121314151617181920import java.util.LinkedList;import java.util.List;public class Test { static void func(List<String> list) { for (String s : list) { try { // do something System.out.println("do index: "+list.indexOf(s)+ " hashCode: " + s.hashCode()); } catch (Exception e) { Syste ...
RabbitMQ如何保证消息可靠消息传输的三个过程生产端到MQ,MQ到消息端,消费端消费掉消息,任意过程都可能导致消息传输处理失败。生产端到MQ
事务消息机制:会导致性能降低confirm消息确认机制:生产端投递消息到MQ后,MQ会发送一个确认消息给生产端。问题:MQ接收到消息并处理,但还未刚发送确认消息,或生产端由于网络问题未收到确认消息,生产端无法知道消息是否发送成功。
消息持久化:消息持久化能解决MQ突然挂掉导致内存中的消息丢失,其能让重启后的MQ通过硬盘中的数据恢复,exchange/queue/message均能进行持久化。问题:MQ接收到消息还未来得及持久化到硬盘时挂掉。解决:在发送消息之前先将消息保存到数据,增加status字段,超时时间/重发次数。新问题:MQ成功接受消息,但是确定消息机制执行失败,可能导致消息的重复发送,较为有效的方式是每条消息确定一个字段为唯一ID。
消费端也可以通过ack机制保证消息的可靠性。MQ默认在发出消息后会删除这条消息,而不管消费者是否收到或处理完成,导致消费端消息丢失时MQ也没有这条消息。增加手动ack机制即 ...
Linux的常用命令top命令描述:top命令用于实时显示系统中各个进程的资源使用情况,包括进程ID、内存使用、CPU使用等信息。它是一个动态的性能监控工具,可以帮助用户了解系统的运行状态。
常用操作:
按 q 退出。
按 k 输入进程ID以终止进程。
按 h 查看帮助。
lsof命令描述:lsof 是 “list open files” 的缩写,用于列出当前系统中被打开的文件。它可以用于查看某个端口被哪个进程占用。
示例:
lsof -i :80 查看占用80端口的进程。
lsof /path/to/file 查看哪个进程打开了指定文件。
cd命令描述:cd 是 “change directory” 的缩写,用于切换当前工作目录。
示例:
cd /home/user 切换到绝对路径 /home/user。
cd .. 返回上一级目录。
cd ~ 切换到当前用户的主目录。
ls命令描述:ls 是 “list” 的缩写,用于列出目录中的文件和子目录。
常用参数:
ls -l 显示详细信息(权限、所有者、大小、修改时间等)。
ls -a 显示所有文件,包括隐藏文件。
ls - ...
IBMMQ队列管理器队列管理器是为应用程序提供消息传递服务的程序。使用消息队列接口(MQI)的应用程序可以将消息放置到队列并可从队列中获取消息。队列管理器确保消息可以发送至正确的队列或传递至另一个队列管理器。
队列是存放消息的容器。连接至主管队列的队列管理器的业务应用程序可从队列检索消息或将消息放置到队列。
主题是描述在发布/预订消息中所发布信息的主题的字符串。作为订户,您可以指定一个主题或使用通配符指定主题范围以用于接收您所需的信息。
发布是由应用程序发送至发布/预订引擎的消息。然后,发布/预订引擎将消息发送至任何已预订接收这些消息的应用程序。
预订(官网这样叫,我就这样写吧,正常我们叫订阅吧)预订是一个记录,它包含关于订户感兴趣并希望接收关于其信息的主题的信息。因此,预订信息确定哪些发布内容会转发至订户。订户可以接收来自不同发布者的信息,并且也可以将他们接收的信息发送至其他订户。
通道IBM® MQ 可以使用三种不同类型的通道:消息通道、MQI 通道和 AMQP 通道。
消息通道消息通道是两个队列管理器之间的单向通信链路。IBM MQ 使用消息通道在队 ...
FreeRTOS简单使用迁移迁移真的遇到好多坑,最多的还是中断优先级的问题,优先级太高的中断会破坏FreeRTOS的调度,所以与FreeRTOS调度相关的中断优先级必须高于其他中断
配置在 Cortex-M 架构中,优先级数值越小,优先级越高。FreeRTOS的配置主要集中在FreeRTOSConfig.h文件中,但是感觉最重要的配置是
1234567891011121314/* configKERNEL_INTERRUPT_PRIORITY sets the priority of the tick and context * switch performing interrupts. Not supported by all FreeRTOS ports. See * https://www.freertos.org/RTOS-Cortex-M3-M4.html for information specific to * ARM Cortex-M devices. */#define configKERNEL_INTERRUPT_PRIORITY (15 &l ...
Linux常用命令,比如free strace netstat iostat top等
free:显示内存使用情况。
strace:跟踪系统调用。
netstat:显示网络连接。
iostat:显示CPU和I/O设备使用情况。
top:显示系统运行情况。
Linux子进程,fork的返回值,多线程下fork的风险和规避,子进程内存何时复制
fork:创建子进程,返回值为0表示子进程,正数表示父进程。
多线程下fork的风险:子进程只复制调用fork的线程,可能导致死锁。
规避方法:使用pthread_atfork注册处理函数。
子进程内存复制:写时复制(Copy-On-Write)。
Linux的负载 (uptime 命令查看的东东)uptime:显示系统运行时间、登录用户数、系统负载。
系统负载:表示系统的繁忙程度,通常为1分钟、5分钟、15分钟的平均负载。
性能问题定位(brpc文档有讲)使用perf、strace、gdb等工具定位性能问题。
perf:性能分析工具,分析CPU使用情况。
strace:跟踪系统调用,分析程序行为。
gdb:调试工具,分析 ...
C++多态、重载、覆写
多态:通过基类指针调用派生类方法。
重载:同名函数不同参数。
覆写:派生类重写基类虚函数。
STL的常用容器vector、list、deque、set、map、unordered_map等。
vector:动态数组,支持随机访问。
list:双向链表,支持快速插入、删除。
deque:双端队列,支持快速插入、删除。
set:有序集合,支持快速查找。
map:有序键值对集合,支持快速查找。
unordered_map:无序键值对集合,支持快速查找。
迭代器失效,如何遍历删除
迭代器失效:容器修改导致迭代器失效。
遍历删除:使用erase方法,更新迭代器。
特化与偏特化,简单了解如何使用元编程(比如使用特化和偏特化实现递归)
特化:为特定类型提供模板实现。
偏特化:为部分类型提供模板实现。
虚函数表,多继承下虚函数表指针
虚函数表:存储虚函数指针的表。
多继承:每个基类有一个虚函数表指针。
析构和构造顺序
构造顺序:基类先构造,派生类后构造。
析构顺序:派生类先析构,基类后析构。
智能指针std::unique_ptr、std::shared_pt ...
分布式负载均衡算法轮询、加权轮询、最小连接数、一致性哈希等。
轮询:按顺序将请求分配给每个服务器。
加权轮询:根据服务器权重分配请求。
最小连接数:将请求分配给连接数最少的服务器。
一致性哈希:根据请求的哈希值分配服务器,减少节点变动影响。
分布式事务算法,比如Raft, Paxos
Raft:一致性算法,易于理解和实现。
特点:通过选举、日志复制、日志提交保证一致性。
适用场景:分布式系统中的一致性问题。
Paxos:一致性算法,复杂但性能好。
特点:通过提议、投票、提交保证一致性。
适用场景:分布式系统中的一致性问题。
Hash环与分布式缓存
一致性哈希:解决节点动态变化的问题,减少数据迁移。
特点:将数据分配到多个节点,节点变动时只影响部分数据。
适用场景:分布式缓存、分布式存储。
分布式缓存:将缓存分布到多个节点,提高性能和可用性。
特点:数据分布在多个节点,支持高并发访问。
适用场景:高并发、高性能的应用,如电商系统。
利特尔法则,及其应用利特尔法则:L = λW,用于分析排队系统。
L:系统中的平均数量。
λ:平均到达率。
W:平 ...
多线程Linux中锁的种类(自旋锁 临界区 递归锁 悲观锁 乐观锁等)
自旋锁:忙等待锁,适用于锁持有时间短的场景。
临界区:保护共享资源的代码块,防止并发访问。
递归锁:允许同一线程多次加锁,防止死锁。
悲观锁:假设会发生冲突,操作前加锁。
乐观锁:假设不会发生冲突,提交时检查冲突。
条件变量 虚假唤醒
条件变量:用于线程间同步,等待特定条件满足。
虚假唤醒:线程被唤醒但条件未满足,需重新检查条件。
CAS与无锁数据结构(主要是无锁单向链表和ringbuffer)
CAS:比较并交换,用于实现无锁数据结构。
无锁单向链表:使用CAS操作实现,避免锁竞争。
RingBuffer:环形缓冲区,用于高效数据传输,避免锁竞争。
线程和协程的区别
线程:操作系统调度,开销较大,适用于并发任务。
协程:用户态调度,开销较小,适用于高并发任务。
双缓冲 (Double Buffering)使用两个缓冲区交替工作,提高数据处理效率。
特点:一个缓冲区用于读操作,另一个缓冲区用于写操作。
适用场景:图形渲染、数据流处理。
内存屏障防止编译器和CPU重排序,保证内存操作顺序。
特点 ...
开源框架或组件消息队列Kafka、RabbitMQ、ActiveMQ等。
Kafka:高吞吐量、分布式消息队列。
RabbitMQ:支持多种协议、灵活的消息队列。
ActiveMQ:支持JMS、持久化的消息队列。
BRPC百度开源的RPC框架。
特点:高性能、易用、支持多种协议。
适用场景:分布式系统、微服务架构。
Redis内存数据库,支持多种数据结构。
特点:高性能、支持持久化、丰富的数据结构。
适用场景:缓存、消息队列、排行榜。
Nginx高性能HTTP服务器和反向代理服务器。
特点:高并发、低内存占用、模块化设计。
适用场景:Web服务器、反向代理、负载均衡。
Zookeeper分布式协调服务。
特点:高可用、强一致性、支持临时节点。
适用场景:分布式锁、配置管理、服务发现。
应用场景如何构建一个秒杀系统高并发处理、限流、缓存、异步处理等。
高并发处理:使用负载均衡、分布式缓存、数据库分库分表。
限流:使用令牌桶、漏桶算法,防止系统过载。
缓存:使用Redis缓存热点数据,减轻数据库压力。
异步处理:使用消息队列、异步任务,减少请求 ...
数据库MySQL常用的存储引擎,如何根据应用场景选择
InnoDB:支持事务、外键,适用于高可靠性需求的应用。
特点:支持ACID事务、行级锁、外键约束。
ACID是衡量事务的四个特性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
适用场景:需要高并发、数据一致性的应用,如金融系统。
MyISAM:不支持事务,适用于读多写少的应用。
特点:不支持事务、表级锁、存储空间小。
适用场景:读操作多于写操作的应用,如数据仓库。
Memory:数据存储在内存中,适用于需要快速访问的数据。
特点:数据存储在内存中,访问速度快,断电数据丢失。
适用场景:需要快速访问的数据,如缓存表、临时数据。
乐观锁和悲观锁乐观锁:假设不会发生冲突,提交时检查冲突。
实现方式:版本号机制、时间戳机制。
适用场景:读多写少的场景,冲突概率低。
悲观锁:假设会发生冲突,操作前加锁。
实现方式:数据库锁机制(行锁、表锁)。
适用场景:写操作多的场景,冲突概率高。
MySQL多版本控制(MVCC)通过保存数 ...
数据结构和算法红黑树(map)一种自平衡二叉搜索树,保证插入、删除、查找操作的时间复杂度为O(log n)。
特点:每个节点有红黑两种颜色,根节点为黑色,红色节点的子节点为黑色,任意节点到叶子节点的路径上黑色节点数量相同。
适用场景:需要快速查找、插入、删除操作的应用,如关联容器map、set。
Hash表的实现(能手写)通过数组和链表实现,解决冲突的方法有链地址法、开放地址法。
链地址法:每个数组元素是一个链表,冲突时将元素插入链表。
开放地址法:冲突时寻找下一个空闲位置,常用方法有线性探测、二次探测、双重散列。
树的遍历(深度优先和宽度优先)
深度优先:前序、中序、后序遍历。
前序遍历:根节点 -> 左子树 -> 右子树。
中序遍历:左子树 -> 根节点 -> 右子树。
后序遍历:左子树 -> 右子树 -> 根节点。
宽度优先:层次遍历。
层次遍历:按层次从上到下、从左到右遍历节点。
跳跃表的实现一种随机化的数据结构,支持快速查找、插入、删除操作。
特点:在有序链表的基础上增加多级索引,索引层数随机生成。
适用场景 ...











