2012年11月21日星期三

Memcached一致性Hash实测

使用的客户端

spy memcached

环境

先启动4个memcached服务,然后向这4个memcached实例写入1w个数据,测试数据分布情况;再增加一个实例,在5个实例的情况下,读取1w条记录,计算实际命中率

代码

启用一致性hash很容易,代码如下:
List servers = new ArrayList();
servers.add(new InetSocketAddress("192.168.12.167", 33001));
servers.add(new InetSocketAddress("192.168.12.167", 33002));
servers.add(new InetSocketAddress("192.168.12.167", 33003));
servers.add(new InetSocketAddress("192.168.12.167", 33004));
servers.add(new InetSocketAddress("192.168.12.167", 33005));
memCachedClient = new MemcachedClient(new KetamaConnectionFactory(), servers);

写入的分布比例


server1 2304
server2 2603
server3 2513
server4 2588

加入一个实例后的命中率

81.38%

2012年11月2日星期五

GOF设计模式-命令模式

command pattern

UML图如下:

命令模式分为四个角色,分别是Invoker,Command抽象接口,Command实现类和Receiver。
用一个Java与模式上的例子解释,玉皇大帝发圣旨,让太白金星招安孙悟空。这里玉皇大帝就是Client,圣旨有一个抽象接口,可以称作圣旨模板,圣旨则是实现类。而太白金星则是任务直接执行Invoker,孙悟空是任务接受者Receiver,真正的执行代码在孙悟空这里。
用Scala代码实现的命令模式如下:
首先是client代码:
object Client extends App {
 val receiver = new Receiver
 val command = new ConcreteCommand(receiver)
 val invoker = new Invoker(command)
 invoker.action
}
然后是Command代码:
trait Command {
 def execute
}
ConcerteCommand:
class ConcreteCommand(re:Receiver) extends Command{
 val receiver = re
 override def execute = receiver.action
}
Receiver:
class Receiver {

  def action = {
    println("Action has been taken.")
  }
}
Invoker:
class Invoker(com:Command) {
 val command = com
 
 def action = command.execute
}
执行结果:
Action has been taken.

命令模式的优点:

1. 新命令很容易加入到系统
2. 允许接受者一方决定是否要否决请求
3. 能较容易的设计一个命令队列
4. 也可以很容易实现对请求的undo和redo。
5. 在需要的情况下,可以很容易的将命令计入日志。
6. 将请求的操作对象和具体执行的操作对象分开;
7. 可以合成命令。

命令模式的使用场景

1. 作为回调,先定义好一个函数,在以后调用此函数;
2. 需要在不同的时间请求,将请求排队
3. 系统需要支持命令的撤销;
4. 如果系统需要记录命令日志,方便在系统崩溃后通过日志调用execute方法恢复系统在崩溃前的数据更新;
5. 一个系统需要支持交易;