- 博客(136)
- 资源 (17)
- 收藏
- 关注
原创 Firebase授权登录无法获取用户邮箱
文章目录遇到的问题解决方案Android的解决方案iOS的解决方案参考文档手里的一个海外项目使用Firebase集中管理所有的三方授权登录,在开发过程中遇到了无法获取第三方用户邮箱的问题,所以记录一下,也分享给遇到相同问题的朋友。Firebase 是 Google Cloud Platform 为开发者设计,提供各种工具,解决基础架构的问题。Firebase 提供基础性工作和工具,从而允许开...
2020-01-05 18:10:43
2223
原创 简单聊聊PayPal与BrainTree选型经历
2019年9月30日,PayPal公司被批准通过对国付宝的股权收购正式进入中国。2019年12月19日晚间,PayPal公司正式宣布,已完成对国付宝信息科技有限公司(Gopay)70%的...
2019-12-30 08:00:00
2764
1
原创 轻松搞定Charles的HTTPS抓包(iOS13可用)
抓包工具在APP开发过程中使用非常频繁,对开发者理解网络传输原理以及分析定位网络方面的问题非常有帮助。笔者一直比较喜欢Wireshark,但由于最近的项目是短连接项目,Wireshark...
2019-12-16 08:00:00
10235
原创 JDK11无法启动VisualVM
最近新项目从JDK8升级到JDK11,在使用IDEA启动项目同时启动VisualVM时,发现启动并不成功。然后笔者在JDK的目录里查找,发现bin目录下并没有jvisualvm的可执行文件。谷歌查找一番之后,原来从jdk 9开始, visualVM不再集成在Oracle JDK中, 需要单独下载安装。下载地址: https://visualvm.github.io/download.html...
2019-09-25 22:36:37
7089
2
原创 一文搞定Java热更新
Java热更新在持续交付的时代,重新部署一个新的版本只需要点击一下按钮。但在有的情况下,重新部署过程可能比较复杂,停机是不被允许的。所以JVM提供了另外一种选择:在不重启应用的前提下进行小幅改动,又称热更新。对于某些大型的应用来说,每次的重启都需要花费大量的时间成本,所以,如果能在不重启虚拟机的情况下更新一个类,在某些业务场景下变得十分重要。比如很多脚本语言就支持热替换,例如服务器端...
2019-09-25 08:00:00
3750
3
原创 一文搞定MySQL性能调优
公众号回复关键词获取免费学习资料,加入前后端技术交流群和副业群。新建立的副业Q群:735764906。数据库的操作越来越成为整个应用的性能瓶颈,这对于Web应用尤其明显。关于数据库的性能,这并不只是DBA需要关心的,而更是后端开发需要去关注的事情。所以本文讲解MySQL在各个方面的优化方向,方便后端开发人员在调优和问题排查过程中找到切入点。本文目录如下:目录服务器硬件的优化...
2019-09-03 08:00:00
9688
2
转载 你是怎么对Java服务进行优化的?
来源:http://t.cn/AiCTERJzJava 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。...
2019-08-28 08:00:00
1018
转载 MySQL服务器参数配置
本文是笔者整理了慕课网的《全面讲解MySQL架构设计》的第二章内容,提取出来的博客,方便在实际生产用按照属性条目,一条条进行配置和调优。课程链接:https://coding.imooc.com/class/chapter/49.html#AnchorMySQL服务器参数介绍mysql参数介绍(客户端中执行),尽量只修改session级别的参数。全局参数(新连接的session才会...
2019-08-23 13:01:29
2475
原创 explain的属性详解与提速百倍的优化示例
在MySQL中,可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。EXPLAIN命令虽然没有提供任何优化建议,但它能够提供重要的信息有助于调优决策。EXPLAIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。使用方法在要查询的SQL语句前加上explain,然后执行...
2019-08-19 08:00:00
2660
1
转载 MySQL索引原理及慢查询优化[转]
背景MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最...
2019-08-18 13:11:49
546
转载 常见性能优化策略的总结
本文要感谢我职级评定过程中的一位评委,他建议把之前所做的各种性能优化的案例和方案加以提炼、总结,以文档的形式沉淀下来,并在内部进行分享。力求达到如下效果:1. 形成可实践...
2019-08-18 08:00:00
131
转载 漫画:什么是插入排序?
————— 第二天 —————————————————人们如何进行扑克牌的排序呢?举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:这时候,我又抓...
2019-08-17 08:00:00
92
原创 彻底搞懂MySQL的索引
前言MyISAM和InnoDB是MySQL最常用的两个存储引擎,本文将进行详尽的介绍和对比。对于MySQL其余几种存储引擎,请读者自行搜索学习。本文会图解两种引擎的索引结构区别,然后讲解索引的原理,理解本文内容,就能够理解索引优化的各种原则的背后原因。限于篇幅,本篇没有介绍的知识,会在后续博客将逐一讲解。例如:MySQL引擎的锁机制、多列索引的生效规则、索引优化等主题。下面SQL在...
2019-08-12 08:00:00
3123
1
原创 彻底搞懂java程序的初始化顺序
使用场景在java程序中,当实例化对象时,对象的所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。原则 变量优先于块、静态优先于非静态。 父类优先于派生类初始化。 按照成员变量定义的顺序来进行初始化,即使变量定义散布于方法定义之中,它们仍然在任何方法(包括构造器)被调用前初始化。 初始化顺序父类...
2019-08-09 08:00:00
3031
转载 Mina的WebSocket问题排查
笔者上个项目经历过的一个bug。项目使用mina进行收发包,收发包的代码是直接从Apache讨论组那边拷贝过来的。在后来的开发过程中,就出现了不必现的网络包读取失败,导致websocket连接中断。过程和下面转载的文章提到的差不多,结论是一样的,所以记录下来,方便mina使用者跳过这个坑。转载请注明文章出处:https://tlanyan.me/resolve-mina-websocke...
2019-08-07 10:01:01
1003
原创 彻底搞懂Java的等待-通知(wait-notify)机制
线程的生命周期转换 新建状态(New):新建一个线程对象。 就绪/可运行状态(Runnable):线程对象创建后,其他线程调用了该对象的start方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。 运行状态(Running):就绪状态的线程获得CPU并执行程序代码。 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用...
2019-08-06 08:00:00
12813
6
原创 彻底搞懂Reactor模型和Proactor模型
在高性能的I/O设计中,有两个著名的模型:Reactor模型和Proactor模型,其中Reactor模型用于同步I/O,而Proactor模型运用于异步I/O操作。想要了解两种模型,需要了解一些IO、同步异步的基础知识,点击查看服务端的线程模型无论是Reactor模型还是Proactor模型,对于支持多连接的服务器,一般可以总结为2种fd和3种事件,如下图:2种fd l...
2019-08-05 08:00:00
3875
原创 彻底搞懂Redis的线程模型
为了接下来一篇博客,能使读者更加完整地学习线程模型,所以本文对Redis的线程模型进行必要的讲解。由于《Redis设计与实现》对于Redis的讲解简练优雅,所以本文大部分内容节选自本书,也欢迎对Redis有更多底层了解需求的读者,自行购买学习。文件事件处理器Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多...
2019-08-03 08:00:00
26075
6
原创 彻底搞懂Java的网络IO
IO是Input/Output的缩写。Unix网络编程中有五种IO模型: blocking IO(阻塞IO) nonblocking IO(非阻塞IO) IO multiplexing(多路复用IO) signal driven IO(信号驱动IO) asynchronous IO(异步IO) 背景 java.io包基于流模型实现,提供Fil...
2019-08-02 08:00:00
3993
1
原创 彻底搞懂Netty高性能之零拷贝
作为Java网络编程学习者,不仅要知道NIO,还一定要学习Mina和Netty这两个优秀的网络框架。作为上一篇NIO效率高的原理之零拷贝与直接内存映射的补充,本文将针对Netty的零拷贝特性进行详细分析。Netty高性能的原因Netty作为异步事件驱动的网络框架,高性能主要来自于其I/O模型和线程处理模型,前者决定如何收发数据,后者决定如何处理数据。Netty高性能的原因总结,智者见智...
2019-08-01 08:00:00
5627
原创 NIO效率高的原理之零拷贝与直接内存映射
前言在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,点击查看。这篇博客将针对第三个原因,进行更详细的讲解。首先澄清,零拷贝与内存直接映射并不是Java中独有的概念,并且这两个技术并不是等价的。零拷贝零拷贝是指避免在用户态(User-space) 与内核态(Kernel-space) 之间来回拷贝数据的技术。传统IO传统IO读取数据并通过网络发...
2019-07-31 08:00:00
12961
2
原创 彻底搞懂NIO效率高的原理
前言这篇文章读不懂的没关系,可以先收藏一下。笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨。初学者也可以等看完IO模型介绍的博客之后,再回头看这些博客,会更加有收获。NIO相比BIO的优势NIO(Non-blocking I/O,在Java领域,也称为New I/O),是一种同步非阻塞的I/O模型,也...
2019-07-29 08:00:00
5842
6
原创 彻底搞懂epoll高效运行的原理
前言这篇文章读不懂的没关系,可以先收藏一下。笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨。初学者也可以等看完IO模型介绍的博客之后,再回头看这些博客,会更加有收获。如果你顺利啃下这篇博客,恭喜你,nginx、redis和NIO等核心思想已经被你掌握了,可以顺势去拓展自己的理解。否则,只是孤立的看epol...
2019-07-28 08:00:00
6552
1
原创 快速了解缓存穿透与缓存雪崩
缓存穿透缓存系统,一般流程都是按照key去查询缓存,如果不存在对应的value,就去后端系统(例如:持久层数据库)查找。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力,这就叫做缓存穿透。正常请求:缓存击穿时:如何避免1. 缓存空结果对查询结果为空的情况进行缓存,缓存时间设置短一点,或者该key对应的数据inser...
2019-07-26 08:00:00
6745
4
原创 Redis的过期键删除策略和数据逐出策略
Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制。在实际生产环境中使用Redis时,偶然会觉得Redis的内存占用要比自己预想的大。事实上,Redis占用的内存除了保存键值对所需的开销外,还有一些运行时产生的额外内存,包括: 过期Key所占空间 渐进式Rehash导致未及时删除的空间 Redis管理数据,包括底层数据结构开销,客户端信息,读...
2019-07-25 08:00:00
5500
1
原创 高并发系统的限流算法与实现
开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。 缓存:缓存的目的是提升系统访问速度和增大系统处理容量。 降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。 限流:限流的目的是通过对并发请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以进行拒绝服务...
2019-07-23 08:00:00
8607
4
原创 彻底搞懂JDBC的运行过程
前几天笔者发布了博客手写mybatis彻底搞懂框架原理。为了帮助初学者更好理解mybatis框架,这次讲解一下Java的JDBC的运行过程。JDBC的作用JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包里。我们可以用它来连接数据库,执行SQL查询,...
2019-07-22 08:00:00
13225
6
原创 手写mybatis彻底搞懂框架原理
mybatis的前身是iBatis,其源于“Internet”和“abatis”的组合,是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,它可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO映射成数据库中的记录。mybatis的架构设计Mybatis的功能架构分为三层:...
2019-07-16 08:00:00
6779
原创 剑指offer最优解Java版源码索引
《剑指Offer》剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点。是一本计算机大学生算法提高必备的一本书。笔者经过1年的PHP和Java混合开发的项目后,略感Java功力受损,所以准备花几天空闲时间,按照牛客网的题目顺序,将所有题目使用Java实现一遍,每道题ac之后,都参考下评论中的各个答案,取长补短,整理出Java版本的...
2019-07-14 22:09:34
5924
1
原创 Java中容易被遗忘的default关键字
default关键字default关键字在JDK8中有两个用处。1.在switch语句的时候使用defaultint day = 8;String dayString;switch (day) { case 1: dayString = "Monday"; break; case 2: dayString = "Tuesday"; ...
2019-07-10 08:00:00
6201
原创 有关跳跃表的干货都在这里
ConcurrentSkipListSet、ConcurrentSkipListMap等数据结构用的是它,更不用说Redis也广泛用它。它是一种思想,即使你不写它。跳表的数据结构跳表全称叫做跳跃表,简称跳表。跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作...
2019-07-09 08:00:00
7045
1
原创 快速了解基于AQS实现的Java并发工具类
AQS是AbstractQueuedSynchronizer的简称,类如其名,抽象的队列式的同步器,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态,许多同步类实现都依赖于它,如常用的CountDownLatch、Semaphore、CyclicBarrier、ReentrantLock和StampedLock,后文会逐个...
2019-07-08 08:00:00
8587
6
原创 详解ConcurrentHashMap及JDK8的优化
由于HashMap在并发中会出现一些问题,所以JDK中提供了并发容器ConcurrentHashMap。有关HashMap并发中的问题和原理,强烈建议查看这篇文章进行复习。ConcurrentHashMap使用分段锁技术,将整个数据结构分段(默认为16段)进行存储,然后给每一段数据配一把锁(继承ReentrantLock),当一个线程占用锁访问其中一个段的数据的时候,其他段的数据仍然能被其他线...
2019-07-07 08:00:00
11927
1
原创 Java线程安全策略与多线程并发最佳实践
线程安全策略不可变对象不可变对象(Immutable Objects)是指对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,任何对它的改变都应该产生一个新的对象。不可变对象需要满足的条件: 对象创建以后其状态就不能修改 对象所有域都是final类型 对象时正确创建的(在对象创建期间,this引用没有逸出) 除了使用final自行封装不可变对象...
2019-07-02 08:30:00
6074
原创 详解并发下的HashMap以及JDK8的优化
HashMap使用链表法避免哈希冲突(相同hash值),当链表长度大于TREEIFY_THRESHOLD(默认为8)时,将链表转换为红黑树。当小于等于UNTREEIFY_THRESHOLD(默认为6)时,又会退化回链表以达到性能均衡。 下图为HashMap的数据结构(数组+链表+红黑树 )HashMap在并发时出现的问题1.多线程put的时候可能导致元素丢失主要问题出在addEnt...
2019-06-30 08:00:00
9033
6
原创 安全发布对象-发布与逸出
发布对象简单来说就是提供一个对象的引用给作用域之外的代码。比如return一个对象,或者作为参数传递到其他类的方法中。不安全的发布对象示例:@Slf4j @NotThreadSafe public class UnsafePublish { private String[] states = {"a", "b", "c"}; public S...
2019-06-29 08:00:00
5980
原创 TCP粘拆包详解与Netty代码示例
TCP是个“流”协议,所谓流,就是没有界限的一串数据。可以想想河里的流水,是连成一片的,其间并没有分界线。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。有关TCP的详细讲解,可以点击查看这一篇和另外一篇...
2019-06-28 08:00:00
6383
原创 Java类加载及对象创建过程详解
类加载过程类加载的五个过程:加载、验证、准备、解析、初始化。加载在加载阶段,虚拟机主要完成三件事: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区域的运行时数据结构。 在Java堆中生成一个代表这个类的java.lang.Class对象,作为方法区域数据的访问入口。 验证验证阶段作用是保证Class...
2019-06-27 08:00:00
10566
2
原创 JVM内存模型和垃圾回收机制
JVM内存模型根据Java虚拟机规范,Java数据区域分为五大数据区域。其中方法区和堆是所有线程共享的,虚拟机栈、本地方法栈和程序计数器则为线程私有的。有的博客称方法区是永久代,那是因为前者是JVM的规范,而后者则是JVM规范的一种实现,并且只有HotSpot才有永久代,JDK8中已经彻底移除了方法区,JDK8中引入了一个新的内存区域叫metaspace(元空间),后边详细介绍...
2019-06-26 08:00:00
7067
原创 快速理解设计模式之创建型模式
要想更全面理解设计模式,建议先查看Spring的设计模式快速入门干货,前半部分是设计模式的分类和综述,与Spring无关。创建型模式对象的创建会消耗掉系统的很多资源,所以对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题。这里有6个具体的创建型模式可供研究,它们分别是: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Meth...
2019-06-25 08:00:00
6105
世界地理(大陆和港澳台同级关系版).sql
2020-10-09
世界地理(大陆和港澳台层级关系版).sql
2020-10-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅