- 博客(135)
- 收藏
- 关注
原创 cache更新策略
Write Behind Caching 更新模式就是在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。Read Through 套路就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。只有同步更新没有异步更新时,多线程进行更新会存在问题,db先A后B,缓存先B后A;
2025-04-08 16:37:58
235
原创 JVM即时编译(JIT)
1.即时编译-将Java字节码编译成可优化可复用的机器码,运行在底层硬件之上,这么做是为了提高代码的执行效率,提高性能峰值,其触发点是热点代码,热点代码是通过方法的调用次数或者回边循环的次数来筛选的2.分层编译的引入是为了让即时编译更具备灵性,使得虚拟机可以根据实际运行情况以及相应的算法动态选择执行代码的编译路径,通常情况下,热点方法会先被解释执行,然后被C1编译,再被C2编译分层编译是一种折衷的方式,既能够满足部分不热的代码能够在短时间内执行完成,也能满足很热的代码能够拥有最好的优化、执行效率.
2025-04-08 16:36:02
750
原创 常见限流方式
计数器: if(GET(key)){ // 1.1自增后判断是否大于最大值,并返回结果 if(INCR(key) > maxPermit){ returnfalse; } returntrue; } //不存在key,则初始化key SET(KEY,1); EXPIRE(KEY,3); returntrue; 存在问题:单时间段轮换会存在重合时间段超发的情况。 解决:...
2021-09-17 17:43:17
245
转载 Spring - 三级缓存解决循坏依赖
作者:青石路www.cnblogs.com/youzhibing/p/14337244.html写作背景做 Java 开发的,一般都绕不开 Spring,那么面试中肯定会被问到 Spring 的相关内容,而循环依赖又是 Spring 中的高频面试题这不前段时间,我的一朋友去面试,就被问到了循环依赖,结果他还在上面还小磕了一下,他们聊天过程如下面试官:说下什么是循环依赖朋友:两个或则两个以上的对象互相依赖对方,最终形成闭环。例如 A 对象依赖 B 对象,B 对象也依赖 A 对象...
2021-03-17 17:08:26
475
1
原创 基于Eureka远程调用时FeignClient注解参数的含义
@FeignClient(value = "service-provider", url = "http://test.com", configuration = FeignConfiguration.class)public interface ServiceRpc { //}如上,注解参数中,value代表服务提供者注册在eruka中的name,url代表服务提供者的直接地址,configuration是我们自己feign相关的一些配置;要注意,同时配置value和url时.
2020-07-02 15:23:49
1836
原创 maven - 打包命令跳过PMD、checkstyle、test
mvn clean install -Dpmd.skip=true -Dcheckstyle.skip=true -DskipTests
2020-05-18 20:34:03
3423
原创 规则引擎 - Drools的使用
关于规则引擎https://www.jianshu.com/p/d136a76e1c0d场景项目遇到下步执行动作决策的业务,场景不同于常见的规则性业务,但也可以应用于规则引擎之中,剥离掉代码中大量的逻辑判断、同时加快决策结果的输出。可见规则的定义是比较泛的,技术组件的应用也不是一成不变的。Drools的优点简化系统架构,优化应用 提高系统的可维护性和维护成本 方便系统的整合...
2020-04-27 14:57:00
422
原创 SpringBoot - 条件注解@Conditional...
作用当我们在启动Spring 容器加载Bean时,想要限制某些Bean在某些条件下才被加载到容器中,这是我们即可通过注解@Conditional...,当然该注解下绝大条件。注解详情通过查看可以看到@Conditional有很多注解,功能相同,适用于不同的条件 ConditionalOnBean:当容器中加载了某个Bean时,该注解下的Bean才会被加载 C...
2020-04-22 16:24:52
369
转载 kafka - acks参数的作用与影响
逐步讲解KafkaProducer配置acks参数的影响1)如何保证宕机的时候数据不丢失?如果要想理解这个acks参数的含义,首先就得搞明白kafka的高可用架构原理。比如下面的图里就是表明了对于每一个Topic,我们都可以设置他包含几个Partition,每个Partition负责存储这个Topic一部分的数据。然后Kafka的Broker集群中,每台机器上都存储了一些Pa...
2020-01-17 11:18:29
1079
原创 Feign - 理解使用
最近在整合项目的RPC调用,对Feign有了更多对一些理解Feign它是一个声明式WebService客户端.,它支持多种注解,Feign自带注解以及JAX-RS标准的注解.Feign也支持可拔插式的编码器和解码器.即我们可以自定义编码器、解码器、错误处理器;Spring Cloud是对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters....
2020-01-08 20:54:20
434
原创 lombak引发的对equals和hashcode方法理解
覆盖equals时请遵守通用约定:自反性(reflexive)。对于任何非null的引用值x,x.equals(x)必须返回true。 对称性(symmetric)。对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。 传递性(transitive)。对于任何非null的引用值x、...
2019-12-17 11:08:28
270
原创 Spring - retry重试机制
关于spring-retry有些时候我们对于的一些行为遭遇到意外时需要重试时,如远程调用其他接口失败,数据相关的事务失败,这时我们就需要重试机制了。spring-retry通过注解声明式的解决重试机制,功能齐全,简单好用。主要注解@EnableRetry :加在主类上,声明启用重试机制@SpringBootApplication@RestController@EnableCa...
2019-12-03 17:32:46
368
原创 Feign - 基础使用
关于FeignFeign通过注解声明的方式简单化的实现了Http的相关调用,使我在以http方式调用远程接口时更加简单,代码也更加简洁,只需要创建接口,增加相关的注解就可以了。使用引入相关包 <dependency> <groupId>org.springframework.cloud</groupId...
2019-11-22 12:22:25
201
原创 单测 - JUnit搭配PowerMock单测实践
为什么单测要使用Mock工具单元测试是要遵守可重复执行,故测试用例不应该依赖外部环境以及下游服务,避免不必要的问题;Mock工具就是为了满足这一需求的,它可以帮我们mock(模仿)出外部依赖对象,这样我们的测试用例不依赖于下游服务的状态,同时可以自主控制方法的返回值,或者执行特定行为甚至返回异常。为什么单测要使用PowerMock首先,PowerMock就是Mock的一种实现工具库...
2019-11-05 17:35:06
394
原创 单测 - 需要知道的点
1、好的单元测试必须遵守AIR原则。说明:单元测试在线上运行时,感觉像空气(AIR) —样并不存在,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。A: Automatic(自动化):不需要人为手动检查通过结果l:lndependent(独立性)单测中使用的数据不应该依赖于运行环境,所需的数据应该是测试用例的一部分 单测中调用...
2019-11-05 11:51:25
441
原创 Java - 项目路径问题浅析
遇到的一个Java项目路径问题文件位置:天真的以为直接用相对路径就可以获取文件: File file = new File( "src/main/resources/test.xlsx"); FileOutputStream out = new FileOutputStream(file); System.out.println("文...
2019-10-16 15:45:38
292
转载 RESTful风格是什么
RESTful风格是一种架构思想,而不是接口设计指南。RESTful以资源、状态转移等为核心概念来对业务建模及架构设计,适用于基于互联网的分布式系统,平时大家常说的接口地址要使用名词之类的规定只是为了体现资源的概念。与非RESTful相比,在可用性,稳定性,尤其是可扩展性等方面有很大优势。http协议(如下)就是RESTful的典型实现,在互联网高速发展的近二十年中,以不变应万变,至今毫不...
2019-10-10 21:34:48
2928
原创 Hive - 基础入门
关于Hive官方定义:The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.即:Hive是一种用类SQL语句来协助读写、管理那些存储在分布式存储系统上大数据集的数...
2019-07-30 11:21:01
150
原创 分布式理论 - 数据分布的方式
数据分布方式 所谓分布式系统顾名思义就是利用多台计算机协同解决单台计算机所不能解决的计算、存储等问题。单机系统与分布式系统的最大的区别在于问题的规模,即计算、存储的数据量的区别。将一个单机问题使用分布式解决,首先要解决的就是如何将问题拆解为可以使用多机分布式解决,使得分布式系统中的每台机器负责原问题的一个子集。由于无论是计算还是存储,其问题输入对象都是数据,所以如何拆解分布式系...
2019-02-25 15:24:15
1553
原创 分布式理论 - 服务中可能出现的网络异常
网络异常 分布式服务节点间通过不可靠的网络进行通信,可能出现以下几种异常。 消息丢失 消息丢失是最常见的网络异常。对于常见的 IP 网络来说,网络层不保证数据报文(IP fragment)的可靠传递,在发生网络拥塞、路由变动、设备异常等情况时,都可能发生发送的数据丢失。由于网络数据丢失的异常存在,直接决定了分布式系统的协议必须能处理网络数据丢失的情况。 依据网络质量...
2019-02-21 16:34:09
587
原创 Java - 高效解析Execl
这里的场景是将execl放在项目下,启动项目时对其解析,加载到内存中使用。pom: <dependency> <groupId>com.monitorjbl</groupId> <artifactId>xlsx-streamer</artifactId> ...
2019-02-15 10:46:43
797
原创 Java - 函数式编程(2):常用的流操作
流操作: 即stream接口针对于集合类提供的操作。集合类.stream()集合获取到stream(流),随之进行自己想要的操作。filter():按照一定条件过滤集合的元素 。 list.stream().filter(x -> x > 5); 像filter()这类返回值为Stream的方法,它其实只是刻画出了stream,并没有产生新的集合,也就是按照规则构造出Stre...
2018-12-24 10:40:52
319
1
原创 Druid - 源码浅析(2) 获取连接
获取连接 getConnection(); public DruidPooledConnection getConnection() throws SQLException { return getConnection(maxWait); } public DruidPooledConnection getConnection(long maxWa...
2018-12-20 16:53:54
483
原创 Druid - 源码浅析(1) - 初始化
实现类DruidDataSource: 一些重要变量: private volatile DruidConnectionHolder[] connections; //存连接的数组,不一定会满 private int poolingCount = 0; /...
2018-12-20 14:35:20
579
转载 Druid - 源码分析与学习
找BUG时不得不接触到Druid源码。单看源码还是很吃力,结合下面的文章努力理解一些。原文:https://blog.youkuaiyun.com/herriman/article/details/51759479
2018-12-19 16:14:04
222
原创 Druid - SpringBoot配置数据库连接池druid
关于Druid DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,是目前最好的连接池。 yml文件配置 spring: datasource: type: com.alibaba.druid.pool....
2018-12-19 12:27:04
490
原创 Spring - yml配置文件错读数字字符串
项目中碰到一个诡异问题,yml文件中配置了一个值为字符串的属性,用@Value注入时确发现不对应,出现了全项目中都找不到的值。研究了半天才发现,yml会把0开头的数字作为8进制对待,注入时转化为十进制注入。 datasource: 0400010001所以,字符串最好要写规范了: datasource: '0400010001' ...
2018-12-11 14:58:47
5663
原创 java - 中转上传文件(有坑)
遇到一个问题,我们的服务只做代理功能,有时候需要转发文件,又不能把文件先保存下来后再读取文件上传到第三方服务器,这时候就要直接发送流文件。restTemplate(亲测有效,很费劲才找到的): class MultipartInputStreamFileResource extends InputStreamResource { private final String fi...
2018-12-05 16:38:14
1470
1
原创 Java - 使用RestTemplate代理Http请求
使用RestTemplate代理Http请求(请求方式不限),下面对POST请求的Body进行了封装。HttpEntity:请求实体。封装Body还可以用MultiValueMap。public ResponseEntity<byte[]> proxy(String prefix, HttpEntity<String> httpEntity, HttpServl...
2018-11-15 11:15:47
4011
转载 MySql - innodb不可重复读下的一些锁
MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。但是,如《InnoDB,5项最佳实践》所述,如果查询没有命中索引,也将退化为表锁。InnoDB的细粒度锁,是实现在索引记录上的。 一,InnoDB的索引InnoDB的索引有两类索引,聚集索引(Clustered Index)与普通索引(Secondary Index)。 InnoDB的每一个表都会有聚集索引:...
2018-11-12 16:36:39
892
原创 SpringBoot - 配置Druid允许批量执行SQL
Druid默认是不开启批量SQL执行的,属性为MultiStatementAllow.配置为true即可.yml文件配置:filters:stat spring: profiles: active: dev datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-nam...
2018-11-09 19:12:09
4650
原创 Java - 函数式编程(1): lambda表达式入门
关于lambda表达式 Lambda 是Jdk8推出的一个新特性,允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 Lambda表达式只支持函数式接口 也就是只有一个抽象方法的接口。用来实现接口 使用 Lambda 表达式可以使代码变的更加简洁紧凑,同时其实是在要求我们想的更多,写的更少。基础表达式写法(...
2018-09-05 11:32:54
671
转载 设计模式 - Java静态代理和动态代理
本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢?原因:1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者的区别是什么呢?2,通过学习动态代理了解到动态代理是一种符合AOP设计思想的技术,那么什么又是AOP?下面是我对它们的理解! 代理Proxy: Proxy代理模式是一种结构...
2018-09-05 09:21:21
153
转载 网络 - TCP大全
TCP/IP 中有两个具有代表性的传输层协议,分别是TCP、UDP。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。要知道TCP为了这简单描述“可靠的通信传输”背后所做的努力,你会深感佩服其强大性。TCP的特征:序列化+确认应答、超时重发、流量控制、拥塞控制等等,每一个都是为了能够可靠不丢包遗漏地将数据包传输给对方,而此篇文章将详细来解析TCP的这些精髓所在,涉...
2018-09-05 09:17:17
711
转载 分布式事务 - 2PC和3PC
协调者在分布式系统中,每一个机器节点虽然都能明确的知道自己执行的事务是成功还是失败,但是却无法知道其他分布式节点的事务执行情况。因此,当一个事务要跨越多个分布式节点的时候(比如,淘宝下单流程,下单系统和库存系统可能就是分别部署在不同的分布式节点中),为了保证该事务可以满足ACID,就要引入一个协调者(Cooradinator)。其他的节点被称为参与者(Participant)。协调者负责调度参...
2018-08-23 10:48:54
236
原创 数据库 - MySql MVCC机制
什么是MVCC MVCC:是一种多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是同时结合了MVCC机制,以处理更多的并发问题。当然Mysql中Innodb引擎才支持。MySql如何实现的MVCC InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列...
2018-08-22 16:02:25
1412
原创 常见算法 - 连续子数组最大和
public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0){ return 0; } //sum为子数组的和 int sum = array[0]; //max为子数组的最大...
2018-08-20 17:27:36
202
原创 常见算法 - 二叉搜索树与双向链表
/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { //左侧...
2018-08-20 16:41:45
246
原创 JVM - 常见配置参数
堆栈常用-Xms :初始堆大小 -Xmx :最大堆大小 -Xss :为jvm启动的每个线程分配的内存大小 -XX:NewSize=n :设置年轻代大小 -XX:NewRatio=n: 设置老年代和年轻代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值...
2018-08-14 16:35:05
334
原创 Java - 线程池参数
ThreadPoolExecutorThreadPoolExecutor是线程池的真正实现,他通过构造方法的一系列参数(不同的构造方法),来构成不同配置的线程池。 构造方法参数 corePoolSize 核心线程数,默认情况下核心线程会一直存活,即使处于闲置状态也不会受存keepAliveTime限制。除非将allowCoreThreadTimeOut设置为true。有任务来...
2018-07-18 20:06:55
839
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人