自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

何哥的博客

Bug工程师,面向浏览器编程

  • 博客(31)
  • 收藏
  • 关注

原创 MySQL索引优化总结

前言:相信大家都知道索引可以大大提高MySQL的检索速度,但是真正在平时工作中写SQL,真的会考虑到这条SQL如何能够用上索引提升执行效率?本篇博客详细的介绍了索引优化的20个原则,只要在工作中能够随时应用到,相信你写出的SQL能够命中索引,效率杠杠的。一、索引的分类1.1、普通索引、主键索引和唯一索引1.2、聚集索引和非聚集索引1.3、联合索引最左匹配原则1.4、索引覆盖和回表1.5、前缀索引1.6、索引合并1.7、索引下推二、索引优化规则查询的条...

2021-09-30 01:39:43 7546

原创 日常工作中如何做MySQL优化?

前提:当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL,他们把数据库优化与SQL优化划上了等号。当然这不能算是完全错误的回答,只不过思考的角度稍微片面了些,太“程序员思维”化了,没有站在更高层次来思考回答。那今天我们就将视角拔高,站在架构的角度来聊聊这一问题,数据库优化可以从哪些维度入手?正如上图所示,数据库优化可以从架构优化,硬件优化,DB优化,SQL优化四个维度入手。此上而下,位置越靠前优化越明显,对数据库的性能提升越高。我们常说的SQL优化反而

2021-09-29 01:30:07 670 1

原创 SpringBoot快速集成Kafak

前言:Apache Kafka是分布式发布-订阅消息系统。它最初由LinkedIn公司开发,之后成为Apache项目的一部分。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。Apache Kafka与传统消息系统相比,有以下不同: 它被设计为一个分布式系统,易于向外扩展; 它同时为发布和订阅提供高吞吐量; 它支持多订阅者,当失败时能自动平衡消费者; 它将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。 一、Kaf

2021-09-28 01:27:49 1746

原创 Kafka百万级吞吐量的秘密

前言:我们都知道 Kafka 是基于磁盘进行存储的,但 Kafka 官方又称其具有高性能、高吞吐、低延时的特点,其吞吐量动辄几十上百万。小伙伴们是不是有点困惑了,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间。那 Kafka 又是怎么做到其吞吐量动辄几十上百万的呢?Kafka 高性能,是多方面协同的结果,包括宏观架构、分布式 partition 存储、ISR 数据同步、以及“无所不用其极”的高效利用磁盘和操作系统特性。一、磁盘顺序读写磁盘的顺序读写的情况下,磁盘的顺序读写速度和

2021-09-24 16:59:56 2346

原创 Kafak快速入门攻略

一、Kafka简介1.1、Kafak概述1.2、Kafak诞生背景我们先看看 Kafka 官网给自己下的定义:Apache Kafka is an open-source distributed event streaming platform.翻译成中文就是:Apache Kafka 是一个开源的分布式流处理平台。Kafka 不是一个消息系统吗?为什么被称为分布式的流处理平台呢?这两者是一回事吗?一定有读者会有这样的疑问,要解释这个问题,需要先从 Kafka 的诞生背景

2021-09-24 00:07:03 2390 1

原创 SpringBoot快速集成JPA

前言:一说JavaWeb,很多小伙伴都知道SSH,这个H代表的就是Hibernate框架,可是什么又是JPA呢?相信许多刚入门的小伙伴听说过但不是特别清楚,首先JPA的全称叫做Java Persistence API,JPA是一个基于O/R映射的标准规范,在这个规范中,JPA只定义标准规则,不提供实现,使用者则需要按照规范中定义的方式来使用。目前JPA的主要实现有Hibernate、EclipseLink、OpenJPA等,事实上,由于Hibernate在数据访问解决技术领域的霸主地位,JPA的标准基本是由

2021-09-23 01:50:08 695

原创 OAuth2第三方登录快速接入

前言:现在很多网站和App都支持第三方登录功能,这里以GitHub第三方登录举例,因为注册应用申请ID比微信和QQ简单。目前市面上主流的第三方登录协议就是 OAuth2.0, 例如 QQ,微信,微博等等。 所以只要搞明白大概流程,那么接入其他供应商的第三方登录也是小菜一碟了。一、OAuth 2.0说到第三方登录,不得不提的一个知识点就是 oauth 2.0。OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用.

2021-09-22 17:15:19 7172 3

原创 Java设计模式—观察者模式

前言:在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来实现就非常方便。一、观察者模式简介1.1、观察者模式概述观察者模式(Observer

2021-09-21 19:07:18 10454 4

原创 WebSocket+RabbitMQ实现消息推送系统

一、用户获取新的消息通知有两种模式 上线登录后向系统主动索取 在线时系统向接收者主动推送新消息 设想下,用户的通知消息和新通知提醒数据都放在数据库中,数据库的读写操作频繁。如果消息量大,DB压力较大,可能出现数据瓶颈。这时候就可以引入消息队列RabbitMQ进行流量削峰。向指定用户发送WebSocket消息并处理对方不在线的情况给指定用户发送消息:如果接收者在线,则直接发送消息; 否则将消息存储到redis,等用户上线后主动拉取未读消息。...

2021-09-18 04:10:27 18195 3

原创 Netty快速入门攻略

一、Netty简介1.1、Netty概述Netty 是一个基于nio的客户、服务器端编程框架,Netty提供异步的,事件驱动的网络应用程序框架和工具,可以快速开发高可用的客户端和服务器。Netty是基于nio的,它封装了jdk的nio,让我们使用起来更加方便灵活。Netty是由jboss提供的一款开源框架,常用于搭建RPC中的TCP服务器、WebSocket服务器,甚至是类似Tomcat的web服务器,反正就是各种网络服务器,在处理高并发的项目中,功能丰富且性能良好,基于Java中NIO的二

2021-09-18 02:33:40 1921

原创 WebSocket服务端消息推送

一、Web端实现即时消息推送五种方式股票曲线实时变化,在线IM聊天等等,Web系统里总是能见到消息推送的应用。消息推送用好了能增强用户体验,实现消息推送有N种解决方案。1.1、什么是消息推送消息推送(Push)指运营人员通过自己的产品或第三方工具对用户当前网页或移动设备进行的主动消息推送。用户可以在网页上或移动设备锁定屏幕和通知栏看到push消息通知。以此来实现用户的多层次需求,使得用户能够自己设定所需要的信息频道,得到即时消息,简单说就是一种定制信息的实现方式。我们平时浏览邮箱时突然弹出消息

2021-09-18 01:47:35 15629 3

原创 RabbitMQ快速入门攻略

前言:前不久开发了一个消息通知系统采用了WebSocket+RabbitMQ技术,因为并发量不算大,且RabbitMQ是实现了比较完备的消息队列的功能不用过多开发。这里简单作个RabbitMQ消息队列总结,以后还是要学习学习Kafka消息中间件。一、RabbitMQ简介1.1、RabbitMQ概述RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应

2021-09-16 23:20:41 835 1

原创 Java并发编程:两个线程交替打印0-100的奇偶数

问题描述:两个线程交替打印输出数字,一个线程只打印偶数,另一个只打印奇数方案一:使用synchronized关键字 创建两个线程,一个线程处理偶数,一个线程处理奇数,两个线程之间通过synchronized进行同步,保证count++每次只有一个线程进行操作 为什么两个线程能交替执行,这里很巧的是count从0123...自增过程就是一个奇偶数交替的过程,实际上两个线程都是在不停的尝试(while循环)进入synchronized代码块,如果满足相对应的条件(偶数或是奇数)就打印输出。

2021-09-16 17:14:22 3641

原创 Kafka、RocketMQ、Pulsar全方位对比

前言:随着大数据时代的到来,Apache 旗下的 Kafka 一度成为消息队列的代名词,提起消息队列大家自然而然就想到了 Kafka。然而消息队列本身是服务器端解决问题的一种通用方案,它的背后有着一些通用的设计思想和经典模型,这些是消息队列的精髓和灵魂。Kafka 和 RocketMQ 是目前最热门的两种消息中间件,互联网公司应用最为广泛,消息中间件已经成为Java后端工程师必备的一项技能。一、消息队列使用的五种场景简介MQ全称为Message Queue, 消息队列是一种应用程序对应用程序的通信

2021-09-16 02:37:32 6710 2

原创 Java中nio、bio和aio的区别

前言:IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。现在使用NIO的场景越来越多,很多网上的技术框架或逐渐使用NIO技术,譬如Tomcat、Jetty,还有基于nio的网络编程框架Netty。一、什么是NIO?1.1、高并发量引起的问题一个使用传统阻塞I/O的系统,如果还是使用传统的一个请求对应一个线程这种模式,一旦有高并发的大量请求,就会有如下问题:1、线程不够用, 就算使用了线程池复用线程也无济于事;2、阻塞I/O模式下,会有大量的线程被阻塞,..

2021-09-14 01:19:48 9001 3

原创 Java多线程14:CopyOnWriteArrayList 写时复制

前言:我们知道ArrayList是线程不安全的。要实现线程安全的List,我们可以使用Vector,或者使用Collections工具类将List包装成一个SynchronizedList。其实在Java并发包中还有一个CopyOnWriteArrayList可以实现线程安全的List。1、VectorVector这个类是一个非常古老的类了,在JDK1.0的时候便已经存在,其实现安全的手段非常简单所有的方法都加上synchronized关键字,这样保证这个实例的方法同一时刻只能有一个线程访问,所以在

2021-09-14 00:14:21 1603

原创 Java多线程13:手写生产者-消费者模式

一、Object的wait、notify和notifyAll方法1.1、wait方法当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起(进入waiting状态),直到发生下面几件事情之一才能返回:其他线程调用了该共享对象的notify()或者notifyAll()方法; 其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException异常返回。另外需要注意的是,如果调用wait()方法的线程没有事先获取该对象的监视器锁,则调用w...

2021-09-12 02:50:15 2125

原创 Java多线程12:线程池总结

前言:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是"池化资源"技术产生的原因。线程池中的线程是可以重复使用的。一、Java线程池简介1.1、线程池定义线程池(thread pool)顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池

2021-09-11 01:49:13 696

原创 Java多线程11:并发编程的核心AQS

前言:如果你想深入研究Java并发编程的话,那么AQS一定是绕不开的一块知识点,Java并发包很多的同步工具类底层都是基于AQS来实现的,比如我们工作中经常用的Lock工具ReentrantLock、栅栏CountDownLatch、信号量Semaphore等。而且关于AQS的知识点也是面试中经常考察的内容,为了应付面试,深入学习AQS很有必要。...

2021-09-11 00:16:35 541 3

原创 Java多线程10:并发编程的基石CAS机制

前言:synchronized保证了线程安全,但是在某些情况下,却不是一个最优选择,关键在于性能问题。Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。一、CAS机制简介1.1、悲观锁和乐观锁更新数据方式CAS机制是一种数据更新的方式。在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模式:悲观锁模式和乐观锁模式。悲观锁更新的方式认为:在更新数据的时候大概率会有其他线程去争夺共享资源,所以悲观锁的做...

2021-09-10 01:13:21 450

原创 Java多线程9:ThreadLocal原理和使用场景

前言:面试官经常会问到 ThreadLocal 是什么?他其实想考察候选人对ThreadLocal的定义、原理和应用场景的了解程度。一、ThreadLocal定义ThreadLocal,线程本地变量,顾名思义,它是每个线程私有的本地变量。通俗点讲,当你创建了一个ThreadLocal变量,每个线程在访问该变量时,都会拷贝一个副本至本地内存,所以多线程下操作ThreadLocal变量时,其实各自都是在操作自己拷贝的副本,互不影响,这样自然而然就避免了线程安全问题。ThreadLocal有点类似

2021-09-09 01:16:12 3278

原创 Java多线程8:Volatile原理和使用场景

前言:volatile关键字是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。一个硬币具有两面,volatile不会造成上下文切换的开销,但是它也并能像synchronized那样保证所有场景下的线程安全,因此我们需要在合适的场景下使用volatile机制。大家都应该知道 volatile 的主要作用有两点:保证变量的内存可见性和禁止指令重排序。那么,什么是内存可见性,什么是指令重排序,以及它们涉及了那些机制原理呢?一、基本概念1.1、Java内存模型Java的

2021-09-09 00:42:32 2683

原创 Java多线程7:ReentrantReadWriteLock读写锁

1、ReadWriteLock接口简介ReadWriteLock接口是一个单独的接口(未继承Lock接口),该接口提供了获取读锁和写锁的方法。所谓读写锁,是一对相关的锁——读锁和写锁,读锁用于只读操作,写锁用于写入操作。读锁可以由多个线程同时保持,而写锁是独占的,只能由一个线程获取。接口定义public interface ReadWriteLock { /** * Returns the lock used for reading. * * @r

2021-09-07 17:30:58 322

原创 Java多线程6:ReentrantLock同步锁

前言:Java除了使用关键字synchronized外,还可以使用ReentrantLock实现独占锁的功能。而且ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。这篇文章主要是从使用的角度来分析一下ReentrantLock。一、Lock接口简介1.1、Lock接口概述在JUC包下面有一个java.util.concurrent.locks包,这个包提供了一系列基础的锁工具,对传统的synchronizd、wait和notif

2021-09-07 17:21:12 1481

原创 Java多线程5:synchronized和Lock区别

一、锁类型可重入锁:在执行对象中所有同步方法不用再次获得锁   可中断锁:在等待获取锁过程中可中断   公平锁: 按等待获取锁的线程的等待时间进行获取,等待时间长的具有优先获取锁权利   读写锁:对资源读取和写入的时候拆分为2部分处理,读的时候可以多线程一起读,写的时候必须同步地写线程安全这个概念可能是在多线程编程中提及最多的一个概念了。关于这个概念,我觉得好多人都有一个误区,包括我自己一开始也是这样的。我一开始认为线程安全讲的是某个共享变量线程安全,其实我们所说的线程安全是指某段代

2021-09-06 17:03:29 880 1

原创 Java多线程4:synchronized的使用场景和原理简介

一、synchronized使用1.1 synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。synchronized可以修饰普通方法,静态方法和代码块。当synchronize...

2021-09-06 16:03:15 3028

原创 Java多线程3:锁分类总结

一、锁简介1、锁的概念锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能防止多个线程同时访问共享资源(但是有些锁可以允许多个线程并发的访问共享资源,如读写锁)。在以前,Java程序是靠synchronized来实现锁功能的,而在JavaSE5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能,他提供了与synchronized关键字类似的同步功能,只是在使用时需要显式的获取锁和释放锁,虽然它缺少了synchronized提供的隐式获取释放锁的便捷性,但是却拥有了锁获取和释放..

2021-09-05 01:09:00 826

原创 Nginx实战:反向代理、负载均衡和动静分离

一、反向代理实战 server { listen 80; server_name www.hs.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm;

2021-09-04 02:50:17 898

原创 Nginx快速入门攻略

前言:Nginx常常被我们用来做反向代理或者负载均衡Web服务器,在微服务架构里也在API网关之上用作网关集群的负载均衡。一、Nginx简介1.1、什么是NginxNginx 是一个高性能的 HTTP 和反向代理Web服务器,特点是占用内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好。Nginx是伊戈尔·赛索耶夫为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。Nginx 专为性能优化而.

2021-09-02 00:45:16 357

原创 数据库表设计3:微信、QQ第三方多账号登陆

前言:相比于本地注册,第三方登录一般来说比较方便快捷。因为显著降低了用户的注册或登录成本,从而减少由于本地注册的繁琐性而带来的隐形用户流失,最终提高注册转化率。1. 什么是第三方登录所谓的第三方登录,是说基于用户在第三方平台上已有的账号和密码来快速完成己方应用的登录或者注册的功能。而这里的第三方平台,一般是已经拥有大量用户的平台,国外的比如Facebook,Twitter等,国内的比如微博、微信、QQ等。使用第三方登录后,要求用户补充一些信息(手机号、邮箱等等),如果用户信息已存在,则直接绑

2021-09-01 12:44:54 8424 2

原创 数据库表设计2:用户关注粉丝

前言:在社交类系统中,用户与用户的好友关系的设计必不可少,那么如何设计好友的数据库至关重要,本篇文章带大家学习一下微博相关的设计方案。一、用户好友关系分类基础分析第一步,有一张用户表,表内包含用户的基本信息,比如账号、姓名、性别等信息。这里用tb_user表示用户信息表。ID 用户名1 张三2 李四3 王五4 赵六第二步,需要将用户与用户直接建立好友关系。这里有两种情况:单向好友关系、互为好友关系。- 单向好友关系就是张三在李四的好友列表中,但李四...

2021-09-01 00:06:04 4972

空空如也

空空如也

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

TA关注的人

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