- 博客(103)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
Java 集合框架 ArrayList 源码剖析
ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。前面已经提过,Java泛型只是编译器提供...
2018-08-11 14:31:40
205
分布式存储系统关键问题
(一)关键问题数据分布对于存储系统,最重要的问题就是数据分布,即什么样的数据放置在什么样的节点上。数据分布时需要考虑数据是否均衡、以后是否容易扩容等一系列问题。不同的数据分布方式也存在不同的优缺点,需要根据自身数据特点进行选择。1)哈希分布 => 随机读取取模直接哈希:将不同哈希值的数据分布到不同的服务器上 关键:找出一个散列特性很好的哈希函数问题:增加...
2018-08-06 10:44:35
211
基于Elasticsearch实现搜索建议
搜索建议是搜索的一个重要组成部分,一个搜索建议的实现通常需要考虑建议词的来源、匹配、排序、聚合、关联的文档数和拼写纠错等,本文介绍一个基于Elasticsearch实现的搜索建议。问题描述电商网站的搜索是最基础最重要的功能之一,搜索框上面的良好体验能为电商带来更高的收益,我们先来看看淘宝、京东、亚马逊网站的搜索建议。在淘宝的搜索框输入【卫衣】时,下方的搜索建议包括建议词以及相关的标签...
2018-07-27 08:23:12
375
互联网后端基础设施
1.1 后端基础设施使用Java后端技术的目的就是构建业务应用,为用户提供在线或者离线服务。因此,一个业务应用需要哪些技术、依赖哪些基础设施就决定了需要掌握的后端技术有哪些。纵观整个互联网技术体系再结合公司的目前状况,笔者认为必不可少或者非常关键的后端基础技术/设施如下图所示:这里的后端基础设施主要指的是应用在线上稳定运行需要依赖的关键组件或者服务。开发或者搭建好以上的后端基础设...
2018-07-26 11:11:27
337
利用cookies实现对弹出窗口频率的控制
原理:当用户第一次访问网站时候,此时没有设置cookies参数,并且设置过期,弹出显示对话框,弹完之后,设置cookies参数”popped=yes;expires=”+date.toGMTString()”,第二次加载时候,判断存在这个参数,则跳过加载对话框,cookies失效后,浏览器会自动删除失效的参数代码:JS/css引入<link rel=”style...
2018-07-14 08:40:35
143
集成druid数据源【JWordPress前台项目实战】
写在前面 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,下面我们来讲讲springboot如何继承druid连接池代码pom.xml添加相应的jar<!–alibaba 数据库连接池 druid 配置 –><depende...
2018-07-13 10:27:26
188
Semaphore源码分析
源码解析Semaphore有两种模式,公平模式和非公平模式。公平模式就是调用acquire的顺序就是获取许可证的顺序,遵循FIFO;而非公平模式是抢占式的,也就是有可能一个新的获取线程恰好在一个许可证释放时得到了这个许可证,而前面还有等待的线程。构造方法Semaphore有两个构造方法,如下: public Semaphore(int permits) { ...
2018-07-12 11:34:12
107
咱们来聊聊并发工具类Semaphore
什么是Semaphore?Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有实际的许可证这个对象,Semaphore只是维持了一个可获得许可证的数量。应用场景Semaphore可以用于做流量控制,特别...
2018-07-11 10:30:18
110
用栅栏(CyclicBarrier)实现高并发测试
CyclicBarrier含义栅栏允许两个或者多个线程在某个集合点同步。当一个线程到达集合点时,它将调用await()方法等待其它的线程。线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来。等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行。CyclicBarrier可以传入...
2018-07-10 10:59:09
155
五分钟看懂UML类图与类的关系详解
在画类图的时候,理清类和类之间的关系是重点。类的关系有泛化(Generalization)、实现(Realization)、依赖(Dependency)和关联(Association)。其中关联又分为一般关联关系和聚合关系(Aggregation),合成关系(Composition)。下面我们结合实例理解这些关系。基本概念类图(Class Diagram): 类图是面向对象系统建模中最常...
2018-07-09 11:25:26
124
压力测试神器stresstester源码分析
写在前面stresstester-1.0.jar是早期淘宝的一个压力测试工具,很方便开发人员进行本地代码的压力测试,其他专门压力测试工具也有很多,如:jmeter loadrunner 等等,本篇文章主要讲一下stresstester的源码设计先来张类图从上图可以看出StressTestUtils是和开发者打交道的最主要的类;下面来个例子package com.taob...
2018-07-08 08:59:14
483
咱们一起聊聊Java 8 Stream特性
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的...
2018-07-07 09:53:11
122
咱们一起聊聊Java异常
什么是异常程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言风格:用函数返回值作为执行状态?。Java提供了更加优秀的解决办法:异常处理机制。异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的...
2018-07-06 10:34:25
128
在撩单元测试代码覆盖率
在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况,比如,代码覆盖率必须达到80%或 90%。于是乎,测试人员费尽心思设计案例覆盖代码。用代码覆盖率来衡量,有利也有有弊。本文我们就代码覆盖率展开讨论,也欢迎同学们踊跃评论。首先,让我们先来了解一下所谓的“代码覆盖率”。我找来了所谓的定义:代码覆盖率 = 代码的覆盖程度,一种度...
2018-07-05 11:33:41
128
分布式系统最终一致性
前言目前的应用系统,不管是企业级应用还是互联网应用,最终数据的一致性是每个应用系统都要面临的问题,随着分布式的逐渐普及,数据一致性更加艰难,但是也很难有银弹的解决方案,也并不是引入特定的中间件或者特定的开源框架能够解决的,更多的还是看业务场景,根据场景来给出解决方案。根据笔者最近几年的了解,总结了几个点,更多的应用系统在编码的时候,更加关注数据的一致性,这样系统才是健壮的。基础理...
2018-07-04 11:02:41
282
八分钟了解缓存的常见问题?
一、缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。二、缓存并发问题缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取...
2018-07-03 18:07:08
126
如何在Eclipse中如何自动添加注释和自定义注释风格
背景简介丰富的注释和良好的代码规范,对于代码的阅读性和可维护性起着至关重要的作用。几乎每个公司对这的要求还是比较严格的,往往会形成自己的一套编码规范。但是再实施过程中,如果全靠手动完成,不仅效率低下,还难以保证真正的符合规范。所以结合IDE环境,自动生成注释,还是很有必要的。今天我们就说一下,如何使用Eclipse给我们提供的自定义代码模版的功能来作业。设置注释模板设置注释模板的入口...
2018-07-02 11:16:45
189
Markdown: Basics (快速入门)
Getting the Gist of Markdown’s Formatting Syntax此页提供了 Markdown 的简单概念, 语法说明 页提供了完整详细的文档,说明了每项功能。但是 Markdown 其实很简单就可以上手,此页文档提供了一些范例,并且每个范例都会提供输出的 HTML 结果。其实直接试试看也是一个很不错的方法, Dingus 是一个网页应用程序,你可以把自已编...
2018-06-30 08:14:56
105
再谈幂等机制
一、什么是幂等性?幂等性(Idempotence)。在HTTP/1.1规范中幂等性的定义是:Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests...
2018-06-29 10:30:10
121
服务降级的一点认识
什么是服务降级服务降级:主要是针对非正常情况下的应急服务措施;比如电商平台,在针对618、双11等高峰情形下采用部分服务不出现或者延时出现的情形。举个例子大家都见过女生旅行吧,大号的旅行箱是必备物,平常走走近处绰绰有余,但一旦出个远门,再大的箱子都白搭了,怎么办呢?常见的情景就是把物品拿出来分分堆,比了又比,最后一些非必需品的就忍痛放下了,等到下次箱子够用了,再带上用一用。而服务...
2018-06-28 14:31:26
290
咱们聊聊舱壁模式
什么是舱壁模式舱壁模式(Bulkhead)隔离了每个工作负载或服务的关键资源,如连接池、内存和CPU。使用舱壁避免了单个工作负载(或服务)消耗掉所有资源,从而导致其他服务出现故障的场景。这种模式主要是通过防止由一个服务引起的级联故障来增加系统的弹性。工业中使用舱壁将船舶划分为几个部分,以便在船体破坏的情况下,可以将船舶各个部件密封起来。舱壁的概念在软件开发中可以被应用在隔离资...
2018-06-27 07:31:45
204
咱们来聊聊快速失败和安全失败
一:快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器使用hashNex...
2018-06-26 14:18:33
86
原创 请不要在“微服务”的狂热中迷失自我!
微服务在过去几年一直是一个非常热门的话题(附录1)。何为“微服务的疯狂”,举个例子:众所周知,Netflix在DevOps上的表现非常棒。Netfix可以做微服务。因此:如果我做微服务,我也将非常擅长DevOps。很多情况下,我们盲目的投入巨大的努力来接入微服务模式,然而往往却很少去考虑接入的成本和收益能否有效的帮我们解决当前我们正面临的痛点。下面,我将详细描述微服务是什么...
2018-06-25 08:26:44
144
原创 如何利用Spring Cloud构建起自我修复型分布式系统
利用Netflix所打造的组件及各类大家熟知的工具,我们完全可以顺利应对由微服务以及分布式计算所带来的技术挑战。在过去一年当中,微服务已经成为软件架构领域一个炙手可热的新名词,而且我们也能轻松举出由其带来的诸多比较优势。然而,我们必须清醒意识到的是,一旦开始遵循微服务思路而对现有架构体系进行拆分,就意味着我们将不可避免地进入分布式系统领域。在之前的文章中我们曾经探讨过分布式计算的八大认识...
2018-06-24 10:04:14
290
系统健康检查利器-Spring Boot-Actuator
前言实例由于出现故障、部署或自动缩放的情况,会进行持续启动、重新启动或停止操作。它可能导致它们暂时或永久不可用。为避免问题,您的负载均衡器应该从路由中跳过不健康的实例,因为它们当前无法为客户或子系统提供服务。应用实例健康状况可以通过外部观察来确定。您可以通过重复调用GET /health端点或通过自我报告来实现。现在主流的服务发现解决方案,会持续从实例中收集健康信息,并配置负载均衡器...
2018-06-23 17:54:05
95
原创 JAVA线程的那些事?
.线程是什么?进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。同一时刻运行多个程序的能力。每一个任务称为一个线程。可以同时运行一个以上线程的程序称为多线程程序。Java编写程序都运行在在Java虚拟机(JVM)中,在...
2018-04-21 10:46:29
111
IT技术跳槽的葵花宝典
最近很多人问我面试应该注意什么,很多人不知道如何去选择下一份职业,如何去来一场华丽的跳槽,实现自己的人生的蜕变。我在此就以一个过来人的经历,写点心得体会吧,不夸大,也不含糊其辞,只是给新人们留下点我自认为需要注意的地方和一些值得借鉴的经验吧,希望对大家有一些帮助,我也深感欣慰了。1离职原因 离职的原因曾经听过过有位生意人讲过,员工之所以离职,无非有二1.干的不爽(...
2018-04-11 10:51:43
108
Mysql,Zookeeper,Redis,Mongodb压力测试结果
1. Redis(使用fastredisclient)redis-shard 10连接cpu 7-8% 9-12%root@gleasy cloudredis]# bin/redis-benchmark -t get -h 192.168.0.11 -p 6680 -d 15 -l 60 -c 200 -b shard成功:5740491失败:0总时间:11999368最长用时:42最短用时:0...
2017-12-20 20:38:47
412
原创 有赞支付微服务实践
有赞技术发展历程2014年公司所有业务(交易,商品,ump,支付等等)都在一个单体应用中完成,使用php开发,满足了公司快速发展(我们姑且称为v1.0)。2015年到2016期间,随着业务流量增长,现有架构模式遇到了挑战,公司开始朝着业务拆分和服务化方向迈进。开始采用java作为开发语言,服务化框架使用公司改进过的dubbox,支持跨语言服务调用的nova框架(v2.0)。2017...
2017-07-31 21:52:06
440
原创 RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer)
什么是ProtoBuf? 一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。 它可以作为RabbitMQ的Message的数据格式进行传输,由于是结构化的数据,...
2017-05-22 20:06:35
150
原创 RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)
在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成。那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会通过其它节点求来斐波纳契完成示例。1. 客户端接口 Client interface为了展示一个RPC服务是如何使用的,我们将创建一段很简单的客户端class。 它将会向外提供名字为call...
2017-05-18 22:24:07
126
原创 RabbitMQ消息队列(六):使用主题进行消息分发
在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统。Consumer可以监听不同severity的log。但是,这也是它之所以叫做简单日志系统的原因,因为是仅仅能够通过severity设定。不支持更多的标准。比如syslog unix的日志工具,它可以通过severity (info/warn/crit…) 和模块(auth/cron/ker...
2017-05-13 09:04:01
95
原创 RabbitMQ消息队列(五):Routing 消息路由
上篇文章中,我们构建了一个简单的日志系统。接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log。比如我们希望只有error的log才保存到磁盘上。1. Bindings绑定上篇文章中我们是这么做的绑定:channel.queue_bind(exchange=exchange_name, queue=queue_name)...
2017-05-09 21:49:43
114
原创 RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)
上篇文章中,我们把每个Message都是deliver到某个Consumer。在这篇文章中,我们将会将同一个Message deliver到多个Consumer中。这个模式也被成为 “publish / subscribe”。 这篇文章中,我们将创建一个日志系统,它包含两个部分:第一个部分是发出log(Producer),第二个部分接收到并打印(Consumer)。 我们将构建两个...
2017-05-06 10:08:21
114
原创 RabbitMQ消息队列(三):任务分发机制
在上篇文章中,我们解决了从发送端(Producer)向接收端(Consumer)发送“Hello World”的问题。在实际的应用场景中,这是远远不够的。从本篇文章开始,我们将结合更加实际的应用场景来讲解更多的高级用法。当有Consumer需要大量的运算时,RabbitMQ Server需要一定的分发机制来balance每个Consumer的load。试想一下,对于web applicati...
2017-05-02 21:04:23
132
原创 程序员们是否能用自己熟悉的计算机语言来写诗呢??
2011年的一个晚上,几个工程师在哥本哈根的一家酒吧喝酒。两三瓶啤酒下肚后,其中一位吹嘘说,他可以纯粹根据编写风格辨认出一段计算机程序的作者。对于伊山·博纯(Ishac Bertran),这位在学校学过加泰罗尼亚语诗歌的交互设计师来说,仿佛他们在讨论文学。“我意识到,代码和其它任何语言并没有太多不同,”他说。那晚结束的时候,他向同事提议尝试用代码创作诗歌。一个新的文学流派就此诞生了。从那以...
2017-04-28 09:55:07
376
原创 RabbitMQ消息队列(二):”Hello, World“
本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据”Hello, World“。首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列。它实现的功能”非常简单“:从Producer接收数据然后传递到Consumer。它能保证多并发,数据安全传递,可扩展。和任何的Hello world一样,它们都不复杂。我们将会设计两个程序,一个发...
2017-04-28 09:54:28
83
原创 永远不要活在别人的眼里
永远不要为别人而活着,永远不要被一些事情束缚,永远不要被别人意见所左右。学会倾听自己的内心,学会倾听自己的所需,学会做自己做自己,做一个真正的自己。为了的理想和信念而坚持。不要被其他的琐事带偏离原本属于你自己的轨道。倾听内心,了解自己内心真正所需要的和你最渴望的信念。为自己的心中的目标奋斗终身。别再别人左右自己的,不要因为一些繁琐的事情而蒙蔽了真正的渴望。时刻提醒自己,永远做自己,...
2017-04-28 09:50:00
448
原创 两点之间最快的路线竟然不是直线
看图说话,图片很形象地给了答案。大伙是不是也和小航一样大感意外呢?经过无数学霸的论证和科学实验,上图红色路线是最快的路线,此曲线也因此被称为“最速曲线”。话说这曲线有什么用呢?一个最简单的例子:如果你是一个滑雪运动员,目标是最短时间冲线,你根本就不在乎两点间的最短路径,而是最快路径。如果你沿着最佳曲线下滑,你会获得更多的优势…… 世界读书日的时候,小航看到上面的动态图,隐隐中总觉...
2017-04-24 22:27:19
619
万物的本质
写在前面:今天本来想发一篇技术文章,后来想想还是发这篇文章吧,借此文章送给一位共同奋斗过的同事。希望他能从此文中悟出一些人生道路,以及今后的路如何踏实的去走。最后送他一句话“open his minds, Jump out of your cognitive range,you will find the world so beautiful!”象:世间万物所展现出的的形象,...
2017-04-21 20:52:56
247
linux 学习 初级教程
2010-03-16
高手进来看看,给点思路
2010-05-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人