自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

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

原创 RocketMQ基础教程1

官方下载https://rocketmq.apache.org/dowloading/releases/官方教程https://rocketmq.apache.org/docs/quick-start/也可以下载rocketmq源码进行编译 > unzip rocketmq-all-4.4.0-source-release.zip > cd rocketmq...

2019-11-10 21:12:57 221

原创 Redis持久化方案RDB和AOF

Redis 持久化之RDB和AOFRedis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File)。如果你想快速了解和使用RDB和AOF,可以直接跳到文章底部看总结。本章节通过配置文件,触发快照的方式,恢复数据的操作,命令操作演示,优缺点来学习 Redis 的重点知识持久化。RDB 详解RDB 是 Redis 默认的持久化方案。在指...

2019-11-10 16:43:13 147

原创 Redis六种数据淘汰策略

Redis提供了6种数据淘汰策略: volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰; volatile-random:随机淘汰数据,只淘汰设定了有效期的key; allkeys-random:随机淘汰...

2019-11-10 16:14:22 756

原创 Redis哨兵模式

目录一、Redis Sentinel(哨兵)介绍二、哨兵模式搭建三、示例代码Sentinel(哨兵)是Redis的高可用解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理...

2019-11-10 15:23:35 152

原创 SpringBoot启动过程分析

1.1 Springboot启动:@SpringBootApplicationpublic class ServerApplication { public static void main(String[] args) { SpringApplication.run(ServerApplication.class,args); }}从上面代码看,调...

2019-11-02 20:38:08 188

原创 线程池

线程池实现原理当向线程池提交一个任务之后,线程池的处理流程如下:判断是否达到核心线程数,若未达到,则直接创建新的线程处理当前传入的任务,否则进入下个流程 线程池中的工作队列是否已满,若未满,则将任务丢入工作队列中先存着等待处理,否则进入下个流程 是否达到最大线程数,若未达到,则创建新的线程处理当前传入的任务,否则交给线程池中的饱和策略进行处理。流程如下图:java中的线...

2019-11-02 20:35:47 200

原创 并发编程--ReentrantReadWriteLock源码解析

ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantR...

2019-11-02 20:35:31 189

原创 Guava的RateLimiter限流

为什么需要限流?在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。限流可以认为服务降级的一种,限流通过限制请求的流量以达到保护系统的目的。一般来说,系统的吞吐量是可以计算出一个阈值的,为了保证系统的稳定运行,一旦达到这个阈值,就需要限制流量并采取一些措施以完成限制流量的目的。比如:延迟处理,拒绝处理,或者部分拒绝处理等等。否则,很容易导致服务器的宕机。一、限流算法常用...

2019-11-02 20:35:06 249

原创 并发包下原子类

概览原子操作是指不会被线程调度机制打断的操作,这种操作一旦开始,就一直运行到结束,中间不会有任何线程上下文切换。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分,将整个操作视作一个整体是原子性的核心特征。在java中提供了很多原子类,笔者在此主要把这些原子类分成四大类。原子更新基本类型相关实现类:Atomi...

2019-10-28 17:53:32 309

转载 深入源码分析 Java 线程池实现原理

池化技术池化技术简单点来说,就是提前保存大量的资源,以备不时之需。在机器资源有限的情况下,使用池化技术可以大大的提高资源的利用率,提升性能等。在编程领域,比较典型的池化技术有:线程池、连接池、内存池、对象池等。本文主要来介绍一下其中比较简单的线程池的实现原理,希望读者们可以举一反三,通过对线程池的理解,学习并掌握所有编程中池化技术的底层原理。创建一个线程在Ja...

2019-10-22 22:00:23 132

原创 ThreadLocal内存泄漏问题

前言ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析ThreadLocal内存泄漏的问题ThreadLocal实现原理 ThreadLocal为什么会内存泄漏 ThreadLocal最佳...

2019-10-21 11:14:17 177

原创 AQS的实现原理

AbstractQueuedSynchronized(AQS),抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch...。我们以ReentrantLock作为讲解切入点。1. ReentrantLock的调用过程ReentrantLock把所有Lock接口的操作...

2019-10-20 15:03:16 670

原创 tomcat优化

1. conf/server.xml中Executor对应的相关参数使用线程池:<!--连接池设置--><Executor name="tomcatThreadPool" --线程池名namePrefix="catalina-exec-" --线程名称前缀 namePrefix+threaNumbermaxThreads="1000" --池中最大线程数min...

2019-08-01 22:23:57 121

原创 JVM常用内存参数配置

一、常用参数-XmsJVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存;开发测试机JVM可以保留默认值。(例如:-...

2019-08-01 21:42:56 131

原创 深入理解JVM

Java程序通过编译生成class文件,生成的class文件通过JVM(Java VirtualMachine)来运行,JVM在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,Java虚拟机所管理的内存将会包括以下几个运行时数据区域。程序计数器(Program Counter Register) 学过《计算机组成原理》的人对于这个名词都不...

2019-08-01 21:18:52 156

原创 Fork/Join框架学习

1. 概述ava.util.concurrent.ForkJoinPool由Java大师Doug Lea主持编写,它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。本文中对Fork/Join框架的讲解,基于JDK1.8+中的Fork/Join框架实现,参考的Fork/Join框架主要源代码也基于JDK1.8+。2. 常用方法F...

2019-08-01 21:00:19 137

原创 JAVA类加载机制

一、类加载类加载分为三个步骤:加载、连接、初始化。1.加载类加载指的是将class文件读入内存,并为之创建一个java.lang.Class对象,即程序中使用任何类时,系统都会为之建立一个java.lang.Class对象,系统中所有的类都是java.lang.Class的实例。类的加载由类加载器完成,JVM提供的类加载器叫做系统类加载器,此外还可以通过继承ClassLoader基类...

2019-08-01 19:30:40 163

原创 秒杀系统设计(JAVA)

高并发一、前端1.静态化页面,将页面缓存在用户的浏览器和CDN上2.提交后按钮disabled,禁止用户重复提交二、服务器集群1.通过nginx分发请求,提前预判会产生的PV数,部署合适数量的服务器集群,防止其中一台Web机器挂了,导致流量分散到其他正常工作的机器上,再导致正常的机器也挂,将整个Web系统拖垮2.优化服务器中间件如tomcat jvm优化(虚拟机初始化时的最小内...

2019-08-01 19:03:19 771

原创 并发编程--并发容器的原理,7大并发容器详解、及使用场景

1.什么是同步容器Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map,大家熟知的这些集合类ArrayList、LinkedList、HashMap这些容器都是非线程安全的。如果有多个线程并发地访问这些容器时,就会出现问题。因此,在编写程序时,在多线程环境下必须要求程序员手动地在任何访问到这些容器的地方进行同步处理,这样导致在使用这些容器的时候非常地不方便。所...

2019-07-31 22:58:35 186

原创 并发编程--Synchronized同步锁的底层实现

Synchronizedsynchronized 翻译为中文的意思是同步,也称之为”同步锁“。synchronized的作用是保证在同一时刻,被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。Synchronized的使用1.synchronized的3种使用方式修饰实例方法:作用于当前实例加锁 修饰静态方法:作用于当前类对象加锁 修饰代码块:指定加...

2019-07-31 22:53:01 380

原创 高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

哈希表1.介绍哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,我们将其扩展到可以处理更加复杂的类型的键。2.链式哈希表链式哈希表从根本上说是...

2019-07-31 22:35:38 449

原创 MYSQL几种存储引擎的比较

区别InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,...

2019-07-31 21:47:52 171

原创 Kafka、RabbitMQ、RocketMQ等消息中间件的对比

2019-07-31 21:12:02 119

原创 基于ZooKeeper实现分布式锁

基于ZooKeeper分布式锁的流程在zookeeper指定节点(locks)下创建临时顺序节点node_n 获取locks下所有子节点children 对子节点按节点自增序号从小到大排序 判断本节点是不是第一个子节点,若是,则获取锁;若不是,则监听比该节点小的那个节点的删除事件 若监听事件生效,则回到第二步重新进行判断,直到获取到锁具体实现下面就具体使用java和zook...

2019-07-31 19:41:30 100

原创 设计模式--策略模式

概念其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。特点策略模式体现了面向对象程序设计中非常重要的两个原则:封装变化的概念。编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。组成抽象策略角色这个是一个抽象的角色,通常情况下使用接口或...

2019-07-31 18:43:42 89

原创 使用Rocket MQ事务消息达到数据最终一致性

参考1、 http://rocketmq.apache.org/rocketmq/the-design-of-transactional-message/ Rocket MQ事务消息的设计2、https://rocketmq.apache.org/docs/transaction-example/ RocketMQ 事务消息的例子0x00 前言在分布式环境下,经常会有跨服务的事务需...

2019-07-30 21:48:37 470

转载 JAVA内存模型

一 Java内存模型1模型Java内存逻辑模型如下:所有变量都存储在主内存中。每个线程都有自己的工作内存,工作内存中保存了线程使用到的主内存中变量的副本。线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,不能直接操作主内存。不同线程之间无法访问对方的工作内存。线程之间的值传递均需通过主内存来完成。2协议 操...

2019-07-30 14:10:23 109

原创 MYSQL 索引原理

索引是什么?索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。索引的工作机制是怎样的?如上图中,如果现在有一条sql语句 select * from teacher where id = 101,如果没有索引的条件下,我们要找到这条记录,我们就需要就行全表扫描,匹配id = 101的数据。如果有了索引,我们就可以快速的通过索引找到101所对应的行记录在磁盘中的地址,再根...

2019-07-30 13:56:57 159

原创 缓存穿透、雪崩解决方案及缓存击穿的四种解决方案

前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案有...

2019-07-30 10:52:00 313

原创 API接口安全性设计

接口的安全性主要围绕token、timestamp和sign三个机制展开设计,保证接口的数据不会被篡改和重复调用,下面具体来看:Token授权机制:用户使用用户名密码登录后服务器给客户端返回一个Token(通常是UUID),并将Token-UserId以键值对的形式存放在缓存服务器中。服务端接收到请求后进行Token验证,如果Token不存在,说明请求无效。Token是客户端访问服务端的凭...

2019-07-30 10:47:37 133

原创 秒杀系统高并发请求排队处理

1.请求参数封装,有个随机的用户ID 用来区分不同用户的请求:import java.util.Random;public class OrderRequest { private int goodId = new Random().nextInt(100000);// 商品id private int userId = new Random().nextInt(1000...

2019-07-30 10:30:52 1360

原创 Spring AOP原理

AOP: Aspect Oriented Programming 面向切面编程。   是目前软件开发中的一个热点。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。   主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。   主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代...

2019-07-30 10:05:22 104

原创 支撑百万并发的数据库架构如何设计

问题如果说此时你还是一台数据库服务器在支撑每秒上万的请求,负责任的告诉你,每次高峰期会出现下述问题:你的数据库服务器的磁盘 IO、网络带宽、CPU 负载、内存消耗,都会达到非常高的情况,数据库所在服务器的整体负载会非常重,甚至都快不堪重负了。 高峰期时,本来你单表数据量就很大,SQL 性能就不太好,这时加上你的数据库服务器负载太高导致性能下降,就会发现你的 SQL 性能更差了。 最明显...

2019-07-30 07:16:03 817

原创 如何保证缓存与数据库的双写一致性?

问题一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去。串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上的一个请求。缓存+数据库读写模式最经典的缓存+数据库读写的模式,就...

2019-07-29 23:18:08 68

原创 自定义基于springboot的starter

我们先创建一个 Starter,名字叫myjson-spring-boot-starter,并加入自动装配和 fastjson 的依赖,如下然后我们创建一个 Service,并增加一个public String objToJson(Object object)方法,直接调用fastjson 的方法import com.alibaba.fastjson.JSON;public c...

2019-07-29 22:54:30 171

原创 MYSQL索引失效分析

1. 前言  索引的建立是为了让我们更加高效快速的查询出结果,但是,要想充分利用起索引,我们首先要解决的最大问题就是要避免索引失效,下面我们来一起通过实例来探讨造成索引失效的情况,并通过优化SQL查询语句来避免索引失效。  ➤ 准备工作:、创建数据表SQLCREATE TABLE `staffs` ( `id` int(11) NOT NULL AUTO_INCREMENT C...

2019-07-28 19:52:45 125

原创 RabbitMQ持久化

RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我个人觉得大多数开发人员都会选择持久化。队列和交换机有一个创建时候指定的标志durable。durable的唯一含义就是具有这个标志的队列和交换机会在重启之后重新建立,它不表示说在队列当中的消息会在重启后恢复。消息队列持久化包括3个部分1、exchange持久化,在声明时指定durable => true...

2019-07-28 17:29:16 610

原创 RabbitMQ死信队列、延迟队列

一、死信队列DLX(Dead Letter Exchange),死信交换器。当队列中的消息被拒绝、或者过期会变成死信,死信可以被重新发布到另一个交换器,这个交换器就是DLX,与DLX绑定的队列称为死信队列。造成死信的原因:信息被拒绝 信息超时 超过了队列的最大长度可以通过设置x-dead-letter-exchange参数指定DLX,设置x-dead-letter-routing-...

2019-07-28 16:24:19 615

原创 SpringMVC工作原理

SpringMVC的工作原理图:SpringMVC流程1、 用户发送请求至前端控制器DispatcherServlet。2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。3、...

2019-07-28 15:33:08 103

转载 ConcurrentHashMap源码解析

一、出现背景1、线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。2、效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问...

2019-07-28 15:28:21 133

空空如也

空空如也

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

TA关注的人

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