自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 使用Redis实现优先级队列

优先级队列是一种如先进先出队列和堆栈数据结构的抽象数据类型。所不同的是每一个元素关联一个“优先级”。优先级高的元素比优先级低的元素优先得到处理。本文讲解如何基于Redis的SORTED SET数据类型实现优先级队列。SORTED SET中元素关联一个SCORE,可以按SCORE有序查询元素。优先级队列基本操作实现如下:is_empty: 查看队列是否为空。使用EXISTS命...

2018-01-28 17:55:07 3008

翻译 理解Play框架线程池

Play框架是一个自低向上的异步Web框架,使用Iteratee异步处理数据流。因为Play内核中的IO不会被阻塞, 所以Play中线程池比传统Web框架使用更少的线程。因此,如果你准备写阻塞IO代码,或者潜在需要做很多CPU密集型工作的代码,你需要明确知道哪个线程池承担这个工作负担,并需要相应地优化它。如果不考虑这一点,做阻塞IO很可能会导致Play框架的性能很差。

2017-11-20 18:39:40 2680 4

原创 Play框架的Netty Http服务器实现

Play使用Bootstrap初始化服务器Channel,设置Channel类,EventLoop和Handler等。 (Play没有使用专为服务器准备的ServerBoostrap,而是使用更加通用的Bootstrap。这样就可以自己安排对客户端Channel的设置)

2017-09-25 18:44:32 1548

原创 Play从2.6.x开始使用Akka HTTP作为默认服务后端

在Play 2.6.x之前,Play默认使用Netty服务后端。 而到了2.6.x,默认服务后端换成了Akka HTTP, 但还是可以通过手动选择Netty服务后端。想升级到2.6.x,就需要注意到这一点了。因为Akka HTTP服务器要比Netty HTTP服务器慢。所以如果对性能特别敏感,升级完就需要手动选择Netty服务后端。

2017-09-20 18:04:58 2011

原创 MySQL Connection使用Hack方法回到没有默认数据库的状态

如果我们打开一个MySQL Connection URL时不指定数据库,那么创建的Connection就没有默认数据库。在这种情况,要么调用Connection实例的setCatalog()方法来设置数据库,要么在你的SQL中使用数据库名称来完整地指定表名。那如果我们使用setCatalog()方法来设置数据库,并完成我们的数据库操作后,我们想还原现场,Connection依然想回到没有默认数据库的状态应该怎么办。使用setCatalog(null), setCatalog("")或者USE ``都是不管

2017-06-04 09:30:21 779

原创 WebApp由于需要从Spring官网下载schema文件导致启动时长时间卡住问题的分析和解决

我们的WebApp是使用J2EE和Spring实现,并运行在Tomcat容器。在某天夜里11点左右上线了一个新的功能,但是重新启动Tomcat却发现WebApp一直没有启动成功。

2016-11-27 21:18:51 994

原创 使用gevent导致django.urls没有定义urlpatterns错误

python+django+gevent+uwsgi搭建的Restful API服务,在uwsgi重启之后,访问会遇到500错误。服务器端会出现如下ImproperlyConfigured异常。这个异常表示在urlconf ”XXX.django.urls“中没有定义urlpatterns。

2016-11-16 10:08:05 2365

原创 Tastypie的Django View方法

默认Tastypie有四个Django View方法。 不考虑Resource.wrap_view方法,当一个请求进入了这几个方法,就说明我们已经从Django进入到Tastypie的世界。

2016-09-05 14:17:40 786

原创 MongoDB中的一致性总结

根据Write Concern, Read Concern和Read Preference, MongoDB可以有多种不同的一致性。下面是我总结的内容,如有不对的地方,请帮忙指正。

2016-06-17 20:48:16 4101

翻译 Redis 发布/订阅

SUBSCRIBE, UNSBUSCRIBE和PUBLISH实现了发布/订阅消息范型。关于这个范型,在Wikipedia上的解释是发送者(发布者)没有程序化地指定他们消息的具体接收者(订阅者)。 发布的消息根据特征放入到对应的通道,并且无须知道订阅者是谁。订阅者可以对一个或者多个通道的表示感兴趣,并且仅接收感兴趣的消息,而无须知道发布者是谁。发布者和订阅者解耦有利于扩展性和动态网络拓扑。

2016-03-21 09:54:44 824

原创 Storm源码分析入门:使用Counterclockwise远程单步调试Storm的Java和Clojure源码

单步调试代码可以非常直观地了解程序运行过程中状态变化。本文讲述了如何使用Counterclockwise远程调试Storm的Java和Clojure源码。这样可以更加直观和清晰地了解Storm源码。

2015-05-03 17:21:40 1626

翻译 Redis的数据类型和抽象概念的介绍

Redis不是一个简单的键值存储,事实上它是一个数据结构服务器,支持不同类型的值。这意味着在Redis中值并不限于一个简单的string,而是可以支持更复杂的数据结构,不像在传统的键值存储中,你只能关联一个String键到一个String值。下面是Redis支持的所有数据结构列表。这个文档会对这些数据结构分别进行讲解。

2015-05-01 13:36:29 1947 1

翻译 Redis介绍

Redis是一个开源, BSD许可和高级键值缓存和存储。由于键能包含strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs, 所以它经常被称为数据结构服务器。 你可以在这些类型上进行原子操作,如附加到一个字符串;递增哈希中的值;将元素放入列表;进行集合的交,并和差运算;或者从排序集合中获得排在最前面的成员。

2015-04-14 23:42:29 667

原创 Hadoop源码分析:HDFS数据读写流量控制(DataTransferThrottler类)

DataTransferThrottler类用于在Datanode读写数据时控制数据传输速率。这个类是线程安全的,可以被多个线程共享使用。使用方式是先构造DataTransferThrottler对象并设置周期period和带宽bandwidthPerSec,然后在数据实际读写前调用DataTransferThrottler.throttle()方法。如果I/O的速率相对给定的带宽太快,则该方法会将当前线程wait。

2015-03-14 13:40:34 2319

翻译 Zookeeper:服务器和会话

会话(Session)构成了Zookeeper中的一个重要抽象。顺序保证(Ordering guarantee),临时节点(Ephemeral znode)和Watch都与会话紧密耦合。因此,Session追踪机制(Session track mechnism)对于Zookeeper来说是非常重要的。

2015-03-07 22:52:05 1263

原创 ZooKeeper源码分析:Log和Snapshot持久化(SyncRequestProcessor类)

事务日志的持久化是在SyncRequestProcessor类中实现,并会按照一定的规则滚动日志(关闭当前文件,创建一个新文件),以及生成新的Snapshot。在持久化过程中,使用组提交(Group Commits)来优化磁盘io 操作。组提交是指将多个Request对象的事务作为一次写附加到磁盘上。使用这种方式可以在持久化多个事务的时候,只使用一次磁盘寻道(Disk Seek)的开销。

2015-03-03 23:50:03 1962

翻译 Zookeeper的日志和磁盘使用

服务器使用事务日志来持久化事务。在接受一个提案之前,服务器(Follower和Leader)需要将提案中的事务持久化到事务日志中。事务日志是服务器本地磁盘的一个文件。事务按顺序附加到这个文件。服务器时不时的会关闭当前文件,创建一个新文件来滚动(Roll Over)日志。

2015-03-02 23:40:50 2140

原创 Full GC分析:设置Java VM参数实现在Full GC前后自动生成Dump

本文讲解了如何设置Java VM参数实现在Full GC前后自动生成Dump。共有三个VM参数需要设置:HeapDumpBeforeFullGC 实现在Full GC前dump。HeapDumpBeforeFullGC 实现在Full GC后dump。HeapDumpPath 设置Dump保存的路径设置这些参数的方法,这里总结了四种,大家可以根据情...

2015-02-27 22:37:32 18002 5

翻译 Zookeeper: Session的状态和生命期

Zookeeper的Session生命期(Lifetime)是从创建到结束的这段时间。Session的结束可能是被优雅地关闭,也可能是因超时而被关闭。在讲Session的行为之前,我们需要先考虑一下Session可能出现的状态,以及改变这些状态的事件。(这篇博客是Flavio Junqueria和Benjamin Reed的Zookeeper书的第二章中States and the Lifetime of a Session翻译)

2015-02-23 14:30:06 8073

原创 Linux的/etc/inittab文件中init级别设置成6(重启)或者不支持级别的解决方法

如果不小心将/etc/inittab文件中的init级别设置成6(重启)或者不支持级别,系统就不能正常启动。本博客讲解如何通过Grub来解决这个问题。

2015-02-23 13:02:08 3768

原创 Zookeeper源码分析:Watcher机制

通过Watcher源码分析,可以更加清晰地理解Watcher的特性。 本文通过源码分析了设置Watcher,以及修改znode数据触发Watcher的过程。

2015-02-22 22:47:06 1685

原创 通过Tomcat的Http11NioProtocol源码学习Java NIO设计

Tomcat的Http11NioProtocol协议使用Java NIO技术实现高性能Web服务器。本文通过分析Http11NioProtocol源码来学习Java NIO的使用。从中可以了解到阻塞IO和非阻塞IO的配合,NIO的读写操作以及Selector.wakeup的使用。

2015-02-22 21:56:08 6164

翻译 Storm的故障容忍性

本文讲解了Storm故障容忍性(Fault-Tolerance)的设计细节:当Worker、节点、Nimbus或者Supervisor出现故障时是如何实现故障容忍性,以及Nimbus是否存在单点故障问题。

2015-02-17 17:17:14 2619

原创 ZooKeeper源码分析:Quorum请求的整个流程

Quorum请求是转发给Leader处理,并且需要得一个Follower Quorum确认的请求。这些请求包括: znode的写操作(OpCode.create,OpCode.delete,OpCode.setData,OpCode.setACL) , Session的创建和关闭操作(OpCode.createSession和OpCode.closeSession) 以及OpCode.multi。本博文分析了Client, Follower和Leader协同完成Quorum请求的过程。

2015-01-22 00:01:23 8392 2

翻译 Zookeeper内幕

这篇博文是关于Zookeeper官网上zookeeperInternals的翻译(http://zookeeper.apache.org/doc/trunk/zookeeperInternals.html),讲述了Zookeeper的内部机制。由于博主的水平有限,如有错误和疏漏之处,恳请读者不吝指正。

2015-01-06 23:37:18 5097

原创 vi应用:使用v和s命令两步提取出想要的内容

本文以提出spring中配置文件applicationContext.xml中所有bean的id为例,讲解如何使用vi的v和s命令两步提取出想要的内容。

2014-12-30 23:47:49 4401

原创 2048 Puzzle游戏攻略

2048 Puzzle是当前很火的一款手机游戏。在地铁上经常会看到有人在玩这个游戏。 按照本中规则说明保持四个规则,并且避免出现提到的两个异常形就可以成功合成2048。

2014-12-22 07:49:34 6051

翻译 Shallow vs. Retained Heap

Shallow Heap和Retained Heap这两个名词在Java内存分析时经常遇到。本博文是Eclipse Memory Analyzer中关于Shallow Heap和Retained Heap帮助文档的翻译。 Shallow Heap是被一个对象消费的内存。Retained Heap是指X的Retained Set中所有对象的Shallow Size和。

2014-12-14 19:13:38 4363

原创 Tomcat中常见线程说明

本文讲述了Tomcat常见线程的功能、名称、线程池和配置等信息,如JIoEndpoint.Work线程、Acceptor线程、Main线程、TP-Processor线程、TP-Monitor线程和ContainerBackgroundProcessor线程等。其中源码来自于Tomcat 6.0.18。

2014-12-07 11:06:07 13541

原创 JAVA泛型容器的类型检查

泛型容器是通过指定容器包含对象的类型,由编译器保证对象类型的正确性,在编译阶段就能检查出类型错误。如下列将List对象longList赋予一个List对象gtList,会报编译错误。如果这只是在编译检查,那么我们是否可以绕过编译检查呢?

2014-11-25 23:13:45 6470

原创 最终一致性的理解

一致性问题的历史发展       完美的一致性模型是:当做了一个更新操作,所有的观察者将看到这个更新。       在70年代后期的数据库系统,这个完美的一致性模型第一次被认为很难达到。       在90年代中期,随着更大规模的互联网系统的出现,许多之前的实践被修正。人们开始思考有效性可能不是系统最重要的特性,同时他们在努力寻找什么应该被权衡考虑。       在2000年 Pr

2014-11-09 23:34:59 13396

原创 北京互联网技术大会, 有很多知名互联网公司的技术架构分享

北京互联网技术大会,  有很多知名互联网的分享

2014-11-05 00:15:58 3681

翻译 分布式系统内的时间,时钟和事件顺序

这篇博客是关于Lamport的经典论文Time, Clocks, and the Ordering of Events in the Distributed System的翻译。由于博主的水平有限,如有错误和疏漏之处,恳请读者不吝指正。 本文分析和展示了一个事件在另一个事件之前发生的概念,由此定义了事件的偏序。并给出了一个同步系统逻辑时钟的分布式算法。这个逻辑时钟可以用来获得事件的全序。这个全序

2014-11-01 11:16:30 7825

原创 SSH登陆远程Linux服务器运行VisualVM, 进行Java性能分析

SSH登陆远程Linux服务器是普遍的方式,下面讲述如何使用Putty,Xming工具在Windows机器上SSH登陆到Linux服务器,并运行VisualVM可视化界面程序,进行Java性能分析。Step 1: 配置Linux服务器上sshd_config文件, 允许X11转发使用编辑工具打开/etc/ssh/sshd_config,并加上如下语句:X11Fo

2014-10-14 07:30:42 11814 6

原创 Jenkins multiple jobs but one same build queue

We use Locks and Latches plugin to implement multiple jobs but one same build queue. It has a bug. When both A,B jobs are in build queue, and are executed at the same time. The lock for A and B is no

2014-09-30 22:30:20 4266

原创 Adobe CS4 安装

弄了好长一段时间,终于把ACS4跑通了。 ACS4是Adobe DRM解决方案的内容服务器部分,首先从adobe的官网上下载ACS4的安装文件ADBE_ContentServer4.zip。 解压后文件如下: ACS3toACS4convert_4_0_18.zip admin-conf.txt admin.war ContentServer_Release_Notes.pdf

2014-09-30 21:35:18 4212

原创 使用Spring AOP 需要注意的问题

》如果是使用Jdk动态代理实现Spring AOP,Spring容器的getBean方法获得的对象是不能转型成该Bean定义的Class类型。 如下定义的id为calculatorService的bean,class类型是CalculatorServiceImpl,该类实现了ICalculatorService接口并且我们给这个Bean定义了使用Jdk动态代理实现的AOP。 使用Sprin

2014-09-30 07:39:27 5359

原创 Spring AOP与Java动态代理

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,可以实现在不修改源代码的情况下给程序动态同意添加功能的一种技术。作为面向对象编程的一种补充,专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。AOP 实现的关键就在于 A

2014-09-30 07:38:53 4378

原创 Java动态代理

动态代理是代理模式的实现,在程序运行时,运用反射机制动态创建而成。Java动态代理是Java语言世界的动态代理。 为了更好地理解动态代理,我们先讲述一下代理模式。 代理模式一种软件设计模式, 是代理类与委托类有同样的接口。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 如下面代理模式比较通用的类图,Proxy是代理类,RealSubject是目标类,它们

2014-09-29 07:40:40 4363

空空如也

空空如也

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

TA关注的人

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