5 jeff_fangji

尚未进行身份认证

喜欢专研计算机技术

等级
TA的排名 4w+

使用Redis实现优先级队列

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

2018-01-28 17:55:07

理解Play框架线程池

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

2017-11-20 18:39:40

Play框架的Netty Http服务器实现

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

2017-09-25 18:44:32

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

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

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

2017-06-04 09:30:21

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

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

2016-11-27 21:18:51

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

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

2016-11-16 10:08:05

Tastypie的Django View方法

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

2016-09-05 14:17:40

MongoDB中的一致性总结

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

2016-06-17 20:48:16

Redis 发布/订阅

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

2016-03-21 09:54:44

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

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

2015-05-03 17:21:40

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

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

2015-05-01 13:36:29

Redis介绍

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

2015-04-14 23:42:29

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

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

2015-03-14 13:40:34

Zookeeper:服务器和会话

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

2015-03-07 22:52:05

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

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

2015-03-03 23:50:03

Zookeeper的日志和磁盘使用

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

2015-03-02 23:40:50

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

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

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

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

2015-02-23 13:02:08

查看更多

勋章 我的勋章
    暂无奖章