02 2020 档案
摘要:CAS是一种常用的硬件同步原语,即由一组计算机硬件提供的原子操作。 CAS的逻辑: 有三个参数:p-要改变变量的指针;old-旧值;new-新值。执行时先比较p和old值是不是相等,如果相等,就把new赋值给p,并返回true.否则不改变,返回false。 java在1.5之后引入CAS,主要放在J
阅读全文
摘要:CountDownLatch是用来解决线程之间通信的。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后
阅读全文
摘要:死锁定义为一组互相竞争资源的线程因互相等待,导致永久阻塞的情况。 即; 如何解决死锁: 1、一次性申请所有的资源,直到拿到所有资源的锁再进行操作 2、主动释放其所占有的资源,synchronized是做不到的,使用lock 3、按资源id的从小到大的顺序去申请锁
阅读全文
摘要:LRU算法 LRU算法定义: LRU算法是指最近最少使用算法,意思是LRU认为最近使用过的数据,将来被访问的概率会大,最近没有被访问的数据意味着以后刚问的概率小。 为何要用LRU算法: 1、我们的存储空间是有限的,当存储空间满了之后,要删除哪些数据呢,才能会时缓存的命中率高一些呢 2、LRU算法还是
阅读全文
摘要:缓存穿透是指 查询一个不存在的数据,每次都需要查询数据库。由于写入缓存是被动操作,并且数据库每次查询为空,所以不会向缓存中写入数据,导致每次查询会越过缓存直接查询数据库,访问量大时增加数据库压力 解决方案: 1、回写空值: 查询完数据库时,将空值塞入缓存并加入较短的过期时间。需要评估一下缓存容量是否
阅读全文
摘要:1、serverhandler package server; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.exte
阅读全文
摘要:在网络传输过程中粘包和半包中经常出现的现象。 在TCP传输中,客户端发送消息时,实际上是将数据写入TCP的缓存,此时数据的大小和缓存的大小就会造成粘包和半包的原因。 例如: 客户端给服务端发送了两条消息ABC和DEF,服务端这边的接收会有多少种情况呢?有可能是一次性收到了所有的消息ABCDEF,有可
阅读全文
摘要:1、为何高并发下容易oom 1)首先我们了解当执行垃圾回收的时候,会导致进程暂停,从而使我们的程序卡死;进程长时间暂停,又会导致大量的请求积压等待处理,垃圾回收刚刚结束,更多的请求立刻涌进来,迅速占满内存,再次被迫执行垃圾回收,进入了一个恶性循环。如果垃圾回收的速度跟不上创建对象的速度,还可能会产生
阅读全文
摘要:1、协议抽象实体 1 package protocal.model; 2 3 import lombok.Data; 4 5 /** 6 * @author liupengr 7 * @date 2020/2/12 18:21 8 */ 9 @Data 10 public abstract clas
阅读全文
摘要:1、序列化接口 1 package serializer.service; 2 3 /** 4 * 序列化接口 5 * 6 * @author liupengr 7 * @date 2020/2/12 18:17 8 */ 9 public interface Serializer { 10 11
阅读全文
摘要:目前有很多通用的序列化实现,比如java和go都内置了序列化实现,还有一些开源的序列化框架,比如Google 的 Protobuf、Kryo、Hessian 等, 以及像json,二进制这种标准会的数据格式也可以作为序列化的实现。 首先我们选用数列化实现有哪几个维度呢? 序列化后数据要有良好的可读性
阅读全文
摘要:1、同步网络IO模型 网络IO模型分两段,一个write,一个read,write操作我们不需要考虑,这里我们看read操作。 接受线程会一直阻塞,当有数据到来的时候,操作系统会先把数据写入接收缓存,然后给接收数据的线程发一个通知, 线程收到通知后结束等待,开始读取数据。处理完这一批数据后,继续阻塞
阅读全文
摘要:1、用户空间和内存空间 为了不让用户线程直接操作内核,保护内核的安全,操作系统将虚拟空间分为两部分,一部分为内核空间,一部分为用户空间。 针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x
阅读全文
摘要:Q:为何要采用异步编程 A:异步编程首先不会节约线程,因为异步操作都会重新开一个线程。异步编程是提高了CPU的使用率,采用同步编程的方式,整个服务器的所有线程大部分都没有在工作,而是在等待。因为线程同步操作 要等整个事件处理完成才能提交,所以CPU的利用率很低;当采用异步编程,线程不需要等待,减少时
阅读全文
摘要:java线程池 1、以下是ThreadPoolExecutor参数完备构造方法: public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueu
阅读全文
摘要:Q:刚开始是对这个疑问抱有质疑态度的,因为使用消息队列的其中目的就是削峰填谷,来避免高流量时,对下游服务的冲击,所以使用消息队列进行缓冲,下游根据自己的消费能力去消费, 我感觉这就是消息积压本就是使用消息队列的功能,怎么会是问题呢? A:首先消息积压是正常现象,但凡是过多就不正常了。积压越来越多就需
阅读全文
摘要:Redis基于Reactor模式开发了自己的网络事件处理器。被称为文件事件处理器,由于这个处理器是单线程的所以决定了redis是单线程的。 Redis线程模型的组成: 多个socket IO多路复用程序 scocket队列 文件事件分配器 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)
阅读全文
摘要:redis支持高并发的原因: redis是基于内存的,内存读写很快 redis的是单线程的,省去了很多多线程上下文切换的时间 redis虽然是单线程,但采用了IO多路复用技术,非阻塞IO,即多个网络连接复用一个线程,保证多连接的同时增加系统的吞吐量 redis的数据结构,采用hash,读取速度比较快
阅读全文
摘要:基于redis实现分布式锁,主要原理在于key,每次访问时判断当前key是否存在于redis中,若存在则阻塞,若不存在则加入redis中同时获取redis锁。 但是java中获取key值,及向redis中塞入key以下是两个操作不是原子性的 1、 redis.get(key) 2、redis.set
阅读全文
摘要:redis事务与传统的关系型数据库的事务不同。redis事务是指一组命令的集合,事务和命令都是最小的执行单位,事务保证了一组命令执行的原子性。 原理是将一组命令发送给redis,redis一次执行这一组命令。同时redis事务遇到错误后没有传统数据库的回滚操作,而是会继续执行后续的命令。 redis
阅读全文
摘要:MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,
阅读全文
摘要:1、确保消息的关键点不丢失? 关键在于两点:消息的持久化,业务系统的幂等性! 2、如何检测消息是否丢失? 1、我们可以利用消息队列的有序性来验证消息是否丢失,在producer端,每发送消息时附带连续的递增序号,在consumer端消费消息时验证消息的序号即可。 (大部分消息队列支持拦截器机制,可在
阅读全文
摘要:一、两阶段提交 2PC 1、数据库层面的两阶段提交(XA trainsaction) 两阶段提交是目前经常使用的一种解决分布式事物的强一致性的一种方案,它是由事物协调器和若干个事物执行者(数据库本身)组成。 所谓两阶段提交就是将每一个事物拆分成 任务+提交,将任务的执行和任务提交分成两步。当客户端发
阅读全文
摘要:rocketmq采用的是发布-订阅的模式,不需要每个消费者维护自己的消息队列,生产者将消息发送到topic,消费者订阅此topic 读取消息。 基本概念: 消息模型:消息模型包括producer,consumer,broker三部分。producer生产消息,consumer消费消息,broker存
阅读全文
摘要:rabbitmq采用的是队列的消息模型,利用队列先进先出的特性从而保证了消息的严格有序性,但是队列中没有读取这个操作,读取即为出队,也就是删除, 所以每个消费者都需要对应自己的队列去读取数据。 下图为rabbitmq的消息模型: 1、生产者只负责生产消息发送给exchange,不需要关心消费者以及消
阅读全文
摘要:选择消息队列的考量维度:可靠性,性能,高可用,功能,是否开源以及社区活跃程度 rabbitmq: 优点:轻量,易部署和使用,基于exchange模块可灵活配置路由规则 缺点:性能和吞吐量较差,每秒处理几万数据量;开发语言小众,不利于二次开发 rocketmq: 优点:可靠性,稳定性,性能很好每秒处理
阅读全文
摘要:消息队列使用场景 1、异步处理: 减少等待时间,更快的返回处理结果,提高系统性能以及更好的用户体验。 fe: 在一个秒杀系统中,可能需要如下几步:风险控制,锁定库存,生成订单,消息通知以及统计数据,在未优化的情况下,用户请求到达网关后进入服务端要至少 经历这五个步骤,但是对于秒杀系统而言关键的步骤在
阅读全文

浙公网安备 33010602011771号