Map:无序,键值对,键唯一,值不唯一。底层由由数组+链表实现 4,HashMap和HashTable的区别?...HashMap是线程不安全的执行效率比较高,可以存储null键和值 HashTable是线程安全的执行效率低,不可以存储null键和值 5,如何决定使用HashMap还是TreeMap?...Thread子类的话可以直接使用Thread类的方法,但是如果类有继承其他类则没办法继承该类 Runnable的话无需担心该类是否继承了其他类,但是不能使用Thread类里面的方法。...runnable执行完没有返回值他的run方法不能抛异常,callable执行完有返回值他的call方法能抛异常。 6,线程有哪些状态? 创建,就绪,运行,阻塞,死亡。...sumbmit有返回值,能抛出异常 execute没有返回值,不能抛出异常 12,在java程序中怎么保证多线程的运行安全? 使用synchronized和lock锁,以及voliate关键字。
从30个并发平均每个2000毫秒 到 300个并发平均每个178毫秒 简单介绍一下做了那些优化: 01、减少log日志的打印 02、减少redis的交互 03、耗时操作的处理 04、大文件信息的存储...+读取音频 我们发现两个性能测试只差一个读取音频函数 但形成却相差很多,说明在读取音频这里是一个巨大的耗时,那么就要想办法处理掉 二、性能处理 01、我们可能会感觉打印一个log不会是耗时操作,但通过唯一变量法发现...的耗时,以及有没有多余的操作 ?...redis的耗时 数据信息为:操作次数 – 总耗时 – 平均耗时 这样我们就能清清楚楚的看到用到了几次读写操作,分别耗时多少 具体详见: redis的使用,以及耗时定位 03+04+05、耗时操作的处理...方法一:redis缓存 说到缓存数据,首先想到了内存性数据库redis,于是想办法将音频存至redis中,操作很简单,以音频名称为key值 -- 读取的信息为value进行存储(注意类型为bytes类型
那么我们现在先开启客户端,然后不在控制台输入数据,如下图所示,服务端程序会一直卡在②的地方停下来,因为客户端卡在了③的位置,你一直没有在控制台输入字符,客户端的没有输出流,那么服务端没办法接收到客户端发送过来的数据...所以这种模型也有很多的吐槽点,首先,在任何时候都有可能有大量的线程处于休眠状态,只是等待输入或者输出数据就绪,这对于我们的系统来说就是一种巨大的资源浪费;然后,我们需要为每个线程都分配内存,其默认值大小区间为...,再运行两个客户端代码,向8001端口发送数据,运行结果如下: ?...select的缺点: 底层存储依赖bitmap,处理的请求是有上限的,为1024。 文件描述符是会置位的,所以如果当被置位的文件描述符需要重新使用时,是需要重新赋空值的。...或者revents置位,而不是对fd本身进行置位,所以在下一次使用的时候不需要再进行重新赋空值的操作。
唯一索引:索引列中的值必须是唯一的,但是允许为空值, 主键索引:是一种特殊的唯一索引,不允许有空值。...(同一进程中的)线程在共享内存空间中运行,而进程在不同的内存空间中运行 线程可以使用 wait(),notify(),notifyAll()等方法直接与其他线程(同一进程)通信;而,进程需要使用“进程间通信...不存在 一直为空,需要注意让缓存能够区分 KEY 不存在和查询到一个空值。 解决办法:缓存空值的 KEY,这样第一次不存在也会被加载会记录,下次拿到有这个KEY。...(运行时常量池) 堆(heap):被所有的线程共享,存放对象实例以及数组,Java 堆是 GC 的主要区域。 栈(stack):每个线程包含一个栈区,栈中保存一些局部变量等。...如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。
判断线程数是否达到了最大值,如果不是,则创建非核心线程执行任务,否则执行饱和策略,默认抛出异常。 8.内存泄漏的场景和解决办法。...6).WebView导致的内存泄漏WebView只要使用一次,内存就不会被释放,所以WebView都存在内存泄漏的问题,通常的解决办法是为WebView单开一个进程,使用AIDL进行通信,根据业务需求在合适的时机释放掉...中的Looper实例传递给一个Handler,从而保证这个Handler的handleMessage方法运行在子线程中,Android中使用HandlerThread的一个场景就是IntentService...如果对象的hashCode值不同,那么不用调用equals方法就会将对象直接存储到集合中;如果对象的hashCode值相同,那么需调用equals方法判断返回值是否为true,若为false, 则视为不同元素...判断元素唯一性的方式:根据比较方法的返回结果是否为0,如果为0视为相同元素,不存;如果非0视为不同元素,则存。
面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。...解决方案 RabbitMQ 拆分多个 queue,每个 queue 一个 consumer,就是多一些 queue 而已,确实是麻烦点,这样也会造成吞吐量下降,可以在消费者内部采用多线程的方式取消费。...注意,这里消费者不直接消费消息,而是将消息根据关键值(比如:订单 id)进行哈希,哈希值相同的消息保存到相同的内存队列里。...也就是说,需要保证顺序的消息存到了相同的内存队列,然后由一个唯一的 worker 去处理。...写 N 个内存 queue,具有相同 key 的数据都到同一个内存 queue;然后对于 N 个线程,每个线程分别消费一个内存 queue 即可,这样就能保证顺序性。
): producer.type=sync(默认值): 后台线程中消息发送是同步方式,对应的类为 kafka.producer.SyncProducer; producer.type=async: 后台线程中消息发送是异步方式...,对应的类为 kafka.producer.AyncProducer;优点是可批量发送消息(消息个数达到 batch.num.messages=200 或时间达到 时发送)、吞吐量佳,缺点是发送不及时可能导致丢失...取了一批数据,尚未处理完毕时,达到了 session.timeout.ms,导致没有接收心跳而挂掉,自动提交offset失败,下次会重复消费本批消息; 解决办法:(1)唯一 ID 保存在外部介质中,每次消费时根据它判断是否已处理...; 4 消息乱序 传统的队列,在并行处理时,由于网络故障或速度差异,尽管服务器传递是有序的,但消费者接收的顺序可能不一致; Kafka 在主题内部有分区,并行处理时,每个分区仅由消费者组中的一个消费者使用...,确保了消费者是该分区的唯一读者,并按顺序使用这些数据。
运行上面的代码我们可以判断,t1中看到的flag一直为true,主线程将flag置为false之后,t1线程中并没有看到,所以一直死循环。 那么t1中为什么看不到被主线程修改之后的flag?...如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。...从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证。...,但是t1一直读取的是自己工作内存中flag的值,没有去主内存中获取flag最新的值 对于上面2种情况,有没有什么办法可以解决?...java帮我们提供了这样的方法,使用volatile修饰共享变量,就可以达到上面的效果,被volatile修改的变量有以下特点: 线程中读取的时候,每次读取都会去主内存中读取共享变量最新的值,然后将其复制到工作内存
当然可以 在你的线程组里面用上 csv 数据文件设置读取出用户账户信息,或者用 JDBCrequest 从数据库获取出用户信息 然后再在登录接口中用取出的用户信息来登录 这样,在性能测试时,就会循环使用你用户总量中的用户来发送请求...这样,理论上是行的通的,但是,现实有些骨感 因为做性能测试,使用的是高并发,可能存在竞争关系,可能出现后续接口,使用的关联参数取不到值的情况 从而导致请求报错,而这种错误,不是性能测试服务器响应报错,...而是脚本问题导致报错,影响我们对性能结果的判断 那么,我们就会问,还有没有其他办法呢?...终极好办法 上面也说了一个关键点:一个用户只需要登录一次 既然我们一个线程就是一个模拟用户,那我们只需要针对每个线程做到只发出一次登录请求,其他接口可以无限次发起 ?...具体步骤 在线程组下添加一个逻辑控制器【仅一次控制器】 在该逻辑控制器下添加登录请求 登录请求下添加提取器,提取登录响应内容 和逻辑控制器平级下添加需要并发的请求 运行查看聚合报告 ?
,每个队列32m,每16k数据形成一批消息; sender线程专门从内存中获取数据发送到kafka集群中,这里有2个主要参数: batch.size:只有数据累加到batch.size之后,sender...,返回的是offset值或者发送过程中遇到的错误。...,如mysql binlog日志传输要求全局的顺序,不能有任何的乱序,这种的解决办法通常是最为保守的方式: 全局使用一个生产者; 全局使用一个消费者(并严格到一个消费线程); 全局使用一个分区(当然不同的表可以使用不同的分区或者...,不能保证数据不重复; 通常为了兼顾效率与数据安全,将acks设置为1,只让每个分区的leader确认收到消息即可,不能副本是否同步数据完毕。...,下次启动也会重复消费;生产者重复发送数据,消费者重复消费数据,这些都导致消息重复,那么避免重复也应该在消息的生产与消费来避免; 对于生产端: 每个分区使用一个单独的写入器,每当你发现一个网络错误,检查该分区中的最后一条消息
,如果创建的线程满了,该怎么做,淘汰机制有没有了解? 仓库;阻塞队列,放任务的 线程集合 线程从仓库里面拿任务 放到 cpu 执行运算 4.索引优化,最左原则是什么?...线程自选获取锁 Redisson框架已有实现 8.有没有处理过缓存雪崩,缓存穿透的场景 知道出现原因以及处理办法,但前公司并发不高,并没有出现这类场景 9.雪花算法,原理知道吗,有没有缺点。...普通索引的叶子节点保存的主键的值,通过普通索引查询的值,还需要到主键索引中去查一遍,这就叫回表 4.对架构的发展有没有了解,单体 -> 分布式。...ThreadPoolExecutor.CallerRunsPolicy:调用执行自己的线程运行任务。您不会任务请求。但是这种策略会降低对于新任务提交速度,影响程序的整体性能。...Callable的call方法有返回值 volatile关键字能实现线程变量的可见 17.用多线程就一定好吗 不一定,线程数量要合适,一般为cpu核数的2倍。
有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。...(这种架构可以理解为有多个进程,并且一个进程又生成多个线程,每个线程处理一个请求) 说一下select,poll,epoll的区别?...type 字段就是描述了找到所需数据时使用的扫描方式是什么,常见扫描类型的执行效率从低到高的顺序为: All(全表扫描); index(全索引扫描); range(索引范围扫描); ref(非唯一索引扫描...ref 类型表示采用了非唯一索引,或者是唯一索引的非唯一性前缀,返回数据返回可能是多条。因为虽然使用了索引,但该索引列的值并不唯一,有重复。...eq_ref 类型是使用主键或唯一索引时产生的访问方式,通常使用在多表联查中。
type 字段就是描述了找到所需数据时使用的扫描方式是什么,常见扫描类型的执行效率从低到高的顺序为: All(全表扫描); index(全索引扫描); range(索引范围扫描); ref(非唯一索引扫描...ref 类型表示采用了非唯一索引,或者是唯一索引的非唯一性前缀,返回数据返回可能是多条。因为虽然使用了索引,但该索引列的值并不唯一,有重复。...这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。...唯一索引的更新性能没有普通索引高,因为没办法利用 changebuffer 的优化。 8....它的实现方式是,对每个页面设置一个「访问计数器」,每当一个页面被访问时,该页面的访问计数器就累加 1。在发生缺页中断时,淘汰计数器值最小的那个页面。
此处设置为2 方案2上线运行一段时间后,出现一个现象: 变更的事件消息会偶发性的丢失 现象: 1、可以找到到发送成功的日志。...解决办法: 1、优化数据刷新的逻辑,减少对内存的消耗。 通过翻页获取数据的方式小步快走的方式小批量获取数据、刷新数据。 2、增加RocketMQ的消费线程数。从2调整为8。...消费进度原理 消息位点(Offset) RocketMQ领域中消息是按到达服务端的先后顺序存储在指定主题[Topic]的多个队列中,每条消息在队列中都有一个唯一的Long类型坐标,这个坐标被定义为消息位点...消费位点(ConsumerOffset) RocketMQ领域模型为发布订阅模式,每个主题的队列都可以被多个消费者分组订阅。...RocketMQ定义消费位点的初始值为消费者首次获取消息时,该时刻队列中的最大消息位点。相当于消费者将从队列中最新的消息开始消费。
如果有多个消费者,这个延迟会有所下降,因为每个消费者的睡觉时间是岔开来的。 有没有什么办法能显著降低延迟呢?你当然可以很快想到:那就把睡觉的时间缩短点。这种方式当然可以,不过有没有更好的解决方案呢?...我们将消息序列化成一个字符串作 为 zset 的 value,这个消息的到期处理时间作为 score,然后用多个线程轮询 zset 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处理...def delay(msg): msg.id = str(uuid.uuid4()) # 保证 value 值唯一 value = json.dumps(msg) retry_ts = time.time...,最终只会有一个进程可以抢到消息 msg = json.loads(value) handle_msg(msg) Redis 的 zrem 方法是多线程多进程争抢任务的关键,它的返回值决定了当前实例有没有抢到任务...,因为 loop 方法可能会被多个线程、多个进程调用,同一个任务可能会被多个进程线程抢到,通过 zrem来决定唯一的属主。
序列号与确认机制:TCP将每个数据包分配一个唯一的序列号,并且接收方会发送确认消息来确认已经接收到的数据。发送方会根据接收到的确认消息判断是否需要重新发送丢失的数据包。...控制该队列的最大值如下参数,默认值是 1000,我们要适当调大该参数的值,比如设置为 10000: net.core.netdev_max_backlog = 10000 方式二:增大 TCP 半连接队列...最直接的办法就是抓包,排查的思路大概有: 先确定是服务端的问题,还是客户端的问题。...,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小 所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行...) 内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源 包含关系:没有线程的进程可以看做是单线程的
SentenceSpout不断读取语句将其作为数据来源,组装成单值tuple(键名sentence,键值为字符串格式的语句)向后发射。 ...3.Executor 线程:指一个worker的jvm中运行的java线程。多个task可以指派给同一个executer来执行。...大多数情况下,除非明确指定,Storm的默认并发设置值是1。即,一台服务器(node),为topology分配一个worker,每个executer执行一个task。 ...此时唯一的并发机制出现在线程级即Executor。 2、增加各级别并发 1.增加Node 这个其实就是增加集群的服务器数量。...Spout或Bolt增加线程数量,默认每个线程都运行该Spout或Bolt的一个task。
第一个是创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue里的数据;第二个是发送消息的时候将消息的deliveryMode设置为2,...Kafka可能存在的数据丢失问题 消费者 : 唯一可能导致消费者弄丢数据的情况,就是说,你那个消费到了这个消息,然后消费者那边自动提交了offset。...所以此时一般是要求起码设置如下4个参数: 给这个topic设置replication.factor参数:这个值必须大于1,要求每个partition必须有至少2个副本 在kafka服务端设置min.insync.replicas...解决办法: 就是为每一个机器设置一个queue,然后如果要求有序的数据必须确保发到同一个queue中,那么数据的接受就不会乱序。...解决办法: 一个topic,一个partition,一个consumer,内部单线程消费,写N个内存queue,然后N个线程分别消费一个内存queue即可,既消费者不要使用多线程进行处理。
,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小 稳定性方面:进程中某个线程如果崩溃了,可能会导致整个进程都崩溃。...内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源 包含关系:没有线程的进程可以看做是单线程的...,就是hashmap在存值的时候(默认大小为16,负载因子0.75,阈值12),可能达到最后存满16个值的时候,再存入第17个值才会发生扩容现象,因为前16个值,每个值在底层数组中分别占据一个位置,并没有发生...RocketMQ 丰富的特性,能够为我们在复杂的业务场景下尽可能多地提供思路及解决方案。 有没有消息积压的问题 导致消息积压突然增加,最粗粒度的原因,只有两种:要么是发送变快了,要么是消费变慢了。...如果短时间内没有足够的服务器资源进行扩容,没办法的办法是,将系统降级,通过关闭一些不重要的业务,减少发送方发送的数据量,最低限度让系统还能正常运转,服务一些重要业务。
redis是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL数据库。...,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示我们上面例子里面的用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统,上面我说的几个场景也就能够实现...作为key存储redis(幂等性请求),设置多长时间有效期,然后下次请求过来的时候先在redis中检索有没有这个key,进而验证是不是一定时间内过来的重复提交 秒杀系统,基于redis是单线程特征,防止出现数据库...svalue redis hash 相关 Redis 中每个 hash 可以存储40多亿,value为hash 添加/删除/存在 hdel/hset/hexists key value 添加多个...不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。
领取专属 10元无门槛券
手把手带您无忧上云