- 博客(79)
- 资源 (1)
- 收藏
- 关注
原创 ThreadLocal的内存泄漏
使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢?代码如下:public class ThreadLocalOutOfMemoryTest {static class LocalVariable {private Long[] a = new Long[1024*1024];}// (1)final static ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(6, 6, 1, TimeUnit.
2021-06-05 15:26:39
238
原创 Dubbo 集群相关问题
1.Dubbo Cluster 集群的作用是什么?简单来说:集群模块是服务提供者和服务消费者的中间层,为服务消费者屏蔽了服务提供者的情况,这样服务消费者就可以专心处理远程调用相关事宜。比如发请求,接受服务提供者返回的数据等。这就是 Dubbo Cluster 集群的作用。2.Dubbo Cluster的10个实现类你能说出来几个,其中哪几个是集群容错的方法实现?根据配置可以知道 Dubbo 集群接口 Cluster 有10种实现方法如下:其中 failover、failfast、failsaf
2021-06-05 15:15:05
306
1
原创 Spring 如何从 IoC 容器中获取对象?
从整体上分析了如何从 Spring IoC 容器获取一个 bean 对象从流程图可以看出,当获取一个 bean 对象时,Spring 会首先尝试从缓存中获取单例对象只有对象是单例的场景,即 scope 为 singleton 时才会缓存对象。这里其实涉及到了所谓的「三级缓存」,为了更容易理解三级缓存,本文先研究这个 bean 对象是什么时候放入缓存的,后面再研究三级缓存。创建 bean 对象:createBeanInstance 方法填充属性:populateBean 方法初始化 bean:i
2021-06-05 15:04:49
557
原创 MySQL 的自增 ID 用完了,怎么办?
首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。create table t0(id int unsigned auto_increment primary key) ;insert into t0 values(null);通过show命令 show create table t0; 查看表情况CREATE TABLE t0 ( id int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)) ENGINE=InnoDB
2021-06-04 11:20:38
395
原创 RabbitMQ消息队列原理及配置
一、MQ用途1、同步变异步消息场景:用户下单完成后,发送邮件和短信通知。运用消息队列之后,用户下单完之后,下单信息写入数据库,再写入消息队列,发送邮件和发送短信各自去消息队列进行读取,节省时间,提高效率。2、应用解耦场景:用户下单后,订单系统需要多渠道通知用户。a、下单服务系统:用户使用下单服务后,将下单信息写入数据库,下单成功。b、短信服务系统:用户下单后,将短信信息写入消息队列,以发送短信信息通知用户交易信息。c、邮件服务系统:用户下单后,将邮件信息写入消息队列,以发送邮件信息通知用户
2021-03-18 19:23:19
1596
1
原创 SELECT * 效率低的原因
一、效率低的原因先看一下最新《阿里java开发手册(泰山版)文末有本书的下载链接》中 MySQL 部分描述:4 - 1. 【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。说明:1、增加查询分析器解析成本。2、增减字段容易与 resultMap 配置不一致。3、无用字段增加网络 消耗,尤其是 text 类型的字段。开发手册中比较概括的提到了几点原因,让我们深入一些看看:不需要的列会增加数据传输时间和网络开销a、用“SELECT * ”数据库需要解析更多
2021-03-17 17:57:29
210
原创 redis Hyperloglog 过滤重复
Redis 中对 HyperLogLog 的应用首先,在 Redis 中,HyperLogLog 是它的一种高级数据结构。提供有包含但不限于下面两条命令:pfadd key value,将 key 对应的一个 value 存入pfcount key,统计 key 的 value 有多少个回想一下,原始APP页面统计用户的问题。如果 key 对应页面名称,value 对应用户id。那么问题就刚刚好对应上了。Redis 中的 HyperLogLog 原理前面我们已经认识到,它的实现中,设有 1638
2021-03-16 17:48:37
521
原创 java并发知识
1、HashMapHashMap具有如下特性:HashMap 的存取是没有顺序的。KV 均允许为 NULL。多线程情况下该类安全,可以考虑用 HashTable。JDk8底层是数组 + 链表 + 红黑树,JDK7底层是数组 + 链表。初始容量和装载因子是决定整个类性能的关键点,轻易不要动。HashMap是懒汉式创建的,只有在你put数据时候才会 build。单向链表转换为红黑树的时候会先变化为双向链表最终转换为红黑树,切记双向链表跟红黑树是共存的。对于传入的两个key
2021-01-06 14:44:03
198
原创 List 去除重复数据的 5 种正确姿势!
1、双重for循环去重 (不建议使用)for (int i = 0; i < list.size(); i++) {for (int j = 0; j < list.size(); j++) {if(i!=j&&list.get(i)==list.get(j)) {list.remove(list.get(j));}}}2、利用List的contains方法循环遍历,重新排序,只添加一次数据,避免重复:private static void removeDup
2020-11-19 11:50:44
446
原创 Spring 和 SpringBoot 最核心的 3 大区别
什么是Spring?作为 Java开发人员,大家都 Spring都不陌生,简而言之, Spring框架为开发 Java应用程序提供了全面的基础架构支持。它包含一些很好的功能,如依赖注入和开箱即用的模块,如:SpringJDBC、SpringMVC、SpringSecurity、SpringAOP、SpringORM、SpringTest,这些模块缩短应用程序的开发时间,提高了应用开发的效率例如,在 JavaWeb开发的早期阶段,我们需要编写大量的代码来将记录插入到数据库中。但是通过使用 SpringJD
2020-11-04 16:05:31
272
原创 Controller ,Service,Dao是不是线程安全的(Spring)
Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体还是要结合具体scope的Bean去研究。Spring 的 bean 作用域(scope)类型singleton:单例,默认作用域。prototype:原型,每次创建一个新对象。request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。session:会话,同一个会话共享一个实例,不同会话使用
2020-11-04 15:50:48
602
原创 “秒杀系统“ 怎么设计的?
秒杀业务分析正常电子商务流程:1、查询商品2、创建订单3、扣减库存4、更新订单5、付款6、卖家发货秒杀业务的特性1、低廉价格2、大幅推广3、瞬时售空4、一般是定时上架5、时间短、瞬时并发量高秒杀技术挑战假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有:1、对现有网站业务造成冲击秒杀活动只是网站营销的一个附加活动,这个活动具有时间短,并发访问量大的特点,如果和网站原有应用部署在一起,必然会对现有业务造成
2020-07-01 14:02:41
310
原创 过滤器 和 拦截器 6个区别?
1、过滤器 (Filter)过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法。init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。「注意」:这个方法必须执行成功,否则过滤器会不起作用。doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。destroy():当容器销毁 过滤器实例时调用
2020-06-30 14:57:16
242
原创 Redis 面试知识点总结
Redis 内部内存管理是如何描述这 5 种数据类型的。首先 Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。redisObject 最主要的信息如上图所示:type 表示一个 value 对象具体是何种数据类型,encoding 是不同数据类型在 Redis 内部的存储方式。比如:type=string 表示 value 存储的是一个普通字符串...
2020-03-10 14:25:18
118
原创 Session 、Cookie和token
Session 、Cookie和token一、session保存在服务端,可以用于记录客户状态;比如我们经常会用 Session 保存客户的基本信息、权限信息等;用户第一次登录之后,服务器就会创建一个 Session ,并将 SessionID 返回给浏览器,浏览器通常将其写入到 Cookie 中,这种 Cookie 也叫做 SessionCookie ,浏览器再次访问时,只需要拿着 Ses...
2020-01-16 16:24:28
315
原创 mybatis的代码规范
一、MyBatis 不要为了多个查询条件而写 1 = 1当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 以比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL ...
2019-12-13 13:50:05
869
原创 redis 的数据类型
redis支持丰富的数据类型,从最基础的string到复杂的常用到的数据结构都有支持:string:最基本的数据类型,二进制安全的字符串,最大512M。list:按照添加顺序保持顺序的字符串列表。set:无序的字符串集合,不存在重复的元素。sorted set:已排序的字符串集合。hash:key-value对的一种集合。bitmap:更细化的一种操作,以bit为单位。hyperlo...
2019-12-11 12:02:48
141
原创 MySQL的自增ID用完了,怎么办?
首先,创建一个最简单的表,只包含一个自增id,并插入一条数据。create table t0(id int unsigned auto_increment primary key);insert into t0 values(null);通过show命令 show create table t0; 查看表情况CREATE TABLE t0( id int(10)unsigned NOT...
2019-12-10 10:17:06
452
原创 前后端分离的接口规范是什么?
一、为何要分离1、前端开发重度依赖开发环境,开发效率低。2、前后端职责依旧纠缠不清。3、对前端发挥的局限。关注点分离职责分离对的人做对的事更好的共建模式快速的反应变化二、开发流程1、后端编写和维护接口文档,在 API 变化时更新接口文档2、后端根据接口文档进行接口开发3、前端根据接口文档进行开发 + Mock平台4、开发完成后联调和提交测试5、Mock 服务器根据接口...
2019-12-06 10:30:13
1340
原创 如何做 API 接口防刷??
1、首先是写一个注解类2、拦截器中实现3、注册到springboot中4、在Controller中加入注解首先是写一个注解类:import java.lang.annotation.Retention;import java.lang.annotation.Target;import static java.lang.annotation.ElementType.METHOD;im...
2019-12-06 10:15:57
555
原创 讲讲高并发下的接口幂等性怎么实现?
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数.更...
2019-12-06 10:01:39
398
原创 对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 各自的优缺点
一、消息存储Kafka:内存、磁盘、数据库。支持大量堆积。kafka的最小存储单元是分区,一个topic包含多个分区,kafka创建主题时,这些分区会被分配在多个服务器上,通常一个broker一台服务器。分区首领会均匀地分布在不同的服务器上,分区副本也会均匀的分布在不同的服务器上,确保负载均衡和高可用性,当新的broker加入集群的时候,部分副本会被移动到新的broker上。根据配置文件中的目...
2019-12-02 11:43:46
1273
原创 HashMap 线程为啥不安全呢?
1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7中的问题,相信大家都知道在jdk1.7多线程环境下HashMap容易出现死循环,这里我们先用代码来模拟出现死循环的情况:public class HashMapTest {public static void main(String[] args) {HashMapThread thre...
2019-11-26 10:18:14
483
原创 SQL性能优化,太太太有用了!
1.1 逻辑架构第一层:客户端通过连接服务,将要执行的sql指令传输过来第二层:服务器解析并优化sql,生成最终的执行计划并执行第三层:存储引擎,负责数据的储存和提取1.2 锁数据库通过锁机制来解决并发场景-共享锁(读锁)和排他锁(写锁)。读锁是不阻塞的,多个客户端可以在同一时刻读取同一个资源。写锁是排他的,并且会阻塞其他的读锁和写锁。简单提下乐观锁和悲观锁。乐观锁,通常用于数据竞争...
2019-11-25 12:04:26
209
原创 Java中最大的数据结构:LinkedHashMap
Map 家族数量众多,其中 HashMap 和 ConcurrentHashMap 用的最多,而 LinkedHashMap 似乎则是不怎么用的,但是他却有着顺序。两种,一种是添加顺序,一种是访问顺序。LinkedHashMap 继承了 HashMap。那么如果是你,你怎么实现这两个顺序呢?1、如果实现添加顺序的话,我们可以在该类中,增加一个链表,每个节点对应 hash 表中的桶。这样,循环遍...
2019-11-25 09:50:44
340
原创 B+ 树索引、B 树索引
索引在 MySQL 数据库中分三类:B+ 树索引Hash 索引全文索引要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结构。B+ 树就是从他们仨演化来的。二叉查找树从图中可以看到,我们为 user 表(用户信息表)建立了一个二叉查找树的索引。图中的圆为二叉查找树的节点,节点中存储了键(key)和数据(data)。键对应 user 表中的 id,数据对应 u...
2019-11-20 20:22:11
264
原创 支付宝架构师眼中的高并发架构
高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等。日用户流量大,但是比较分散,偶尔会有用户高聚的情况;场景:用户签到,用户中心,用户订单,等方案如:用户签到获取积分1、计算出用户分布的key,redis hash中查找用户今日签到信息2、如果查询到签到信息,返回签到信息3、如果没有查询到,DB查询今日是否签到过,如果有签到过,就把签到信息同步r...
2019-11-19 10:08:57
259
原创 count(1)、count(*)、count(列)有什么区别?
1. count(1) and count(*)当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count()用时多了!从执行计划来看,count(1)和count()的效果是一样的。但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。因为...
2019-11-07 09:48:38
159
原创 什么是事务?
事务是逻辑上的一组操作,要么都执行,要么都不执行。事物的四大特性(ACID)介绍一下?原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性: 一个事务被提交之后。它对数...
2019-11-06 19:40:59
302
原创 为什么索引能提高查询速度
先从 MySQL 的基本存储结构说起MySQL的基本存储结构是页 (记录都存在页里边) :各个数据页可以组成一个双向链表每个数据页中的记录又可以组成一个单向链表-每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录-以其他列(非主键)作为搜索条件:只能从最小记录...
2019-11-06 19:34:56
877
原创 乐观锁与悲观锁的区别
1.1. 版本号机制一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。举一个简单的例子: 假设数据库中帐户信息表中有一个 version 字...
2019-11-06 19:27:52
771
5
原创 秒杀抢购系统选型
火车票秒杀系统如何在高并发情况下提供正常、稳定的服务呢?从上面的介绍我们知道用户秒杀流量通过层层的负载均衡,均匀到了不同的服务器上,即使如此,集群中的单机所承受的 QPS 也是非常高的。如何将单机性能优化到极致呢?要解决这个问题,我们就要想明白一件事:通常订票系统要处理生成订单、减扣库存、用户支付这三个基本的阶段。我们系统要做的事情是要保证火车票订单不超卖、不少卖,每张售卖的车票都必须支付才...
2019-10-30 14:00:50
234
原创 大型高并发系统架构
高并发的系统架构都会采用分布式集群部署,服务上层有着层层负载均衡,并提供各种容灾手段(双火机房、节点容错、服务器灾备等)保证系统的高可用,流量也会根据不同的负载能力和配置策略均衡到不同的服务器上。下边是一个简单的示意图:①OSPF(开放式最短链路优先)是一个内部网关协议(Interior Gateway Protocol,简称 IGP)OSPF 通过路由器之间通告网络接口的状态来建立链路状...
2019-10-30 13:43:26
1015
原创 Spring Boot 中的执行顺序?
Spring Boot 的启动是通过new SpringApplication()实例来启动的,启动过程主要做如下几件事情:> 1. 配置属性 > 2. 获取监听器,发布应用开始启动事件 > 3. 初始化输入参数 > 4. 配置环境,输出banner > 5. 创建上下文 > 6. 预处理上下文 > 7. 刷新上下文 > 8. 再刷新上下文 >...
2019-10-29 12:37:52
1195
原创 ConcurrentHashMap也有可能会造成CPU 100%的异常现象
1、JDK7A、JDK7中的HashMap在多线程环境下不止只有CPU 100%这一共怪异现象B、HashMap在多线程环境下它还可能造成插入的数据丢失JDK7中的HashMap在多线程环境下可能造成CPU 100%的现象,这个由于在扩容的时候put时产生了死循环,由此会在get时造成了CPU 100%。所以在并发情况下不能使用HashMap,这个问题在JDK8中的HashMap获得了解决。...
2019-10-29 10:21:56
1663
原创 hashmap解决冲突的方法
常用的序列化方式都有哪些?答:常用的序列化方式有以下三种:Java 原生序列化方式请参考以下代码:JSON 格式,可使用 fastjson 或 GSONJSON 是一种轻量级的数据格式,JSON 序列化的优点是可读性比较高,方便调试。我们本篇以 fastjson 的序列化为例,请参考以下代码:Hessian 方式序列化:Hessian 序列化的优点是可以跨编程语言,比 Ja...
2019-10-26 13:50:25
442
原创 springcloud gateway断路器抛的错default failed and fallback disabled
有没有springcloud的大神碰到这个问题?这是springcloudgateway断路由抛的错default failed and fallback disabled., httpStatus状态码:500, 异常原因:Connection closed prematurely看erueka注册中心 服务正常的 健康检查也是正常的下游服务日志我看了是正常的 就是这个gateway层面...
2019-10-24 13:45:15
2270
1
原创 常用的设计模式
单例模式简单点说,就是一个应用程序中,某个类的实例对象只有一个,你没有办法去new,因为构造器是被private修饰的,一般通过getInstance()的方法来获取它们的实例。getInstance()的返回值是一个对象的引用,并不是一个新的实例,所以不要错误的理解成多个对象。单例模式实现起来也很容易,直接看demo吧public class Singleton {private sta...
2019-10-17 11:02:34
118
zookeeper分布式工具
2019-02-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人