自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 正则表达式

eg: 匹配 ‘Is is the cost of of gasoline going up up’ 字串中相同的连续字串.匹配到的内容,会被正则引擎放到缓冲区中.缓冲区编号从1开始,最大到99.如果想引用前面缓冲区匹配到的内容, 用。表示第一个缓冲区匹配到的内容.反向引用的最简单的、最有用的应用之一,是匹配出文本中两个相同的相邻单词字串.: 以 exp2 为定位, 匹配 exp2 前面的 exp1。: 匹配 exp1, 但不要在 exp2 后面。: 匹配 exp2 后面的 exp1。

2024-04-12 18:08:40 726

原创 抽象分类,接口,继承和组合

这就体现了继承实现维度, 其实是一种排列组合的类定义方式, 造成父类爆炸: 一方面可读性降低: 要高清一个具体实现类的逻辑, 必须阅读父类的代码、父类的父类的代码 ……一直追溯到最顶层父类的代码。子类的实现依赖父类的实现,两者高度耦合,一旦父类代码修改,就会影响所有子类的逻辑。answer: 因为接口是完全没有实现逻辑的, 所以“接口”就是一组“协议”或者“约定”, 相当于一个类的模板, 是对一段逻辑的完全抽象. 子类通过"填空"的方式去实现一段具体逻辑. 同时也增强了代码可读性, 先读接口提出主干脉络。

2024-03-14 18:15:16 834

原创 Redis 布隆过滤器

置为1, 但并不真实记录元素的存在. 所以, 布隆过滤器要想在达到初始大小后增加元素, 会创建一个新的byte数组 “stack” 在原数组之上. 添加一个元素要完成2步:先哈希 bpe 次, 确保在原数组中不存在;再哈希 bpe 次, 在新数组中设置为1. 新数组的长度一般会比旧数组长, 等于 len(旧数组) * EXPANSION, EXPANSION 默认为2. 增大长度可以减小再次装满的可能性。次哈希, 多了n倍. 插入时也多了 n 倍(确保 stack 的 n 个数组都不存在)

2024-01-25 14:01:28 785

原创 Roaring Bitmap 原理

数组初始长度为4,随着数据的增多会自动扩容(但数组的最大长度就是4096, 即 ArrayContainer 最大占用从初始的 4 * 2B=8B, 到最大 4096 * 2B = 8KB)。问题.具体上讲, Roaring bitmaps 将1个 32 位整数集合, 按照高 16 位分桶(container),最多可分。当桶内数据的个数大于4096时,会采用它来存储,其本质上是长度固定为。当桶内数据的个数不大于4096时,会采用它来存储,其本质上是一个。位(8KB)的传统 bitmap (存储。

2023-07-06 17:01:07 146

原创 1-设计思想,原则,模式在研究什么

设计思想.原则,模式学什么

2022-09-01 14:41:27 106 1

原创 spark streaming - kafka 最佳实践

kafka 分区和 rdd partition 一一对应, 但这种对应关系在 shuffle 操作后破坏LocationStrategies: spark executor 和 kafka partition 的映射策略streaming 任务需要在幂等输出后存储 offset, 方法:(1) rdd checkpoint (X) : 该操作会附带 rdd 的 offset,(2) 用 kafka 的 commitOffset api 提交, offset 保存在 kafka 的队列中...

2021-10-14 15:00:36 137

原创 spring bean生命周期四步

生命周期顺序为:aware 接口BeanPostProcessor.postProcessBeforeInitialization()InitializingBean.afterPropertiesSetBeanPostProcessor.postProcessAfterInitialization()这个顺序是 beanfactory 类里面调用的, 以 AbstractAutowireCapableBeanFactory 为例protected Object initializeBean

2021-07-10 18:24:46 117

原创 ThreadLocal 实现

一. ThreadLocal 如何实现和每个 Thread 绑定, 从而避免线程安全问题ThreadLocal 的类结构ThreadLocal 有静态内部类 ThreadLocalMap, ThreadLocalMap 有静态内部类 Entry. Entry 是键值对, 存储<ThreadLocal, Object>. 就是说每个 ThreadLocal 对象对应一个 object 的value.每个 thread 对象都有唯一的 threadLocalMap 属性, 而 thre

2021-07-10 14:23:21 211

原创 mysql 性能查询 sql

mysql qps 计算如下 a / b-- 处理的查询次数: aSHOW STATUS /*global*/ LIKE 'Que%'; -- 服务时间数量: b SHOW STATUS LIKE '%uptime%';

2021-07-02 15:48:46 92

原创 spring aop(二) JdkDynamicAopProxy 代理执行过程

本文来分析 Spring 中 JdkDynamicAopProxy 代理对象的生成 getProxy() 方法和拦截增强 invoke 方法的相关处理逻辑。上文我们研究过了 Pointcut 和 Advice(Advisor)接口以及它们在 Spring AOP 代理中的作用,并利用几个 Demo 演示了其相关关系。为了方便阅读,把上文中的 ProxyFactoryDemo 类代码再次贴出来。public class ProxyFactoryDemo { public static void ma

2021-06-30 21:14:57 362

原创 spring aop(一) pointcut 和 advicor

先看一个使用 Spring AOP 代理的 Demo, 理解最初流程public class ProxyFactoryDemo { public static void main(String[] args) { // 1. 构造目标对象 Cat catTarget = new Cat(); // 2. 通过 target 对象,构造 ProxyFactory 对象 ProxyFactory factory = new ProxyFa

2021-06-30 18:03:45 260

原创 JDK 动态代理实现内幕

1. jdk 动态代理使用要求:jdk 动态代理要求被代理的对象至少实现一个接口。代理逻辑:jdk 会先产生一个继承 Proxy 类,并实现所有目标对象 implement 接口的代理类,然后调用代理类的构造方法(参数类型为 InvocationHandler)。代理类会:复写目标对象所有 implement 接口的所有方法,还会对 Object 类中的 equals, toString, hashCode 方法进行复写这些方法内部都是使用 InvocationHandler 对象的 inv

2021-06-30 00:40:17 95

原创 springboot SPI 实现自动配置

1. Java类加载器资源查找的过程ClassLoader 类中资源查找有2种一种是 classLoader 对象的实例方法,在 classsLoader 对象的目录范围内查找// ClassLoader.javapublic Enumeration<URL> getResources(String name) throws IOException { @SuppressWarnings("unchecked") Enumeration<URL>[] tmp

2021-06-29 17:51:43 451

原创 ClassLoader双亲委派模型与SPI

1. ClassLoader 的 parent 层级jvm 中的类都是由类加载器加载的, 类加载器本身也是一个对象,所以我们说的 ClassLoader 是一个可以加载类的对象。jvm 内置了三个进程内唯一的类加载器对象,此外用户也可以用 new 实例化自己的类加载器对象。jvm 自身维护了内置的三个类加载器对象和自己实例化的类加载器对象之间的 parent 层级关系,表现为:由 C++ 实现的顶级 BootStrap加载器:因为是 C++ 实现,如果打印这个类加载器对象,表示为 null。负责加载

2021-06-29 01:25:34 250

原创 行为型 - 策略模式 (解耦策略的定义, 创建, 使用)

设计原则和设计思想, 远比设计模式普适和重要, 掌握设计原则和思想, 甚至可以自己创建出设计模式策略模式是将策略的 定义, 创建, 使用 三部分解耦1. 策略的定义// 策略. 算法的接口public interface Strategy { void algorithmInterface();}public class ConcreteStrategyA implements Strategy { @Override public void algorithmInterfac

2021-06-25 13:43:51 312

原创 linux 五种 IO 模型

一. 同步异步,阻塞非阻塞与数据二次拷贝1. 同步异步: 任务的执行顺序上区分同步: 指一个任务, 只有当另一个任务返回后才能继续执行本任务异步: 指一个任务只是发起一个通知告诉另一个任务可以执行了, 然后就继续执行自身的任务同步可以保证2个任务的执行顺序, 而异步不能2. 阻塞和非阻塞: 线程等待状态上区分阻塞: 一个线程如果在等待另一个线程返回时, 自身处于挂起状态, 就是阻塞的非阻塞: 反之则是非阻塞3. 同步阻塞和同步非阻塞同步表示必须保证任务顺序, 阻塞表示线程等待另一个

2021-06-23 11:57:38 497

原创 InnoDB 索引

1. 聚集索引聚集索引是按照表的主键构造的一个 B+ 树该树的叶子节点存放整张表的行记录,叶子节点也成为数据页,每个数据页都由一个双向链表进行连接该树的非叶子节点由主键值构成,非叶子节点也叫索引页聚集索引不仅对随机访问支持的好, 而且能够非常快的针对范围值进行查询,因为叶子节点被链表链接支持顺序访问,查询优化器在某一段的数据页进行扫描,且叶子节点的数据就是用户要查询的数据。2. 辅助索引辅助索引的叶子节点不包含整行数据,而是只包含辅助索引键值和对应的主键键值。辅助索引的存在不会影响数据在聚集

2021-06-22 01:34:50 194

原创 snowflake 分布式id

64 bit 数第一位0 预留位, 正数41 bit: 时间戳 相当于69年的时间 2^64 -15 bit : 机房 id5 bit : 机器 id12 bit: 用于区分统一机房内同一机器在 1ms 内可以产生 2^12 -1 = 4096 个 id

2021-06-21 19:44:13 64

原创 ConcurrentHashMap特性

先说说 HashMap 原理吧?HashMap主要由数组和链表组成,他不是线程安全的。核心的点就是put插入数据的过程,get查询数据以及扩容的方式。JDK1.7和1.8的主要区别在于头插和尾插方式的修改,头插容易导致HashMap链表死循环,并且1.8之后加入红黑树对性能有提升。1. put 插入数据流程往map插入元素的时候首先通过对key hash然后与数组长度-1进行与运算((n-1)&hash),都是2的次幂所以等同于取模,但是位运算的效率更高。找到数组中的位置之后,(1) 如果数

2021-06-21 11:38:25 242

原创 消息队列面试题

1. 项目中为什么使用mq(1) 解耦一个模块, 调用其他多个模块的接口, 调用过程很复杂, 但又不是必须同步调用的时候, 就可以将这个调用最为一条消息放在mq里, 让被调用者取订阅相关的消息, 此时被调用的那几个模块就可以从mq里得知有一个模块调用我了不用考虑对方调用是否成功, 超时, 失败重试等主要是应用了消息队列的pub-sub模型(2) 异步不用mq的同步高延时场景:还是以上场景, 模块A要分别调用模块B, 模块C, 模块D; 假设BCD三个模块分别处理3条sql, 5条sql,

2021-06-21 00:48:43 225

原创 concurrent 笔记 - volatile 与 Synchronized 关键字

一. volatilevolatile的语义Java内存模型对volatile关键字定义了一些特殊规则. 首先从volatile的语义开始说起, 再得出Java内存模型对volatile设定的几个规则1. 禁止volatile代码附近指令重排(1) 何为指令重拍?普通变量只能保证在依赖其他变量的结果进行计算时可以获得正确结果, 但不能保证变量的赋值顺序和代码中的顺序一致. 这也是满足了Java内存模型中线程内部表现为串行的语义. 指令重拍是机器级的优化, CPU往往会把赋值操作的语句和不依赖该

2021-06-21 00:44:14 178

原创 concurrent 笔记 - 有界阻塞队列实现

阻塞队列的实现1. 有界队列队列中的元素个数有限, 队列为空时, get 操作或阻塞, 队列满时, add 操作会阻塞。常见的有界队列时 ArrayBlockingQueue 和 LinkedBlockingQueue.有界队列的写法, 一般是有一把全局大锁同步读写操作,notFull 和 notEmpty 两个 Condition 作为条件谓词进行空满检验。 ArrayBlockingQueue 和 LinkedBlockingQueue也是这样实现的, 不同的是前者只有一把大锁, 读写没有分离;

2021-06-20 19:02:22 222

原创 JCU-线程栅栏CountDowLatch与CyclicBarrier,Exchanger

CountDowLatch用法(1) CountDowLatch 用来同步一个或多个线程, 强制这些线程等待由其它线程执行的一组操作完成(2) 可以向 CountDowLatch 设置一个初始计数, 任何在这个对象上调用wait()方法的线程都会阻塞挂起, 等待内部计数值为0 ; 其它线程在完成工作时, 可以调用 CountDowLatch 的countDown()方法来减小计数值(3) CountDowLatch的计数值不能被重置, 因此, 一旦一个CountDowLatch对象的计数值到达0

2021-06-20 16:24:47 149

原创 JCU-futuretask如何实现

一. Future是什么?1. Future是什么?JDK 的 Future 就类似于我们网购买东西的订单号,当我们执行某一耗时的任务时,我们可以另起一个线程异步去执行这个耗时的任务,同时我们可以干点其他事情。当事情干完后我们再根据 future 这个"订单号"去提取耗时任务的执行结果即可。因此 Future 也是多线程中的一种应用模式。扩展: 说起多线程,那么 Future 又与 Thread 有什么区别呢?最重要的区别就是 Thread 是没有返回结果的,而 Future 模式是有返回结果的。

2021-06-20 15:54:21 263

原创 线上debug的一般步骤

线上问题排查套路df, free ,top 三连jstack, jmap 查jvm一. CPU 查看线程总览可以先用 pstree -p [pid] | wc -l 看看进程内部的线程个数是否合理,[@js_38_140 platform-new]# pstree -p 30081 | wc -l104然后再使用 jstack 查看某个线程top -H -p pid 查看线程-H: 进入线程模式, 显示 CPU 利用率高的线程printf '%x \n' threadId

2021-06-17 00:14:50 989

原创 G1 与 ParNew + CMS 收集器

G1 内存划分G1 提供延迟和吞吐量之间的平衡, 有可预测的 gc 停顿时间-XX:+UseG1GC 开启 G1 收集器 (G1 是标记复制, CMS 是标记清除)g1 取消 青年代, 老年代的空间划分, 不必担心每个代内存是否足够. 取而代之的是,将堆划分为若干个区域(Region), 这些区域的身份可以互相转化,分为:(1) Eden 区域 (2) Survior 区域 (3) old 区域 (4) 新加的 humongous 区域.所以 G1 其实仍然属于分代收集器, 只是这些代不

2021-06-15 19:35:14 863

原创 TCP协议

TCP的设计目标TCP与UDP的重要区别在于:TCP充分实现了数据传输时的各种控制功能: 可以在丢包时控制重发, 可以对顺序乱掉的分包进行顺序控制TCP是面向连接的协议: 只有在确认对方存在的情况下才会发送数据, 从而控制流量的浪费TCP的设计目标设计的目的是, 保证数据报的可靠性传输. 因此需要考虑很多事情: 比如数据报的破坏, 丢包, 重复, 乱序到达等问题. 针对这些问题, TCP使用检验和(数据破坏), 序列号(乱序), 确认应答(可靠性), 重发控制, 连接管理和窗口移动等机制实

2021-06-12 08:45:24 468 1

原创 spring-boot自动配置 mybatis 实现

spring boot 自动配置 Mybatismybatis-spring-boot-autoconfigure 中的 spring.factories 中, 配置了 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration 这个 @Configuration 类。@org.springframework.context.annotation.Configurationpublic class MybatisAutoConfigur

2021-06-11 00:30:35 222

原创 分布式CAP原则和BASE理论

因为服务之间通过网络进行通信, 网络通信是可能产生问题的, CAP 就是处理网络问题权衡的原则一致性 Consistency数据的分布式存储下, 数据库存在主从读写分离的操作. 写向主数据库写, 读从从数据库读. 如果主数据库写完就表示操作完成, 由于数据还未同步到从数据库, 此时从从数据库中会读不到这个数据, 用户的反应是"明明写成功了, 为什么还读不到?", 从而造成数据的不一致性. 解决方法是: 当从数据库数据同步完毕, 才表示写操作完成一致性的实现:由于数据存在主从同步, 写操作的响应会有

2021-06-11 00:03:23 90

原创 InnoDB 锁机制

1. Locking Read 示例场景一 (for share):假设想要在一个名叫 child 的表中插入新 row, 前提要确保在名叫 parent 的表中包含一个 parent row. 想要确保引用的完整性, 可以按照如下步骤组织代码:首先, 不能使用 noblocking read 读取 parent row 的方式, 检查 parent row 是否存在. 因为其他的事务可能在你 select 和 insert 操作之间, 把 parent row 删除了. 而你这个事务却意识不到

2021-06-10 18:53:42 328

原创 AQS 同步器

条件等待队列每个对象都可以作为一个"条件等待队列", 正如每个对象都可以作为"锁"一样. 对象的 “条件等待队列” API有2个``wait()` - wait() 要写在 while 循环内while( 条件检查 ) { obj.wait()}因为线程可能被错误唤醒, 所以wait醒来后要再次检查等待条件notify()jvm 从对象的条件等待队列中选择1个线程进行唤醒.这个操作是危险的, 因为可能造成``信号丢失问题. 线程B使用obj.notify()唤醒了线程A, 而线程

2021-06-09 20:07:20 97

原创 ThreadPool 框架分析

一. 构造参数和属性含义corePoolSize: 池子中保持的线程数量, 即使空闲, 也不会销毁maximumPoolSize: 池子中最大的线程数keepAliveTime: 当池子中线程数量大于 corePoolSize 时, 哪些空闲的线程多久会 timeout 被销毁workQueue: 待执行的任务池RejectedExecutionHandler 拒绝策略: 默认 AbortPolicy, 直接抛出异常// 全局的 worker 列表private final HashSet&l

2021-06-08 16:07:49 95

原创 spring-boot 集成 mybatis 实现事务

1. spring 事务管理接口spring 使用 PlatformTransactionManager 接口管理事务public interface PlatformTransactionManager { TransactionStatus getTransaction( TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus

2021-06-07 19:50:15 614

原创 spring AOP 讲解

一. Spring AOP 概念Aspect:一个模块化的概念, 表示一个横跨多个 class 的 切面.tansaction management 就是一个切面的例子join point:程序执行过程中的一个点, 比如执行一个方法或是进行异常处理. Spring aop 中, join point 通常表现为一个方法的执行Advie (通知, 增强):切面 (Aspect) 在某个 join point (表现为一个方法) 上执行的动作. 该动作有不同形式(before, after,

2021-06-07 16:55:49 88

原创 spring boot 对 mybatis 的自动配置

spring boot 自动配置 Mybatismybatis-spring-boot-autoconfigure 中的 spring.factories 中, 配置了 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration 这个 @Configuration 类。@org.springframework.context.annotation.Configurationpublic class MybatisAutoConfigur

2021-06-06 18:25:29 517 1

原创 spring boot 与 servlet 的集成

1. Servlet 2.0 配置 servlet 的方法早先的 web.xml 配置配置中, 分2步骤: ContextLoaderListener 初始化 WebApplicationContext; 和 DispatcherServlet 初始化的子容器.接下来分别看这两个容器是怎么初始化的<!-- [1] Spring配置 ContextLoaderListener 会初始化 Root Spring WebApplicationContext 容器 --><

2021-06-05 15:54:53 345

原创 spring boot 启动源码分析

spring boot 启动流程@SpringBootApplication // (1) 标明是 spring boot 应用, 开启自动配置public class Example { public static void main(String[] args) { // (2) SpringApplication.run() xxx启动 spring boot 应用 ConfigurableApplicationContext context = Spr

2021-05-31 10:52:27 184

原创 计算器实现

一. 计算器的实现有几个问题1. 读取操作数因为表达式中的操作数可能是多位实数.这就要求读到一个数字时,先不能参与运算,要进入一个操作数缓存栈中,直到读取的表达式字符不是数字时,再把这个操作数缓存栈中的数字一次弹出*10n,结果加入真正的操作数栈2. 何时执行操作符运算:读到操作符时也不能直接运算,因为后面可能有操作级别更高的操作符. 此时只能先把操作符进入操作符栈,直到遇到表达式中的字符优先级,比操作符栈栈顶元素的优先级低时,才能对操作符栈顶的运算符运算 (只要出现的操作符比前一个操作符优先级低,

2021-05-30 15:49:26 705

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除