Google Guava Collections(简称 Guava)是Google推出的Java类库,针对JDK做了很多增强和扩展,例如Map的K-V转换,ConcurrentHashMap的构造等。可以有效使你的代码量更简洁高效。

Guava Cache是一个全内存的本地缓存实现,提供了线程安全的实现机制。Guava Cache本身是一个Map,实现的机制类似ConcurrentHashMap。

官方注解中提出在以下需求中可能会使用到它:

  • automatic loading of entries into the cache
  • least-recently-used eviction when a maximum size is exceeded
  • time-based expiration of entries, measured since last access or last write
  • keys automatically wrapped in WeakReference
  • values automatically wrapped in WeakReference or SoftReference soft
  • notification of evicted (or otherwise removed) entries
  • accumulation of cache access statistics

自动装载,基于时间过期,最少使用排除等,恰好符合最近项目中需要解决一个性能的小问题需求。

Guava提供两种类型缓存:LoadingCache&Cache。LoadingCache可以当entry不存在时加载entry,Cache不会自动加载entry。

private LoadingCache<String, Map> topic_cache_map = CacheBuilder.newBuilder()
        .maximumSize(1000)
        .expireAfterWrite(5, java.util.concurrent.TimeUnit.MINUTES)
        .build(
                new CacheLoader<String, Map>() {
                    public Map load(String key) throws Exception {
                        if("-1".equals(key)) {
                            return getLastTopic();
                        }else{
                            return getTopic(key);
                        }
                    }
                });

设置最大数量1000,五分钟过期时间。 直观的效果体现请参照下图
使用Guava Cache之前
使用前
使用Guava Cache之后
使用后

可以看出反馈时间长的请求数下降了非常的多,响应平均值提高了八倍左右,效果非常理想。
测试参数:10秒内并发1000用户,测试工具采用Gatling,请参照上一篇文章「性能测试神器

上周刚入了款新机械键盘 Filco Minila Air 蓝牙版,产地台湾。
在机械键盘里无线/蓝牙的非常少,也正是这点吸引了我。先上图

IMG\_0906.jpg
IMG\_0907.jpg
我很烦那些缠绕的线,以及庞大的体积,还有那些低劣的灯光/花哨的外表等。Minila Air是67键位,和MacBook键盘大小基本一样。
整体的键盘布局较为紧凑,比HHKB略微紧凑,买的青轴,欢快的打字声音还是比较扰民的,所以放在家里使用~
IMG\_0923.jpg
与HHKB的大小也几乎一致,但高度略高,没有手托的话感觉稍微有一点不舒服。份量也比HHKB稍重,底部防滑效果非常好,胜过HHKB,甚至感觉水平基本移动不了,需要拿起来移动。可惜的是没有无刻的版本,Filco在键盘界是公认的具有上乘质量和手感的,之前我最喜欢的是87键的圣手二代,大小/布局都非常好,但是只有线版本。
青轴的声音是「哒哒哒哒哒」,HHKB是电容键盘,声音是「的的的的的」,两者手感完全不一样。有同事认为HHKB的手感更好,我两者都比较喜欢~ 看个人喜好了。

有人说Minila Air的键位比HHKB好,其实布局基本一样(可以通过DPI和改建设置下达到一致),Minila的优点在于左侧多出Fn键,并且可以通过便捷的方式操作方向键,这也是HHKB的劣势之一。

总结
Filco Minila Air 与 HHKB Pro 2两者不相上下。操作性Minila Air略优,论装B,那还得是HHKB。当然后者的价格也近乎于前者的两倍,充分说明要装B是要付出代价的。
总之两者都是不会让你后悔的选择^_^

Gatling是一款开源的基于Scala开发的高性能服务器性能测试工具:下载地址

Gatling有两个主线版本,一个是最新版本1.5.4;一个是Gatling 2,最新版本是2.0.0-M3a。Gatling 2使用了JDK7进行编译,使用的Scala版本是2.10,它对Gatling的API进行了一些重构和重新设计,目前还处于开发阶段。

Gatling的目录结构:

  • bin目录下有2个脚本,gatling和recorder, gatling用来运行测试, recorder用来启动录制脚本的UI的(不推荐使用),
  • conf目录是关于Gatling自身的一些配置。
  • lib目录是Gatling自身依赖的库文件。
  • results目录用来存放测试报告的。
  • user-files目录是用来存放测试脚本的。

user-files下有basic/advanced目录中提供了几个性能测试脚本的示例。下面是一个我自己写的Gatling 2测试案例:

val httpProtocol = http
    .baseURL("http://zhourongyu.me")
    .acceptCharsetHeader("utf-8;q=0.7,*;q=0.7")
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4")
    .disableFollowRedirect
val header = Map(
    "Keep-Alive" -> "115",
    "Content-Type" -> "application/json; charset=UTF-8")

在这个类中定义了一个httpConf,定义了请求头的一些基本信息

val scn = scenario("home page")
            .exec( http("request_1")
                .get("/")
                .headers(header))
            .pause(4, 5)
            .exec( http("search ")
                .post("/search")
                  .param("access_token", "cZtWF314n9cdmY5HVLhspO")
                            .param("title","gatling")
                  .check(status.is(200)))

定义了一个测试场景,用户先访问Github首页,检查http返回状态码是否为200,然后暂停一段时间后再执行一个查询操作,查询关键字是test,检查http返回状态码是否为200

setUp(scn.inject(ramp(100 users) over (10 seconds)))
    .protocols(httpProtocol)

指定100个用户模拟该测试场景。100个用户以每秒10个递增,持续10秒。
注:
一个Gatling测试脚本就是一个scala的类,该类必须继承Simulation类。
Gatling提供了非常完善的DSL:API查询 || WIKI