自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 资源 (1)
  • 收藏
  • 关注

原创 布隆过滤器(BloomFilter)

布隆过滤器的使用场景在架构设计中,通常会涉及这样的场景:词典服务中,查询某个单词是否合法(即是否存在于保存有海量单词的词典文件中) 爬虫服务中,检查某个网页是否已经收录(即是否存在于海量的已爬取网页库中) 文章/商品推荐服务中,检查某篇文章/某个商品是否已经被推荐过(已推荐过的文章或商品不重复推荐); 查询某个元素是否在缓存中存在(假设缓存中的元素非常多)以上的场景,本质上都是从海...

2019-06-15 22:55:39 451

原创 会员中心设计浅谈

背景在JAVA工程架构中,会员中心是非常基础的服务,其主要是服务C端用户(对于电商行业而言就是终端消费者),是引客、用户运营、用户信息存储、用户画像建立中不可或缺的重要部分。会员中心的设计中,如何建立会员信息模型,如何与其他各服务,如营销服务、订单服务、履约服务、评论服务等完成可靠的数据交换,还是需要花一些心思进行设计的。本文就从工程架构的角度,脱离开具体的业务,谈一谈如何设计一个会员中心服务...

2019-01-13 16:33:26 3368 1

原创 Semaphore浅析

背景在之前的文章中介绍了ReentrantLock、Condition和CountDownLatch这些在JAVA多线程中常用的类,它们各有各的使用场景。ReentrantLock通常用于需要可重入锁定、带超时时间的获取锁等场景,Condition通常用于将线程加入条件等待队列/唤醒的场景,CountDownLatch通常用于在程序执行过程中设置等待点,待一定数额的线程全部到达等待点之后集合在...

2018-09-08 21:56:05 641

原创 CountDownLatch浅析

背景前边的文章中已经介绍了JAVA多线程并发工程实践中一批常用的类,比如最为核心的AQS(AbstractQueuedSynchronizer),基本上JAVA多线程并发实践中的常用类的实现都与它能扯上关系;比如ReentrantLock,它实现了可重入的锁,一定程度上弥补了synchronized关键字的不足;比如Condition,它与ReentrantLock相结合,实现了条件等待队列,...

2018-09-08 18:40:13 1426

原创 Condition浅析

背景我们在谈到多线程并发访问临界资源的时候,通常会想到Object类的monitor锁和wait/notify(条件等待/通知)操作。很多同学会想问,既然有了加锁/解锁机制,为什么还要引入条件等待/通知操作呢?原因在于,当A线程对临界资源加锁后(排他锁),其他线程将无法再次获取该临界资源,直到A线程将锁释放。如果A线程执行很久,那么其他线程将在很长一段时间内无法持有临界资源的锁。但是对于Obj...

2018-09-07 21:43:32 371

原创 ReentrantLock浅析

背景在之前的文章中提到了多线程并行操作在工程实践中的重要作用,也提到了如何保持临界资源和串行代码段的线程安全性是十分必要的。在计算机领域,是采用锁来保证线程安全性的。JAVA提供了多种锁的机制,比如早期的synchronized关键字,以它的简单易用被很多早期代码所采纳。但是后来开发者们发现,synchronized关键字没有提供很好的超时机制,且当多线程需要持有的锁相互依赖时容易导致死锁,因...

2018-09-06 23:03:13 204

原创 synchronized关键字浅析

背景在实际工程实践中,多线程并发执行场景十分常见。所谓线程安全性即是多线程并发执行场景中需要保证的基本要求,如果不能保证线程安全性,那么势必会在实际工程实践中产生错误数据、甚至严重且不易察觉的异常处理,导致最终结果的不确定性。对于临界资源,或者是必须串行操作的流程,势必需要保证多个线程中每次仅有一个线程持有或仅有一个线程进入。如何保证多个线程由并行转串行,去持有临界资源或进入必须串行操作的流程...

2018-08-31 22:38:31 1197

原创 BlockingQueue浅析

背景在设计任务处理系统的时候,很自然地想到使用生产/消费者模式。任务由生产者生产完成,然后交由消费者(通常是业务相关的处理器)进行消费,完成任务的处理。由于生产者和消费者的处理能力不可能完全一致,参考实际生活中生产线或工厂库存,可使用Queue来对二者进行隔离。生产者将任务生产完毕之后,不是直接交由消费者来进行立即消费,而是将其加入到Queue中;消费者从Queue中获取任务,然后进行任务分配...

2018-08-28 16:19:34 756

原创 JAVA线程池浅析

线程池的概念在谈到线程池之前,我们先说一说什么是线程与进程的区别与联系。每一个JAVA程序都是一个进程,在某些场景下,为了获得更好的处理性能,缩短处理时间,可以启动多线程来并发执行任务。每一个进程包含一到多个线程,其中一个为主线程;一个线程从属于一个进程。多线程概念的提出主要是为了充分利用CPU资源,在当前多核CPU的计算机上,并行执行任务,提高性能,缩短任务执行时间。但是线程会占用计...

2018-08-22 22:34:20 229

原创 Netty Server端常用组件分析

一、背景在本专题的第一篇文章中,我们简单介绍了Netty网络I/O框架推出的必要性,并给出了一个十分简单的Netty Server端实例。虽然它可以直接运行,但是由于非常简陋,因此并不适宜在生产环境直接使用。从本文开始,我们将对Netty中涉及到的主要组件简单加以介绍,本文主要介绍Netty Server端程序涉及到的Netty常用组件。二、Netty Server端常用组件我们先回到...

2018-08-20 17:06:13 217

原创 Netty使用概述

一、网络I/O框架谈到网络I/O框架,大家通常脑海里边第一个闪现出来的是JAVA BIO(Blocking I/O,阻塞I/O)、JAVA NIO(Non-blocking I/O,非阻塞I/O)和JAVA AIO(Asynchronized I/O,异步I/O)。但是基于原生JDK的I/O组件对网络I/O功能进行实现并用于生产环境略有复杂,以基于JAVA NIO为例,需要开发者自行处理网络连...

2018-08-18 17:13:42 769

原创 如何保证架构设计的灵活性与可扩展性

近些天最为火爆的段子莫过于RD(工程师)与PM(产品经理)的拳打脚踢了,我们先不纠结事情的起因与谁对谁错,单从架构设计的角度漫谈一下如何保证与PM沟通的流畅性,以及如何做到架构设计的灵活性与可扩展性,以应对后续不可避免的需求变更,减少迭代开发工作量,保证迭代开发的可控和系统的可维护。矛盾的产生众所周知,RD与PM之间在工作层面上,往往存在着矛盾。其实不仅是RD与PM,不同子系统的RD与RD...

2018-08-03 22:51:21 5441

原创 Spring框架浅析 -- 数据库事务处理

概述在Spring框架浅析 -- 概述中,我们介绍过,Spring对于数据库操作及事务处理的支持,是Spring功能中较为重要的一环。那么数据库事务是什么?为什么要Spring需要对数据库操作及事务处理进行支持?Spring都提供了哪些方式对数据库事务处理进行支持?这些方式中又有哪种比较适合当前工程开发的实践?在本文中,我们将对这些问题一一展开阐述。什么是数据库事务相信这个问题,具备J...

2018-07-31 09:25:15 2182

原创 Spring框架浅析 -- IoC容器与Bean的生命周期

为什么要使用IoC在介绍Spring IoC容器之前,先让我们来回顾一下什么是IoC,权威的概念如下:https://en.wikipedia.org/wiki/Inversion_of_control简单说就是,不要再手写代码来维护类与类的依赖关系了,而是将依赖关系配置化,交由容器去解析、识别、处理,按照配置文件的方式,完成类及其依赖类的实例化、初始化等工作。那么为什么要使用IoC呢...

2018-07-31 09:24:43 296

原创 Spring框架浅析 -- AOP

什么是AOPAOP-Aspect Oriented Programming,通常翻译为面向切面编程。它的提出实际上是为了补充OOP-Object Oriented Programming的一些不足。那么OOP有哪些不足呢?这里我谈谈自己的一些想法,我们知道OOP的思路通常是,将一个大型的功能划分成若干子功能,然后进一步抽象成为若干小模块或者叫小组件,每一个小组件封装了数据(属性)与操作(方...

2018-07-30 15:00:40 622

原创 Spring框架浅析 -- SpringMVC

Spring MVC使用过Spring用于建设Web服务工程的,都不可避免地要接触Spring MVC。那么MVC究竟是什么?MVC是Model,View和Control的简称,用于标识Web工程中功能划分明晰、各自承担各自职责的模型层、视图层和控制层。如下图所示:通常情况下,用户向Web服务发送请求,由Control层负责对请求进行校验、解析、路由,转发到指定的控制逻辑,然后控制...

2018-07-30 14:59:20 179

原创 Spring框架浅析 -- 概述

作为JAVA后端开发者,Spring应该算是平时工作中最常用的框架了。可以这么说,在大多数互联网公司的后端JAVA服务中,Spring框架的使用占比都会非常高,因此对Spring框架的源码深入了解,从而了解其设计思路、组成原理,是十分有必要的。Spring框架是什么在此,我并没有从官网或者google上摘抄Spring框架的具体介绍,单从我个人的理解上,我认为,Spring框架是一个出色的...

2018-07-30 14:49:08 307

原创 SpringBoot启动过程

指定SpringBoot的入口通常我们使用Spring Boot的时候,会有一个作为程序主入口的类,并在其上标注SpringBootApplication。首先我们来看一下这个SpringBootApplication标注,如下所示:@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented...

2018-07-30 14:47:40 194

原创 Spring Boot概述

什么是Spring Boot在附上我自己对这个问题的理解之前,我们先看一下Spring官方对此的解释(源自https://spring.io/projects/spring-boot):Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you ca...

2018-07-30 14:46:32 240

原创 SOA概述

近些年来,SOA(Service Oriented Architecture)、微服务等概念发展得如火如荼,也在各大公司、各主流产品上得到了成功的实践,并积累了正反两方面的经验。SOA思想的关键,在我看来,主要可分为分、合、细三个维度。 分:是指将之前无比复杂、无比庞大的系统按照横向(按业务需求)、纵向(按功能层次)划分成高内聚、低相互间耦合的服务或模块; 合:是指将通用的功能(比如日志...

2018-07-30 14:45:13 279

原创 JAVA基本数据类型及其包装类

一、背景JAVA基本数据类型几乎每天都会用到,但是你真的了解其在计算机中是如何表示的吗?每一种基本数据类型的取值范围究竟是如何计算得到的?为什么float型所占字节数为4,但比同样占4个字节的int型的取值范围更为广阔?为什么float型和double型变量会有精度丢失的问题?这些问题都值得我们去细细探究一下。二、JAVA基本数据类型 基本数据类型 最小值...

2018-07-30 14:16:31 325

原创 JAVA Blocking I/O

背景JAVA I/O(Input/Output)是JAVA中一个非常重要的组件,因为文件读写、字节数组读写的应用场景非常多,例如,从配置文件中读取配置,将内存中的内容dump到数据文件中,图片文件、视频文件的读写与解析,网络I/O。因此对于JAVA I/O组件的了解是非常必要的。JAVA I/O分为BIO(Blocking IO)、NIO(Non-blocking IO)和AIO(Asynch...

2018-07-30 10:33:11 807

原创 I/O操作 -- 同步与异步,阻塞与非阻塞

背景I/O作为应用系统常用的功能之一,对其有基本的理解是非常有必要的。尤其是在SOA盛行的今天,高效率的I/O是SOA的基础设施RPC框架的基石。本文将针对I/O领域中常见的两组分类:同步与异步,阻塞与非阻塞进行浅析。I/O操作的原理在对I/O进行分类之前,我们先来回顾一下I/O操作的原理,这更有助于我们了解同步与异步、阻塞与非阻塞,以及JAVA BIO、NIO、AIO的底层实现。...

2018-07-29 21:18:38 2766 1

空空如也

空空如也

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

TA关注的人

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