1224480819038671_社区达人页

个人头像照片
1224480819038671
已加入开发者社区1809

勋章 更多

个人头像照片
专家博主
专家博主
个人头像照片
星级博主
星级博主
个人头像照片
技术博主
技术博主
个人头像照片
初入江湖
初入江湖

成就

已发布62篇文章
0条评论
已回答0个问题
0条评论
已发布0个视频
github地址

我关注的人 更多

技术能力

兴趣领域
  • Java
  • Linux
  • 数据库
擅长领域
技术认证

暂时未有相关云产品技术能力~

暂无个人介绍

暂无精选文章
暂无更多信息

2022年04月

  • 04.24 18:22:52
    发表了文章 2022-04-24 18:22:52

    实现异步编程,这个工具类你得掌握!

    前言最近看公司代码,多线程编程用的比较多,其中有对CompletableFuture的使用,所以想写篇文章总结下在日常的Java8项目开发中,CompletableFuture是很强大的并行开发工具,其语法贴近java8的语法风格,与stream一起使用也能大大增加代码的简洁性大家可以多应用到工作中,提升接口性能,优化代码文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/CompletableFuture是Java 8新增的一个类,用于异步编程,继Future和CompletionStage这个Future主要具备对请求结果独立处理的功能,CompletionSt
  • 04.24 18:21:28
    发表了文章 2022-04-24 18:21:28

    一个提高效率的工具,正则表达式,值得学习一下!

    前言之前分享过几篇工具系列的文章,受到不少读者喜欢分享一些工作中常用的工具软件,值得收藏分享一些常用的网站和工具,值得收藏!今天再分享一个关于提高工作效率的工具:正则表达式在工作中一般使用正则表达式来匹配,替换,检索文本,可以大大提高了工作效率文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢简介正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。学会使用正则在线正则测试工具:rege
  • 04.24 18:20:14
    发表了文章 2022-04-24 18:20:14

    Spring奇技淫巧之扩展点的应用!

    最近在看公司项目和中间件的时候,看到一些Spring扩展点的使用,写篇文章学习下,对大家之后看源码都有帮助.首先先介绍下Bean的生命周期我们知道Bean的生命周期分为几个主干流程Bean(单例非懒加载)的实例化阶段Bean的属性注入阶段Bean的初始化阶段Bean的销毁阶段下面是整个Spring容器的启动流程,可以看到除了上述几个主干流程外,Spring还提供了很多扩展点下面详细介绍下Spring的常见的扩展点Spring常见扩展点有时候整个项目工程中bean的数量有上百个,而大部分单测依赖都是整个工程的xml,导致单测执行时需要很长时间(大部分时间耗费在xml中数百个单例非懒加载的bean
  • 04.24 18:12:29
    发表了文章 2022-04-24 18:12:29

    常用的Lambda表达式案例解析,工作中都会用到!

    前言文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢我们日常工作中,Lambda 使用比较多的场景,就是集合类下的 Lambda 流操作,往往几行代码可以帮助我们实现复杂代码接下来我们把 Lambda 流的常用方法用案列讲解一下。ForEach集合的遍历forEach方法Collect将操作后的对象转化为新的对象FilterFilter 为过滤的意思,只要满足 Filter 表达式的数据就可以留下来,不满足的数据被过滤掉Mapmap 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以让
  • 04.24 18:11:27
    发表了文章 2022-04-24 18:11:27

    分享几个工作中实用的代码优化技巧!

    前言之前分享一篇代码优化的文章:条件语句的多层嵌套问题优化,助你写出不让同事吐槽的代码!今天再次分享一些我日常工作中常用的代码优化技巧,希望对大家有帮助!文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn/觉得有收获,希望帮忙点赞,转发下哈,谢谢,谢谢正文类成员与方法的可见性最小化举例:如果是一个private的方法,想删除就删除如果一个public的service方法,或者一个public的成员变量,删除一下,不得思考很多。使用位移操作替代乘除法计算机是使用二进制表的位移操作会极大地提高性能。<< 左移相当于乘以 2;>> 右移相当于除以2,但它会忽略符号位,空位
  • 04.24 17:40:33
    发表了文章 2022-04-24 17:40:33

    面试中再问到ThreadLocal,应该这么答

    ThreadLocal 提供了线程本地变量的实例,它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本应用场景1.可以使每个线程需要一个独享的对象,每个Thread内有自己的实例副本比如构造一个线程安全的SimpleDateFormat应用场景2.让每个线程内需要保存全局变量例如使用拦截器中获取用户信息,可以让不同方法直接使用,避免参数传递的麻烦在一个线程的生命周期内,都通过这个静态ThreadLocal实例的get()方法取得自己set过的那个对象,避免了将这个对象(例如user对象)作为参数传递的麻烦我在工作中也是使用它来让同一个线程内的不同方法间的全局数据共享对了
  • 04.24 17:35:32
    发表了文章 2022-04-24 17:35:32

    Redis延时队列,这次彻底给你整明白了

    所谓延时队列就是延时的消息队列,下面说一下一些业务场景实践场景订单支付失败,每隔一段时间提醒用户用户并发量的情况,可以延时2分钟给用户发短信先来看看Redis实现普通的消息队列我们知道,对于专业的消息队列中间件,如Kafka和RabbitMQ,消费者在消费消息之前要进行一系列的繁琐过程。如RabbitMQ发消息之前要创建 Exchange,再创建 Queue,还要将 Queue 和 Exchange 通过某种规则绑定起来,发消息的时候要指定 routingkey,还要控制头部信息但是绝大 多数情况下,虽然我们的消息队列只有一组消费者,但还是需要经历上面一些过程。有了 Redis,对于那些只
  • 04.24 17:32:48
    发表了文章 2022-04-24 17:32:48

    MVCC由浅入深学习

    我们知道,根据MySQL的锁机制,写锁和读锁是冲突的,所以MySQl通过MVCC(多版本并发控制)方式来处理读写冲突,提高数据库高并发场景下的吞吐性能最早的数据库系统,只有读读之间可以并发,读写、写读、写写都要阻塞。引入MVCC后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过undo log保存每条数据的多个版本,并且能够找回数据的历史版本提供给用户读,每个事务读到的数据版本可能是不一样的更新丢失( Lost Update ):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就
  • 04.24 17:30:24
    发表了文章 2022-04-24 17:30:24

    一个简单案例,带你看懂GC日志

    GC:表明进行了一次垃圾回收,前面没有Full修饰,表明这是一次Young GCAllocation Failure:表明本次引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了ParNew:表明本次GC发生在年轻代并且使用的是ParNew垃圾收集器。ParNew是一个Serial收集器的多线程版本,会使用多个CPU和线程完成垃圾收集工作(默认使用的线程数和CPU数相同,可以使用-XX:ParallelGCThreads参数限制)ParNew (promotion failed): 8143K->8713K(9216K) 8143K->8713K(9216K):单位是KB三个参数分别
  • 04.24 17:26:17
    发表了文章 2022-04-24 17:26:17

    MySQL存储引擎如何完成一条更新语句的执行

    那么我们先想一下这条SQL语句是如何执行的?首先肯定是我们的系统通过一个数据库连接发送到了MySQL上,然后肯定会经过SQL接口、解析器、优化器、执行器几个环节,解析SQL语句,生成执行计划,接着去由执行器负责这个计划的执行,调用InnoDB存储引擎的接口去执行。大致会走下图的这个流程我们就来探索一下这个存储引擎里的架构设计,以及如何基于存储引擎完成一条更新语句的执行nnoDB存储引擎中有一个非常重要的放在内存里的组件,就是缓冲池(Buffer Pool),这里面会缓存很多的数据, 以便于以后在查询的时候,万一你要是内存缓冲池里有数据,就可以不用去查磁盘了所以当我们的InnoDB存储 引擎要执
  • 04.24 17:22:57
    发表了文章 2022-04-24 17:22:57

    ConcurrentHashMap核心原理,这次彻底给整明白了

    ConcurrentHashMap,它在技术面试中出现的频率相当之高,所以我们必须对它深入理解和掌握。谈到 ConcurrentHashMap,就一定会想到 HashMap。HashMap 在我们的代码中使用频率更高,不需要考虑线程安全的地方,我们一般都会使用 HashMap。HashMap 的实现非常经典,如果你读过 HashMap 的源代码,那么对 ConcurrentHashMap 源代码的理解会相对轻松,因为两者采用的数据结构是类似的这篇文章主要讲解ConcurrentHashMap的核心原理,并注释详细源码,文章篇幅较长,可收藏再看ConcurrentHashMap 是一个存储 ke
  • 04.24 17:17:59
    发表了文章 2022-04-24 17:17:59

    聊聊JIT是如何影响JVM性能的

    我们知道Java虚拟机栈是线程私有的,每个线程对应一个栈,每个线程在执行一个方法时会创建一个对应的栈帧,栈帧负责存储局部变量变量表、操作数栈、动态链接和方法返回地址等信息,每个方法的调用过程,相当于栈帧在Java栈的入栈和出栈过程但是栈帧的创建是需要耗费资源的,尤其是对于 Java 中常见的 getter、setter 方法来说,这些代码通常只有一行,每次都创建栈帧的话就太浪费了。另外,Java 虚拟机栈对代码的执行,采用的是字节码解释执行的方式,考虑到下面这段代码,变量 a 声明之后,就再也不被使用,要是按照字节码指令解释执行的话,就要做很多无用功。另外,我们知道垃圾回收器回收的目标区域主要
  • 04.24 17:15:04
    发表了文章 2022-04-24 17:15:04

    ReentrantLock核心原理,绝对干货

    那我们开始吧ReentrantLock 中文我们叫做可重入互斥锁,可重入的意思是同一个线程可以对同一个共享资源重复的加锁或释放锁,互斥就是 AQS 中的排它锁的意思,只允许一个线程获得锁。简单应用ReentrantLock 的使用相比较 synchronized 会稍微繁琐一点,所谓显示锁,也就是你在代码中需要主动的去进行 lock 操作。一般来讲我们可以按照下面的方式使用 ReentrantLocklock.lock () 就是在显式的上锁。上锁后,下面的代码块一定要放到 try 中,并且要结合 finally 代码块调用lock.unlock ()来释放锁,否则一定 doSomething
  • 04.24 17:08:04
    发表了文章 2022-04-24 17:08:04

    一文搞懂Kafka核心基础知识

    Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、Storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源 项目。Kafka 官网的下载地址是 https://kafka.apache.org/downloads ;打开下载页面后我们可以看 到不同版本的
  • 04.24 17:02:22
    发表了文章 2022-04-24 17:02:22

    从源码角度解析ArrayList.subList的几个坑

    ArrayList的subList分析首先通过 IDEA 的提供的类图工具,我们可以查看下该类的继承体系。具体步骤:在 SubList 类中 右键,选择 “Diagrams” -> “Show Diagram” 。可以看到 SubList 和 ArrayList 的继承体系非常类似,都实现了 RandomAccess 接口 继承自 AbstarctList。但是SubList 和 ArrayList 并没有继承关系,因此 ArrayList 的 SubList 并不能强转为 ArrayList 。从上面的结果也可以清晰地看出,subList 并不是 ArrayList 类型的实例,不能强转为
  • 04.24 16:55:13
    发表了文章 2022-04-24 16:55:13

    写出好的Join语句,前提你得懂这些

    因为驱动结果集越大,意味着需要循环的次数越多,也就是说在被驱动结果集上面所 需要执行的查询检索次数会越多。比如,当两个表(表 A 和 表 B) Join 的时候,如果表 A 通过 WHERE 条件过滤后有 10 条记录,而表 B 有 20 条记录。如果我们选择表 A 作为驱动表,也就是被驱动表的结果集为 20,那么我们通过 Join 条件对被驱动表(表 B)的比较过滤就会有 10 次。反之,如果我们选择表 B 作为驱动表,则需要有 20 次对表 A 的比较过滤。小贴士1:驱动表的定义:当进行多表连接查询时,1.指定了联接条件时,满足查询条件的记录行数少的表为驱动表,2.未指定联接条件时,行数少
  • 04.24 16:50:54
    发表了文章 2022-04-24 16:50:54

    一文带大家快速掌握RabbitMQ

    RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,它是使用Erlang语言来编写的,并且是基于AMQP协议的;RabbitMQ高性能的原因Erlang语言在交换机的交互方面性能优秀的(Erlang语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的)Erlang有着和原生Socket一样的延迟安装教程:https://www.rabbitmq.com/install-debian.htmlAMQP(Advanced Message Queueing Protocol)定义:具有现代特征的二进制协
  • 04.24 16:43:32
    发表了文章 2022-04-24 16:43:32

    社招一年半面经分享(含阿里美团头条京东滴滴)

    重点放在专业技能和项目经验两块1.你的简历就是你给面试官提供的考点,简历上的东西必须自己Hold住,万一自己写的东西被问住了,会很尴尬,给面试官留下的印象也不好,所以就是会啥写啥2.技术栈最好不要写精通,你敢写面试官就敢问,被问倒了很尴尬的,写熟悉,了解就行怎么投简历我这里强烈建议找人内推,这样简历通过的概率大些,如果找不到,可以试试脉脉,我就是从脉脉投的简历,把状态改成寻找机会就行,会有很多人找你的推荐一个简历制作模版,我一直用的,https://www.polebrief.com/index算法这个该刷还是得刷,别偷懒,我个人感觉刷完下面几个已经够了,大家可以根据自己的基础情况选择剑指Of
  • 04.24 16:39:24
    发表了文章 2022-04-24 16:39:24

    Java编译和反编译那些事

    挺久没更文章了,之前有一个月在面试,后来写了篇面经,有一些朋友找我交流问题,所以一直没时间写技术文章,估计以后更新文章频率不会那么高了,不过还是会定期分享的,我的目的还是希望我的每篇文章大家都能学到点东西基本概念我们可以通过javac命令将Java程序的源代码编译成Java字节码,即我们常说的class文件,这是我们通常意义上理解的编译但是,字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令,这个过程是通过解释器实现的,叫解释执行在不同的虚拟机实现中,执行引擎在执行字节码的时候,通常会有解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两
  • 04.24 16:36:17
    发表了文章 2022-04-24 16:36:17

    高效使用内存,这些你得知道

    堆内存用的越少,堆被填满的几率就越低,新生代回 收的次数更少,对象的晋升年龄也就不会很频繁地增加,这意味着对象被提升到老年代的 可能性也降低了,因此, Full GC会减少,降低了GC发生的频率「下面将介绍几种减少内存使用的方式」对象会占用一定数量的堆内存,所以要减少内存使用,最简单的方式就是让对象小一些减少对象大小有两种方式:减少实例变量的个数,或者减少实例变量的大小注意这里的减少变量大小主要是对每个对象选择更小的类型,避免空间的浪费「同时对于对象大小的计算,有几个注意点:」1.对象大小未必和你计算的一样,因为对象会被填充到 8 字节的整数倍2.对象内部即使为 null 的实例变量也会占用
  • 04.24 16:33:11
    发表了文章 2022-04-24 16:33:11

    面试题:Kafka如何保证高可用?有图有真相

    什么是高可用「高可用性」,指系统无间断地执行其功能的能力,代表系统的可用性程度Kafka从0.8版本开始提供了高可用机制,可保障一个或多个Broker宕机后,其他Broker能继续提供服务备份机制Kafka允许同一个Partition存在多个消息副本,每个Partition的副本通常由1个Leader及0个以上的Follower组成,生产者将消息直接发往对应Partition的Leader,Follower会周期地向Leader发送同步请求同一Partition的Replica不应存储在同一个Broker上,因为一旦该Broker宕机,对应Partition的所有Replica都无法工作,这就
  • 04.24 16:28:02
    发表了文章 2022-04-24 16:28:02

    关于内存安全问题,你应该了解的几点!

    Java在内存管理方面是要比C/C++更方便的,不需要为每一个对象编写释放内存的代码,JVM虚拟机将为我们选择合适的时间释放内存空间,使得程序不容易出现内存泄漏和溢出的问题不过,也正是因为Java把内存控制的权利交给了Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎么使用内存的,那排查错误将会成为一项异常艰难的工作下面先看看JVM如何管理内存的根据Java虚拟机规范(第3版) 的规定,Java虚拟机所管理的内存将会包括以下几个运行内存数据区域:线程隔离数据区:程计数器: 当前线程所执行字节码的行号指示器虚拟机栈: 里面的元素叫栈帧,存储局部变量表、操作栈、动态链接、方法出
  • 04.24 16:23:08
    发表了文章 2022-04-24 16:23:08

    关于主从延迟,一篇文章给你讲明白了!

    在实际的生产环境中,由单台MySQL作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面 因此,一般来说都是通过集群主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力进行部署与实施总结MySQL主从集群带来的作用是:提高数据库负载能力,主库执行读写任务(增删改),备库仅做查询。提高系统读写性能、可扩展性和高可用性。数据备份与容灾,备库在异地,主库不存在了,备库可以立即接管,无须恢复时间。用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。可以简单理解为记录的就是sq
  • 04.24 16:16:27
    发表了文章 2022-04-24 16:16:27

    面试题:Redis如何实现分布式锁!

    为什么需要分布式锁使用分布式锁的目的,无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作我们在分布式应用进行逻辑处理时经常会遇到并发问题。比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是原子的。这个时候就要使用到分布式锁来限制程序的并发执行。redis作为一个缓存中间件系统,就能提供这种分布式锁机制,其本质就是在redis里面占一个坑,当别的进程也要来占坑时,发现已经被占领了,就只要等待稍后再尝试一般来说,生产环境可用的分布式锁需要满足以下几点:互斥性,互斥是锁的基
  • 04.24 16:10:15
    发表了文章 2022-04-24 16:10:15

    动态代理总结,面试你要知道的都在这里,无废话!

    代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能一个比方:在租房的时候,有的人会通过房东直租,有的人会通过中介租房。这两种情况哪种比较方便呢?当然是通过中介更加方便。这里的中介就相当于代理,用户通过中介完成租房的一系列操作(看房、交押金、租房、清扫卫生)代理模式可以有效的将具体的实现与调用方进行解耦,通过面向接口进行编码完全将具体的实现隐藏在内部。创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理
  • 04.24 16:00:53
    发表了文章 2022-04-24 16:00:53

    阿里面试题:缓存的一些常见的坑,你遇到过哪些,怎么解决的?

    在高并发请求时,我们会频繁提到使用缓存技术,最直接的原因是,磁盘IO及网络开销是直接请求内存IO的千百上千倍做个简单计算,如果我们需要某个数据,该数据从数据库磁盘读出来需要0.0045S,经过网络请求传输需要0.0005S,那么每个请求完成最少需要0.005S,该数据服务器每秒最多只能响应200个请求,而如果该数据存于本机内存里,读出来只需要100us,那么每秒能够响应10000个请求。通过将数据存储到离CPU更近的未位置,减少数据传输时间,提高处理效率,这就是缓存的意义。加速读写。因为缓存通常都是全内存的系统,通过缓存的使用可以有效提高用户的访问速度同时优化用户体验。降低后端负载。通过添加缓
  • 04.24 15:55:04
    发表了文章 2022-04-24 15:55:04

    来自读者的面试题:谈谈Spring用到了哪些设计模式?

    所谓代理,是指它与被代理对象实现了相同的接口,客户端必须通过代理才能与被代理的目标类进行交互,而代理一般在交互的过程中(交互前后),进行某些特定的处理,比如在调用这个方法前做前置处理,调用这个方法后做后置处理。代理又分为静态代理和动态代理两种方式,Spring的AOP采用的是动态代理的方式Spring通过动态代理对类进行方法级别的切面增强,动态生成目标对象的代理类,并在代理类的方法中设置拦截器,通过执行拦截器中的逻辑增强了代理方法的功能,从而实现AOP。关于动态代理可以看我之前的文章,写的很详细:动态代理总结,你要知道的都在这里,无废话!我们前面讲到,Spring AOP是通过动态代理来实现的
  • 04.24 15:44:51
    发表了文章 2022-04-24 15:44:51

    分享一些常用的网站和工具,值得收藏!

    格式转换工具支持非常多类型的格式转换https://www.alltoall.net/免费CDN网址:https://cdnjs.com/,支持各种库的在线CDN地址画图工具 1.https://www.processon.com/2.drawio我很多文章的图都是用这两个画的代码转图片工具这个写文章需要粘贴很长的代码的时候,可以用这个转成好看的图片https://carbon.now.sh/简历工具这个可以在线制作简历,推荐的模板都非常简洁,特别适合程序https://www.polebrief.com/indexB站https://www.bilibili.com/B站挺好的,我没事拷贝兔
  • 04.24 15:39:04
    发表了文章 2022-04-24 15:39:04

    关于并发编程,你必须要知道的Future机制!

    Java 5在concurrency包中引入了java.util.concurrent.Callable 接口,它和Runnable接口很相似,但它可以返回一个对象或者抛出一个异常。Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。而线程是属于异步计算模型,所以不可能直接从别的线程中得到函数返回值。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它可以知道Cal
  • 04.24 15:34:06
    发表了文章 2022-04-24 15:34:06

    分享一些工作中常用的工具软件,值得收藏!

    适合程序猿使用的笔记本,支持混合书写文本、代码、Markdown标记等,方便程序员记录笔记和代码片段,并提供全文搜索功能,类似印象笔记的左中右三栏布局,是一款程序猿必备的利器一款免费的Redis可视化工具,基本的功能都有,有监控统计,支持暗黑主题,还支持集群的添加,主要是看起来高大上,哈哈MAC上一款比较常用的压缩/解压缩软件,这个解压缩软件体积小,简单易用,速度较快Dash是一个API文档浏览器和代码片段管理器,它带有200多个离线文档集,可以选择要下载的文档集鹅厂出的一款软件,最强大的功能是可以有针对性的清理微信,QQ聊天,视频,音乐等数据缓存了,既可以删掉无用的信息,又能够保留下来用户想
  • 04.24 15:33:54
    发表了文章 2022-04-24 15:33:54

    面试题:再谈Synchronized实现原理!

    线程安全是并发编程中的重要关注点。造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。为了解决这个问题,我们可能需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再进行。在 Java 中,关键字 Synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)。下面来一起探索Synchronized的基本使用、实现机制。文章首发在公众号(月伴飞鱼),之后同步到个人网站:xiaoflyfish.cn
  • 04.24 14:57:08
    发表了文章 2022-04-24 14:57:08

    京东面试题:ElasticSearch深度分页解决方案

    Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页、遍历等。在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 Elasticsearch 中,也应该尽量避免使用深度分页。这篇文章主要介绍 Elasticsearch 中分页相关内容!在ES中,分页查询默认返回最顶端的10条匹配hits。如果需要分页,需要使用from和size参数。from参数定义了需要跳过的hits数,默认为0;size参数定义了需要返回的hits数目的最大值。一个基本的ES查询语句是这样的:在ES中,搜索一般包括两个阶段,query 和 fet
  • 04.24 14:56:58
    发表了文章 2022-04-24 14:56:58

    分布式系列第一弹:分布式一致性!

    互联网时代和环境下,为了快速需求响应和提高系统吞吐,往往进行微服务化改造,将复杂系统和数据进行拆分;这时候的一致性指分布式服务化系统之间的弱一致性,包括应用系统一致性和数据一致性;一致性级别说明强一致性 要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大弱一致性 系统在写入成功后,不承诺立即可以读到写入的值,也不久承诺多久之后数据能够达到一致,但会尽可能地保证到某个时间别(比如秒级别)后,数据能够达到一致状态最终一致性 最终一致性是弱一致性的一个特例,系统会保证在一定时间内,能够达到一个数据一致的状态。最终一致性是弱一致性中非常推崇的一种一致性包括应用系统一致性
  • 04.24 14:56:32
    发表了文章 2022-04-24 14:56:32

    ZooKeeper核心知识总结!

    Apache ZooKeeper 是由Apache Hadoop的子项目发展而来,为分布式应用提供高效且可靠的分布式协调服务。在解决分布式数据一致性方面,ZK没有直接采用Paxos算法,而是采用了ZAB(ZooKeeper Atomic Broadcast)协议。ZK可以提供诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知,集群管理,Master选举,分布式锁,分布式队列等功能。「它具有以下特性:」「顺序一致性」:从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到 Zookeeper 中;「原子性」:要么所有应用,要么不应用;不存在部分机器应用了该事务,而「另一部分没有应用
  • 04.24 14:37:34
    发表了文章 2022-04-24 14:37:34

    一文搞懂二分查找算法!

    二分搜索(折半搜索)是一种在有序数组中查找某一特定元素的搜索算法。从定义可知,运用二分搜索的前提是数组必须是排好序的,另外,输入并不一定是数组,也有可能是给定一个区间的起始和终止的位置。他的缺点要求待查找的数组或者区间是排好序的。如果对数组进行动态的删除和插入操作并完成查找,平均复杂度会变为 O(n)。因此,当输入的数组或者区间是排好序的,同时又不会经常变动,而要求从里面找出一个满足条件的元素的时候,二分搜索就是最好的选择。解题思路二分搜索一般化的解题思路如下:从已经排好序的数组或区间中取出中间位置的元素,判断该元素是否满足要搜索的条件,如果满足,停止搜索,程序结束。如果正中间的元素不满足条件
  • 04.24 14:25:20
    发表了文章 2022-04-24 14:25:20

    记一次提升18倍的性能优化!

    最近负责的一个自研的 Dubbo 注册中心经常收到 CPU 使用率的告警,于是进行了一波优化,效果还不错,于是打算分享下思考、优化过程,希望对大家有一些帮助。自研 Dubbo 注册中心是个什么东西,我画个简图大家稍微感受一下就好,看不懂也没关系,不影响后续的理解。Consumer 和 Provider 的服务发现请求(注册、注销、订阅)都发给 Agent,由它全权代理Registry 和 Agent 保持 Grpc 长链接,长链接的目的主要是 Provider 方有变更时,能及时推送给相应的 Consumer。为了保证数据的正确性,做了推拉结合的机制,Agent 会每隔一段时间去 Regist
  • 04.24 14:19:18
    发表了文章 2022-04-24 14:19:18

    你可能也会掉进这个简单的 String 的坑

    石头同学是某大公司高级开发工程师,某日收到不少错误告警信息,于是便去开始排查。跟踪日志发现是某个服务抛出的异常信息,奇怪的是这个服务上线也有一段时间了。之前很少看到类似的错误信息,最近偶尔多了起来。后来才定位到是因为服务调用了某外部接口,发现对方对参数长度做了限制,如果输入参数超过 1000 bytes,就直接抛异常,代码类似如下:心想,这还不简单,咱们的 result 也不是什么关键性的东西,你有限制,我直接 trim 一下不就行了?于是三下五除二,给搞了个 trim 方法,支持传不同参数按需 trim,代码如下:再在需要调用外部服务的地方,先调用这个 trimAsByte 方法,一顿操作连
  • 04.24 12:55:24
    发表了文章 2022-04-24 12:55:24

    干货:21 张思维导图,柠檬哥肝了半个月的「后端技术学习路线」长啥样?

    帮你构建后端技术知识体系,是你学习编程的课堂。写的文章也都是围绕着这个主题,这位读者的问题让我突然意识,我忽略了读者群体里有很多是初学编程,或者刚接触计算机的同学。柠檬哥作为一个普通大学非计算机专业,自学后端技术进入腾讯从事后端开发工作,我自己也是非科班自学计算机成功转行软件开发(有想听柠檬哥转行之路经历的吗,可以留言告诉我,人多就写写),体会过当初想学又不知从何学起的迷茫,还好最后摸索出了一条正确学习的路线。思来想去,学习方向和路线很重要。比起具体的技术细节,可复制的经验、清晰的学习路线,是大部分人更加需要的东西。朝着正确的方向努力否则只会离目标越来越远,不是吗?只顾着写各种技术,不告诉大
  • 04.24 12:35:47
    发表了文章 2022-04-24 12:35:47

    这些线程安全的坑,你在工作中踩了么?

    多线程问题首先介绍下使用的多线程会有哪些问题使用多线程的问题很大程度上源于多个线程对同一变量的操作权,以及不同线程之间执行顺序的不确定性《Java并发编程实战》这本书中提到了三种多线程的问题:安全性问题、活跃性问题和性能问题安全性问题例如有一段很简单的扣库存功能操作,如下:在单线程环境下,这个方法能正确工作,但在多线程环境下,就会导致错误的结果--count看上去是一个操作,但实际上它包含三步(读取-修改-写入):读取count的值将值减一最后把计算结果赋值给count如下图展示了一种错误的执行过程,当有两个线程1、2同时执行该方法时,它们读取到count的值都是10,最后返回结果果都是9;意
  • 04.24 12:26:53
    发表了文章 2022-04-24 12:26:53

    ArrayList和LinkedList使用不当,性能差距会如此之大!

    ArrayList实现了List接口,继承了AbstractList抽象类,底层是数组实现的,并且实现了自增扩容数组大小。ArrayList还实现了Cloneable接口和Serializable接口,所以他可以实现克隆和序列化。ArrayList还实现了RandomAccess接口,这个接口是一个标志接口,他标志着“只要实现该接口的List类,都能实现快速随机访问”。基本属性ArrayList属性主要由数组长度size、对象数组elementData、初始化容量default_capacity等组成, 其中初始化容量默认大小为10。//默认初始化容量private static final
  • 04.24 12:24:49
    发表了文章 2022-04-24 12:24:49

    慢查询引发的车祸现场,案例分析!

    前言前几天帮公司解决线上慢SQL告警问题,遇到了几个case。下面我会结合case案例分析自己这段时间在工作上遇到的慢查询谈谈数据库如何优化慢查询。一般我们遇到的慢sql都是索引没有正确使用导致的,所以我先介绍下索引相关知识索引介绍索引概念排好序的快速查找的数据结构(我们平时说的索引,如果没有特别指明,都是指B树,其中聚集索引、次要索引、覆盖索引、复合索引、前缀索引、唯一索引默认使用的都是B+树索引,除B+树这种类型的索引外还有哈希索引等)索引优缺点优点:查找 :提高数据检索效率,降低IO成本。排序:通过索引对数据进行排序,降低排序成本,降低cpu消耗缺点:实际上索引也是一张表,该表保存了主键
  • 04.24 12:02:35
    发表了文章 2022-04-24 12:02:35

    谈谈Spring用到了哪些设计模式?

    代理模式所谓代理,是指它与被代理对象实现了相同的接口,客户端必须通过代理才能与被代理的目标类进行交互,而代理一般在交互的过程中(交互前后),进行某些特定的处理,比如在调用这个方法前做前置处理,调用这个方法后做后置处理。代理又分为静态代理和动态代理两种方式,Spring的AOP采用的是动态代理的方式Spring通过动态代理对类进行方法级别的切面增强,动态生成目标对象的代理类,并在代理类的方法中设置拦截器,通过执行拦截器中的逻辑增强了代理方法的功能,从而实现AOP。关于动态代理可以看我之前的文章,写的很详细:动态代理总结,你要知道的都在这里,无废话!策略模式我们前面讲到,Spring 会在运行时动
  • 04.24 12:00:37
    发表了文章 2022-04-24 12:00:37

    在日常工作中怎么做MySQL优化的?

    SQL优化此优化方案指的是通过优化 SQL 语句以及索引来提高 MySQL 数据库的运行效率,具体内容如下:分页优化例如:select * from table where type = 2 and level = 9 order by id asc limit 190289,10;复制代码优化方案:延迟关联先通过where条件提取出主键,在将该表与原数据表关联,通过主键id提取数据行,而不是通过原来的二级索引提取数据行例如:select a.* from table a, (select id from table where type = 2 and level在 MySQL 5.0 之前
  • 04.24 11:58:40
    发表了文章 2022-04-24 11:58:40

    缓存一致性问题,这么回答肯定没毛病!

    方案分析更新缓存策略方式常见的有下面几种:先更新缓存,再更新数据库先更新数据库,再更新缓存先删除缓存,再更新数据库先更新数据库,再删除缓存下面一一介绍!方案一:更新缓存,更新数据库这种方式可轻易排除,因为如果先更新缓存成功,但是数据库更新失败,则肯定会造成数据不一致。方案二:更新数据库,更新缓存这种缓存更新策略俗称双写,存在问题是:并发更新数据库场景下,会将脏数据刷到缓存updateDB();updateRedis();复制代码举例:如果在两个操作之间数据库和缓存又被后面请求修改,此时再去更新缓存已经是过期数据了。方案三:删除缓存,更新数据库存在问题:更新数据库之前,若有查询请求,会将举例
  • 04.24 11:55:52
    发表了文章 2022-04-24 11:55:52

    高性能无锁并发框架Disruptor,太强了!

    Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的情况下实现队列的并发操作,并号称能够在一个线程里每秒处理6百万笔订单官网:lmax-exchange.github.io/disruptor/目前,包括Apache Storm、Camel、Log4j2在内的很多知名项目都应用了Disruptor以获取高性能为什么会产生Disruptor框架「目前Java内置队列保证线程安全的方式:」ArrayBlockingQueue:基于数组形式的队列,通过加锁的方式,来保证多线程情况下数据的安全;LinkedBlockingQue基于链表形式
  • 04.24 11:54:08
    发表了文章 2022-04-24 11:54:08

    最完整的Explain总结,SQL优化不再困难!

    在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)两个变种explain extended会在 explain 的基础上额外提供一些查询优化的信息。紧随其后通过 show warnings 命令可以 得到优化后的查询语句,从而看出优化器优化了什么。额外还有 filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的i
  • 04.24 11:50:58
    发表了文章 2022-04-24 11:50:58

    硬核图解网络IO模型!

    背景介绍在互联网的时代下,绝大部分数据都是通过网络来进行获取的。在服务端的架构中,绝大部分数据也是通过网络来进行交互的。 而且作为服务端的开发工程师来说,都会进行一系列服务设计、开发以及能力开放,而服务能力开放也是需要通过网络来完成的,因此对网络编程以及网络IO模型都不会太陌生。由于有很多优秀的框架(比如Netty、HSF、Dubbo、Thrift等)已经把底层网络IO给封装了,通过提供的API能力或者配置就能完成想要的服务能力开发,因此大部分工程师对网络IO模型的底层不够了解。本文系统的讲解了Linux内核的IO模型、Java网络IO模型以及两者之间的关系!什么是IO我们都知道在Linux
  • 04.24 11:47:52
    发表了文章 2022-04-24 11:47:52

    条件语句的多层嵌套问题优化,助你写出不让同事吐槽的代码

    前言《阿里巴巴开发手册》中,有关于多 if-else 分支和嵌套的建议和解决方案,如下:那么本文介绍几种优化方案,给大家提供一些思路案例下面是开发中可能会遇到的典型代码:这种情况,我们如何替代多分支和分支嵌套问题呢?如何让代码变得更容易维护和拓展呢?可以先自己思考一下哈..........下面我提供几种方法吧卫语句《重构--改善既有代码的设计》 书籍中有有如下描述:如果某个条件极其罕见,就应该单独检查该条件,并在条件为真时立即从函数中返回。这样的单独检查常常被称为 “卫语句”。使用卫语句,我们可以对上面的示例修改为:先进行条件检查,然后将 if-else 逻辑转成对应的卫语句格式。枚举《Eff
  • 04.24 11:45:23
    发表了文章 2022-04-24 11:45:23

    记一次集合去重导致的线上问题

    前言在工作中一次排查慢接口时,查到了一个函数耗时较长,最终定位到是通过 List 去重导致的。由于测试环境还有线上早期数据较少,这个接口的性能问题没有引起较大关注,后面频繁超时,才引起重视。之前看《阿里巴巴Java开发手册》里面有这样一段描述:你看,阿里前辈们都免费总结了,不过还是会看到有人会用List的contains函数来去重......不记得的,罚抄10万遍如果需要这本书资源的网上下载也行,私聊我发你也行今天我就结合源码聊聊Set是怎样保证数据的唯一性的,为什么两种去重方式性能差距这么大HashSet源码底层实现基于 HashMap,所以迭代时不能保证按照插入顺序,或者其它顺序进行迭代
  • 发表了文章 2022-04-24

    实现异步编程,这个工具类你得掌握!

  • 发表了文章 2022-04-24

    一个提高效率的工具,正则表达式,值得学习一下!

  • 发表了文章 2022-04-24

    Spring奇技淫巧之扩展点的应用!

  • 发表了文章 2022-04-24

    Kafka核心知识总结!

  • 发表了文章 2022-04-24

    常用的Lambda表达式案例解析,工作中都会用到!

  • 发表了文章 2022-04-24

    分享几个工作中实用的代码优化技巧!

  • 发表了文章 2022-04-24

    面试中再问到ThreadLocal,应该这么答

  • 发表了文章 2022-04-24

    Redis延时队列,这次彻底给你整明白了

  • 发表了文章 2022-04-24

    MVCC由浅入深学习

  • 发表了文章 2022-04-24

    一个简单案例,带你看懂GC日志

  • 发表了文章 2022-04-24

    MySQL存储引擎如何完成一条更新语句的执行

  • 发表了文章 2022-04-24

    ConcurrentHashMap核心原理,这次彻底给整明白了

  • 发表了文章 2022-04-24

    聊聊JIT是如何影响JVM性能的

  • 发表了文章 2022-04-24

    ReentrantLock核心原理,绝对干货

  • 发表了文章 2022-04-24

    一文搞懂Kafka核心基础知识

  • 发表了文章 2022-04-24

    从源码角度解析ArrayList.subList的几个坑

  • 发表了文章 2022-04-24

    写出好的Join语句,前提你得懂这些

  • 发表了文章 2022-04-24

    一文带大家快速掌握RabbitMQ

  • 发表了文章 2022-04-24

    社招一年半面经分享(含阿里美团头条京东滴滴)

  • 发表了文章 2022-04-24

    Java编译和反编译那些事

正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息
正在加载, 请稍后...
暂无更多信息