2023年3月29日
摘要: 线程池的生命周期,总共有五种状态 RUNNING :能接受新提交的任务,并且也能处理任务队列中的任务; SHUTDOWN:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。在线程池处于 RUNNING 状态时,调用 shutdown()方法会使线程池进入到该状态。(finali 阅读全文
posted @ 2023-03-29 23:16 zhengbiyu 阅读(38) 评论(0) 推荐(0)
摘要: 基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个: 原子性:确保线程互斥的访问同步代码; 可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到 阅读全文
posted @ 2023-03-29 22:56 zhengbiyu 阅读(79) 评论(0) 推荐(0)
摘要: volatile是 Java 中的一个关键字,当一个变量是共享变量,同时被 volatile 修饰当值被更改的时候,其他线程再读取该变量的时候可以保证能获取到修改后的值,通过 JMM 屏蔽掉各种硬件和操作系统的内存访问差异 以及 CPU 多级缓存等导致的数据不一致问题。 需要注意的是,volatil 阅读全文
posted @ 2023-03-29 21:58 zhengbiyu 阅读(70) 评论(0) 推荐(0)
摘要: Happens-Before 程序顺序原则:如果程序操作 A 在操作 B 之前,那么多线程中的操作依然是 A 在 B 之前执行。 监视器锁原则:在监视器锁上的解锁操作必须在同一个监视器上的加锁操作之前执行。 volatile 变量原则:对 volatile 修饰的变量写入操作必须在该变量的读操作之前 阅读全文
posted @ 2023-03-29 21:52 zhengbiyu 阅读(30) 评论(0) 推荐(0)
摘要: JMM(Java Memory Model,Java 内存模型) JMM 是一个抽象概念,由于 CPU 多核多级缓存、为了优化代码会发生指令重排的原因,JMM 为了屏蔽细节,定义了一套规范,保证最终的并发安全。它抽象出了工作内存与主内存的概念,并且通过八个原子操作以及内存屏障保证了原子性、内存可见性 阅读全文
posted @ 2023-03-29 21:50 zhengbiyu 阅读(107) 评论(0) 推荐(0)
摘要: 双重检查(单例模式) class Singleton{ private volatile static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(inst 阅读全文
posted @ 2023-03-29 20:14 zhengbiyu 阅读(37) 评论(0) 推荐(0)
摘要: 为了支持 JMM,Java 定义了 8 种原子操作(Action),用来控制主存与工作内存之间的交互: read 读取:作用于主内存,将共享变量从主内存传动到线程的工作内存中,供后面的 load 动作使用。 load 载入:作用于工作内存,把 read 读取的值放到工作内存中的副本变量中。 stor 阅读全文
posted @ 2023-03-29 20:03 zhengbiyu 阅读(331) 评论(0) 推荐(0)
摘要: 在遍历对象图的过程中,把需要遍历的对象按照“是否访问过”分为以下三种颜色。 白色:表示对象尚未被垃圾回收器访问过。显然,在可达性分析刚刚开始的阶段,所有的对象都是白色的,若在分析结束的阶段,仍然是白色的对象,即代表不可达。 黑色:表示对象已经被垃圾回收器访问过,且这个对象的所有引用都已经扫描过。黑色 阅读全文
posted @ 2023-03-29 19:56 zhengbiyu 阅读(121) 评论(0) 推荐(0)
摘要: G1抛弃了之前的分代收集的方式,面向整个堆内存进行回收,把内存划分为多个大小相等的独立区域Region。 一共有4种Region: 自由分区Free Region 年轻代分区Young Region,年轻代还是会存在Eden和Survivor的区分 老年代分区Old Region 大对象分区Humo 阅读全文
posted @ 2023-03-29 19:54 zhengbiyu 阅读(518) 评论(0) 推荐(0)
摘要: DDD是复杂系统设计方法论,核心设计思想:将对软件的分析与设计还原到真实世界中。 系统增删改的业务适用于领域驱动设计,数据分析场景不适合。例:订单与订单明细场景,统计所有订单明细的商品,不可能去查询出订单,再查出订单明细,再统计商品数据分析。 实体 通过一个唯一标识来区分真实世界中每一个个体的领域对 阅读全文
posted @ 2023-03-29 19:41 zhengbiyu 阅读(117) 评论(0) 推荐(0)
摘要: 分析 包含下面的过程: 首先,将一块文本分成适合于倒排索引的独立的 词条 , 之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者 recall 分析器执行上面的工作。 分析器 实际上是将三个功能封装到了一个包里: 字符过滤器 首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前 阅读全文
posted @ 2023-03-29 19:38 zhengbiyu 阅读(61) 评论(0) 推荐(0)
摘要: 正排索引:key-value 中,通过 key 去寻找 value。 倒排索引:通过 value(或包含 value)去寻找对应的 key。 正排索引需要首先对全局进行扫描遍历,进而从中做筛选;而倒排索引可以仅抽取符合条件的 value 值,节省大量的资源。 每个被索引的字段都有自己的倒排索引,是否 阅读全文
posted @ 2023-03-29 19:37 zhengbiyu 阅读(67) 评论(0) 推荐(0)
摘要: index属性 analyzed:分词后索引,可搜索。 not_analyzed:字段值不分词,以单个关键词进行索引。 no:字段不索引,当然也就不能搜索。 store属性 属性store默认false,当某个数据字段很大,我们可以指定其它字段store为true,这样就不用从_source中取数据 阅读全文
posted @ 2023-03-29 19:36 zhengbiyu 阅读(273) 评论(0) 推荐(0)
摘要: 事务消息需要消息队列提供相应的功能才能实现,Kafka和RocketMQ都提供了事务相关功能。 以在电商平台上下单购物的场景为例: 订单系统要保证订单创建后一定能发消息通知到购物车系统。 首先,订单系统在消息队列上开启一个事务。然后订单系统给消息服务器发送一个“半消息”,这个半消息不是说消息内容不完 阅读全文
posted @ 2023-03-29 17:52 zhengbiyu 阅读(248) 评论(0) 推荐(0)
摘要: 大数据存储场景下为什么这么难? 为了追求高性能,进行数据分片 performance -> sharding 为了容错 faults -> tolerance,需要数据复制,多副本 tolerance -> replication 为了维护primary数据与replicate副本的数据一致性 re 阅读全文
posted @ 2023-03-29 17:37 zhengbiyu 阅读(68) 评论(0) 推荐(0)
摘要: 什么情况适合使用压缩? 在使用压缩之前,首先你需要考虑,当前这个场景是不是真的适合使用数据压缩。 比如,进程之间通过网络传输数据,这个数据是不是需要压缩呢?我和你一起来对比一下: 不压缩直接传输需要的时间是: 传输未压缩数据的耗时。 使用数据压缩需要的时间是: 压缩耗时 + 传输压缩数据耗时 + 解 阅读全文
posted @ 2023-03-29 17:35 zhengbiyu 阅读(42) 评论(0) 推荐(0)
摘要: 全局严格顺序 如果业务必须要求全局严格顺序,就只能把消息队列数配置成 1,生产者和消费者也只能是一个实例,这样才能保证全局严格顺序。 局部有序 大部分情况下,我们并不需要全局严格顺序,只要保证局部有序就可以满足要求了。比如,在传递账户流水记录的时候,只要保证每个账户的流水有序就可以了,不同账户之间的 阅读全文
posted @ 2023-03-29 17:21 zhengbiyu 阅读(235) 评论(0) 推荐(0)
摘要: 消息模型 RocketMq、JMQ模型分别为Broker、Topic、Queue。 Kafka:将Queue换成Partition。 消费者、MQ、生产者关系图 假设有一个主题 MyTopic,我们为主题创建 5 个队列,分布到 2 个 Broker 中。 假设我们有 3 个生产者实例:Produe 阅读全文
posted @ 2023-03-29 17:19 zhengbiyu 阅读(98) 评论(0) 推荐(0)
摘要: 确保消息可靠传递 一条消息从生产到消费完成这个过程,可以划分三个阶段,为了方便描述,我给每个阶段分别起了个名字。 生产阶段: 在这个阶段,从消息在 Producer 创建出来,经过网络传输发送到 Broker 端。 存储阶段: 在这个阶段,消息在 Broker 端存储,如果是集群,消息会在这个阶段被 阅读全文
posted @ 2023-03-29 16:51 zhengbiyu 阅读(38) 评论(0) 推荐(0)
摘要: 用幂等性解决重复消息问题 一般解决重复消息的办法是,在消费端,让我们消费消息的操作具备幂等性。 幂等(Idempotence) 本来是一个数学上的概念,它是这样定义的: 如果一个函数 f(x) 满足:f(f(x)) = f(x),则函数 f(x) 满足幂等性。 这个概念被拓展到计算机领域,被用来描述 阅读全文
posted @ 2023-03-29 16:46 zhengbiyu 阅读(89) 评论(0) 推荐(0)
摘要: LSM简介Log Structured Merge Tree,下面简称 LSM。2006年,Google 发表了 BigTable 的论文。这篇论文提到 BigTable 单机上所使用的数据结构就是 LSM。目前,LSM 被很多存储产品作为存储结构,比如 Apache HBase, Apache C 阅读全文
posted @ 2023-03-29 16:39 zhengbiyu 阅读(1350) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2023-03-29 16:36 zhengbiyu 阅读(9) 评论(0) 推荐(0)
摘要: Redis通过内置的lua编译/解释器,可以使用EVAL命令对lua脚本进行求值。 脚本的命令是原子的,RedisServer在执行脚本命令中,不允许插入新的命令;同时脚本的命令可以复制,RedisServer在获得脚本后不执行,生成标识返回,Client根据标识就可以随时执行。 EVAL命令 通过 阅读全文
posted @ 2023-03-29 16:13 zhengbiyu 阅读(250) 评论(0) 推荐(0)
摘要: Redis目前支持两种持久化的方式,RDB和AOF。RDB文件是压缩后的二进制文件,AOF记录的是每一次写操作的命令。所以一般来说AOF文件比RDB占用内存大。 RDB RDB(RedisDataBase)是基于快照(snapshoptting)实现的。redis在运行时会在满足一定条件的情况下将运 阅读全文
posted @ 2023-03-29 16:02 zhengbiyu 阅读(27) 评论(0) 推荐(0)
摘要: Redis 应对数据量增多的两种方案:纵向扩展(scale up)和横向扩展(scale out)。 纵向扩展:升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。 优势:简单、直接 劣势: 当数据量过大时,使用RDB对数据进行持久化时,需要的内存也会增加, 阅读全文
posted @ 2023-03-29 15:54 zhengbiyu 阅读(110) 评论(0) 推荐(0)
摘要: 用在非public方法 @Transactional是基于动态代理的,Spring的代理工厂在启动时会扫描所有的类和方法,并检查方法的修饰符是否为public,非public时不会获取@Transactional的属性信息,这时不会生成动态代理对象。 同一个类中,非@Transactional方法调 阅读全文
posted @ 2023-03-29 15:09 zhengbiyu 阅读(92) 评论(0) 推荐(0)
摘要: 加载过程 load BeanDefinition merge BeanDefinition(GenericBeanDefinition -》RootBeanDefinition) 不存在parent,直接创建RootBeanDefinition 存在parent,复制新的RootBeanDefini 阅读全文
posted @ 2023-03-29 14:59 zhengbiyu 阅读(53) 评论(0) 推荐(0)
摘要: 普通 内部拦截器,threadlocal变量set上下文context。 父子线程传递 InheritableThreadLocal Thread内部为InheritableThreadLocal开辟了一个单独的ThreadLocalMap。在父线程创建一个子线程的时候,会检查这个ThreadLoc 阅读全文
posted @ 2023-03-29 11:53 zhengbiyu 阅读(253) 评论(0) 推荐(0)
摘要: 基本概念 对称加密 通信双方使用同一个密钥进行加密解密。 例:AES。 非对称加密 服务端用私钥加密,客户端用公钥解密。 公钥加密的数据只能用私钥解密,私钥加密的数据只能用公钥解密。 例:RSA。 摘要 通过摘要算法为原文生成固定长度的内容摘要,且摘要无法被逆向得到原文,不同的内容极大概率(绝大多数 阅读全文
posted @ 2023-03-29 10:42 zhengbiyu 阅读(51) 评论(0) 推荐(0)