01 2021 档案
摘要:一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。 大量 pipeline 应用场景可通过 Redis 脚本(Redis 版本 >= 2.6)得到更高效的处理,后者在服务器端执行大量工作。脚本的一大优势是可通过
阅读全文
摘要:Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的 Redis会将一个事务中的所有命令序列化,然后按顺序执行。 1.redis 不支持回滚“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。 2.如果在一
阅读全文
摘要:问题描述 哲学家就餐问题也被称为刀叉问题,或者吃面问题。我们先来描述一下这个问题所要说明的事情,这个问题如下图所示: 有 5 个哲学家,他们面前都有一双筷子,即左手有一根筷子,右手有一根筷子。当然,这个问题有多个版本的描述,可以说是筷子,也可以说是一刀一叉,因为吃牛排的时候,需要刀和叉,缺一不可,也
阅读全文
摘要:Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。 尽量避免在压力较大的主库上增加从库 Mas
阅读全文
摘要:偏向锁 轻量级锁在没有竞争时(就自己这个线程),每次重入仍然需要执行 CAS 操作。Java 6 中引入了偏向锁来做进一步优化:只有第一次使用 CAS 将线程 ID 设置到对象的 Mark Word 头,之后发现这个线程 ID 是自己的就表示没有竞争,不用重新 CAS。以后只要不发生竞争,这个对象就
阅读全文
摘要:进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序
阅读全文
摘要:线程的 6 种状态 就像生物从出生到长大、最终死亡的过程一样,线程也有自己的生命周期,在 Java 中线程的生命周期中一共有 6 种状态。 new(新创建) Runnable(可运行) Blocked(被阻塞) Waiting(等待) Timed Waiting(计时等待) Terminated(被
阅读全文
摘要:看到群里有人有个sql不会写,平时mysql复杂写的少,就简单写了写。虽然写的很烂,但是思路还可以。。 create table t1( xid varchar(10) , Name varchar(20), Code varchar(100) ); create table t2( yid var
阅读全文
摘要:使用过 Redis 做异步队列么,你是怎么用的? 一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。不但客户端的 CPU 能降下来,Redis 的 QPS 也降下来了。 如果对方追问可不可以不用 sleep 呢?
阅读全文
摘要:主从复制的作用 读写分离: master写、 slave读,提高服务器的读写负载能力 负载均衡: 基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量 故障恢复:当master
阅读全文
摘要:迭代器模式 概述 定义: 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 结构 迭代器模式主要包含以下角色: 抽象聚合(Aggregate)角色:定义存储、添加、删除聚合元素以及创建迭代器对象的接口。 具体聚合(ConcreteAggregate)角色:实现抽象聚合类,返
阅读全文
摘要:责任链模式 概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地
阅读全文
摘要:命令模式 概述 日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。 结构 命令模式包含以下主要角色: 抽象命令类(Command)角色: 定义命
阅读全文
摘要:微服务系统的监控主要包含以下三个方面: Logging 就是记录系统行为的离散事件,例如,服务在处理某个请求时打印的错误日志,我们可以将这些日志信息记录到 ElasticSearch 或是其他存储中,然后通过 Kibana 或是其他工具来分析这些日志了解服务的行为和状态。大多数情况下,日志记录的数据
阅读全文
摘要:模板方法模式 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评
阅读全文
摘要:组合模式 概述 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器
阅读全文
摘要:方法区的演进 在jdk1.6及之前,在永久代,静态变量存放在永久代上。 jdk1.7,有永久代,但已经逐步“去永久代”,字符串常量池丶静态变量移除,保存在堆中。 在jdk1.8后没有永久代,类型信息丶字段丶常量保存在本地内存的元空间,但字符串常量池丶静态变量还在堆中。 永久代为什么要被元空间替换?
阅读全文
摘要:外观模式 概述 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金
阅读全文
摘要:桥接模式 概述 现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系: 我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。 试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每
阅读全文
摘要:装饰者模式 概述 我们先来看一个快餐店的例子。 快餐店有炒面、炒饭这些快餐,可以额外附加鸡蛋、火腿、培根这些配菜,当然加配菜需要额外加钱,每个配菜的价钱通常不太一样,那么计算总价就会显得比较麻烦。 使用继承的方式存在的问题: 扩展性不好 如果要再加一种配料(火腿肠),我们就会发现需要给FriedRi
阅读全文
摘要:适配器模式 概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座,第2面供我们充电,这样使得我们的插头在当地能使用。生活中这样的例子很多,手机充电器(将2
阅读全文
摘要:简单的整理了一下配置中心的基本概念,主要是为了方便记住,没啥营养。 什么是配置中心 配置中心将配置从应用中剥离出来,统一管理,优雅的解决了配置的动态变更、持久化、运维成本等问题。应用自身既不需要去添加管理配置接口,也不需要自己去实现配置的持久化,更不需要引入“定时任务”以便降低运维成本。总得来说,配
阅读全文
摘要:解决分布式下Websocket共享问题 解决方案有2种,一个是redis,一个是mq。其中redis没仔细研究,就直接用了mq。项目中用F5代理了2台应用服务器,如果发生方和接受方不在同一个服务器,就会出现有问题。 下面就直接上代码 bo类 @Data @AllArgsConstructor @No
阅读全文
摘要:Java 7 版本的 ConcurrentHashMap 我们首先来看一下 Java 7 版本中的 ConcurrentHashMap 的结构示意图: 从图中我们可以看出,在 ConcurrentHashMap 内部进行了 Segment 分段,Segment 继承了 ReentrantLock,可
阅读全文
摘要:ConcurrentHashMap 和 Hashtable 的区别? 出现的版本不同 我们先从表面的、显而易见的出现时间来分析。Hashtable 在 JDK1.0 的时候就存在了,并在 JDK1.2 版本中实现了 Map 接口,成为了集合框架的一员。而 ConcurrentHashMap 则是在
阅读全文
摘要:1.TreeMap的特点 概念: TreeMap是一个双列集合,是Map的子类。底层由红黑树结构构成。 特点: 元素中键不能重复 元素会按照大小顺序排序 2.TreeMap的数据结构 2.1二叉查找树 2.1.1二叉查找树的定义 特点: 1.若左子树不空,则左子树上所有结点的值均小于它的根结点的
阅读全文
摘要:在Jdk1.8版本后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据由链表改为了存在红黑树中,以加快检索速度。 有疑问为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树阿? 最主要的一点是: 在CurrentHashMap中是加锁了的,实际上是读写锁,如果写冲突就会等
阅读全文
摘要:扩容机制 1.什么时候才需要扩容 在首次调用put方法的时候,初始化数组table 当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75,这是一个折中的取值。也就是
阅读全文
摘要:说明: 1.loadFactor加载因子,是用来衡量 HashMap 满的程度,表示HashMap的疏密程度,影响hash操作到同一个数组位置的概率,计算HashMap的实时加载因子的方法为:size/capacity,而不是占用桶的数量去除以capacity。capacity 是桶的数量,也就是
阅读全文
摘要:如果创建HashMap对象时,输入的数组长度是10,不是2的幂,HashMap通过一通位移运算和或运算得到的肯定是2的幂次数,并且是离那个数最近的数字。 源代码如下: //创建HashMap集合的对象,指定数组长度是10,不是2的幂 HashMap hashMap = new HashMap(10)
阅读全文
摘要:HashMap构造方法还可以指定集合的初始化容量大小: HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。 根据上述讲解我们已经知道,当向HashMap中添加一个元素的时候,需要根据key的hash值,去确定其在数组中
阅读全文
摘要:class常量池和运行时常量池的区别 class常量池 一个java源文件的类,接口,编译后会产生一个字节码文件。而Java中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换一种方式,可以存到常量池中,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。可以包
阅读全文
摘要:堆空间为什么要分代 经研究,不同对象的生命周期不同。70%-90%的对象都是临时对象。其实不分代完全可以,分代的唯一理由就是优化GC性能,如果没有分代,那所有的对象都在一块,就如同把一个学校的人都关在一个教室。GC的时候要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而很多对象都是朝生夕死的,如
阅读全文
摘要:简单试试了一下,xlsx转成pdf不是很美观,图片转pdf,就是效果和图片一样,但确实是pdf格式,别的还没有尝试 File Converter File Converter (文件转换器) 是一款完全免费且开源的“万能格式转换工具”,支持 Vista / 7 / 8 及最新的 Windows 10
阅读全文
摘要:优先级队列的概念 队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,在这种情况下,我们的数据结构应该提供两个最基本的操作:一个是返回最高优先级对象,一个是添加新的对象。 这种数据结构就是优先级队列(Priority Que
阅读全文
摘要:ConcurrentSkipListMap基础介绍 很明显它底层是以跳表为基础结构的map集合,并且同时支持并发操作,大家应该都知道支持并发最出名的map应该是ConcurrentHashMap,那么它相比于ConcurrentHashMap有什么优点呢?通过前面学习我们知道跳表是一个有序的链表,而
阅读全文
摘要:SynchronousQueue VS LinkedTransferQueue SynchronousQueue 是一个队列长度为 0 的 BlockingQueue,所以没有一个地方来暂存元素,导致每次取数据都要先阻塞,直到有数据被放入;同理,每次放数据的时候也会阻塞,直到有消费者来取。它所做的就
阅读全文
摘要:AQS 的作用 AQS 是一个用于构建锁、同步器等线程协作工具类的框架,有了 AQS 以后,很多用于线程协作的工具类就都可以很方便的被写出来,可以让更上层的开发极大的减少工作量,避免重复造轮子,同时也避免了上层因处理不当而导致的线程安全问题,因为 AQS 把这些事情都做好了。总之,有了 AQS 之后
阅读全文
摘要:1 结构 在观察者模式中有如下角色: Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。 ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对
阅读全文
摘要:享元模式 1 概述 定义: 运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。 2 结构 享元(Flyweight )模式中存在以下两种状态: 内部状态,即不会随着环境的改变而改变的可共享部分。
阅读全文
摘要:主从数据库不一致如何解决? 场景描述,对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致。 1、忽略这个数据不一致,在数据一致性要求不高的业务下,未必需要时时一致性。 2、强制读主库,使用一个高可用的主库,数据库读写都在主库,添加一个缓存,提升数据读取的性能。 3、选择性读主
阅读全文
摘要:这道题最好把对象和变量分开说明,否则容易产生误解。以下都是64位环境下。 针对对象: 压缩状态:MarkWord 8+klass 4+数据0+对齐4=16 非压缩状态:MarkWord 8+klass 8+数据0+对齐0=16 针对变量: 压缩状态:4 非压缩状态:8
阅读全文
摘要:AtomicInteger和LongAdder区别 AtomicLong 存在的问题 首先我们来看一段代码: /** * @author WGR * @create 2021/1/13 -- 16:17 */ public class AtomicLongDemo { public static v
阅读全文
摘要:Adder 和 Accumulator 有什么区别 Adder 的介绍 我们要知道 Adder 和 Accumulator 都是 Java 8 引入的,是相对比较新的类。对于 Adder 而言,比如最典型的 LongAdder,在高并发下 LongAdder 比 AtomicLong 效率更高,因为
阅读全文
摘要:为什么 Map 桶中超过 8 个才转为红黑树? JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个特点:最开始的 Map 是空的,因为里面没有任何元素,往里放元素时会计算 hash 值,计算之后,第 1 个 value 会首先占用一个桶(也称为槽点)位置,后续如
阅读全文
摘要:安全点与安全区域 安全点: 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才 能停顿下来开始GC,这些位置称为“安全点(Safepoint) ”。 Safe Point的选择很重要,==如果太少可能导致GC等待的时间太长,如果 太频繁可能导致运行时的性能问题。==大部分指令的执行时间
阅读全文
摘要:/** * @author WGR * @create 2021/1/12 -- 17:12 */ public class LRUCacheDemo2<K,V> extends LinkedHashMap<K,V> { private int capacity; public LRUCacheDe
阅读全文
摘要:Spring是怎么解决循环依赖的? 首先,Spring 解决循环依赖有两个前提条件: 不全是构造器方式的循环依赖 必须是单例 基于上面的问题,我们知道Bean的生命周期,本质上解决循环依赖的问题就是三级缓存,通过三级缓存提前拿到未初始化的对象。 第一级缓存:用来保存实例化、初始化都完成的对象 第二级
阅读全文
摘要:
阅读全文
摘要:使用keys指令可以扫出指定模式的key列表。 对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys 指令会有什么问题? 这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会 导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能 恢复。这个时
阅读全文
摘要:GC的性能指标 吞吐量:运行用户代码的时间占总运行时间的比例。 暂停时间:执行垃圾收集时,程序工作线程被暂停的时间。 内存占用:Java堆区所占的内存大小。 高吞吐量较好因为这会让应用程序的用户感觉应用程序线程在做生产性工作。直觉上,吞吐量越高程序运行越快。有时候甚至短暂的200毫秒暂停都可能打断终
阅读全文
摘要:拒绝时机 首先,新建线程池时可以指定它的任务拒绝策略,例如: newThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.DiscardOldestPoli
阅读全文
摘要:类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识,ClassLoader只负责加载class文件,加载的类信息存放在方法区中,除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量。 类加载过程 加载
阅读全文
摘要:CAS 简介 首先我们来看一下 CAS 是什么,它的英文全称是 Compare-And-Swap,中文叫做“比较并交换”,它是一种思想、一种算法。 在多线程的情况下,各个代码的执行顺序是不能确定的,所以为了保证并发安全,我们可以使用互斥锁。而 CAS 的特点是避免使用互斥锁,当多个线程同时使用 CA
阅读全文
摘要:线程池7大参数 public ThreadPoolExecutor(int corePoolSize, // 1 int maximumPoolSize, // 2 long keepAliveTime, // 3 TimeUnit unit, // 4 BlockingQueue<Runnable
阅读全文
摘要:1.工具概述 作为一个java程序员,最基本的要求就是用java语言编写程序,并能够在jvm虚拟机上正常运行,但是在实际开发过程中,我们所有的程序由于各种各样的原因,并不是总能够正常运行,经常会发生故障或者程序的性能低下等问题,此时我们就需要借助于一些jdk提供的工具来定位问题、分析问题并给出合适的
阅读全文
摘要:死锁 死锁是什么?有什么危害? 什么是死锁 发生在并发中 首先你要知道,死锁一定发生在并发场景中。我们为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在使用过程中处理不得当,就有可能会导致发生死锁的情况。 互不相让 死锁是一种状态,当两个(或多个)线程(或进程)相互持有
阅读全文
摘要:JVM的四大引用 强引用 强引用时最普遍的引用。如果一个对象具有强引用,那垃圾回收器不会回收它。它是默认的引用类型,强引用的对象是可触及的,垃圾收集器就永远不会回收被引用的对象,它可能导致内存泄漏,可以直接访问目标对象。 软引用 只要被软引用关联的对象,系统将要发生内存溢出前,会把这些对象列进回收的
阅读全文
摘要:对象怎么定位 JVM是通过栈帧上的reference访问到对象的实例的,具体有2种方式。 句柄访问 优点:reference种存储稳定句柄地址,对象被移动时只会改变句柄中实例数据指针即可,reference本身不需要修改。 缺点:比较费空间,需要单独开辟一个句柄池。速度相比直接指针可能还要慢一点。
阅读全文
摘要:Spring框架的好处 轻量:Spring是轻量的,基本的版本约为几M。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面:Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring包含并管理应用中对象的生命
阅读全文
摘要:基本概念: 领域驱动设计(简称 ddd)概念来源于2004年著名建模专家eric evans发表的他最具影响力的书籍:《domain-driven design –tackling complexity in the heart of software》(中文译名:领域驱动设计—软件核心复杂性应对之
阅读全文
摘要:什么是阻塞队列? 阻塞队列的作用 阻塞队列,也就是 BlockingQueue,它是一个接口,如代码所示: public interface BlockingQueue<E> extends Queue<E>{...} BlockingQueue 继承了 Queue 接口,是队列的一种。Queue
阅读全文
摘要:CopyOnWriteArrayList 有什么特点? 适用场景 读操作可以尽可能的快,而写即使慢一些也没关系 在很多应用场景中,读操作可能会远远多于写操作。比如,有些系统级别的信息,往往只需要加载或者修改很少的次数,但是会被系统内所有模块频繁的访问。对于这种场景,我们最希望看到的就是读操作可以尽可
阅读全文
摘要:synchronized和lock的区别 原始构成: synchronized是关键字属于JVM层面,monitorenter(底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步块或者方法中才能调用wait/notify) lock是类,是api
阅读全文
摘要:面试题:什么叫做阻塞队列的有界和无界 阻塞队列有一个非常重要的属性,那就是容量的大小,分为有界和无界两种。 无界队列意味着里面可以容纳非常多的元素,例如 LinkedBlockingQueue 的上限是 Integer.MAX_VALUE,约为 2 的 31 次方,是非常大的一个数,可以近似认为是无
阅读全文
摘要:ReentrantReadWriteLock 当读操作远远高于写操作时,这时候使用 读写锁 让 读-读 可以并发,提高性能。 类似于数据库中的 select ...from ... lock in share mode 提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法,写锁保护数
阅读全文
摘要:LINUX之FTP服务 1.FTP的连接类型 控制连接(持续连接) → TCP21(命令信道) → 用户收发FTP命令 数据连接(按需连接) → TCP20(数据信道) → 用于上传下载数据 2.FTP的工作模式 ftp模式分为主动模式(active mode)和被动模式(passive mode)
阅读全文