一、NCache是什么#

缓存是服务器程序中经常用到的技术,使用缓存可以大大降低服务器的压力。目前常见的缓存工具都很好地解决了生命周期、存储、命中率等关键算法,但是绝大多数的缓存框架对于数据更新都是阻塞式的,即当缓存过期时会等待应用程序重新获取值。其性能曲线类似下图(假设刷新一次需要5ms):
阻塞式的缓存处理方式,每次的重新取值都会出现一次波峰,用户在使用系统的过程中将产生顿挫感。
NCache建立了一套抽象的非阻塞式缓存模型与API,应用NCache的缓存处理时效如下图所示:
使用NCache仅需在首次加载数据时停顿,此后的更新都将在后台线程完成。

二、特性一栏#

NCache特性一览:
  • 仅首次加载时阻塞,此后刷新都由后台完成
  • 开发者可自定义线程池,控制线程调度及溢出机制
  • 默认提供基于FIFO的内存存储,对象超出将被移除
  • 支持链式数据存储,开发者可附加其他存储方式,如Redis、Memcached、Ehcache

三、下载地址#

NCache是Strato Framework的一个子Bundle,随框架版本同步发布,最新下载地址为:
http://download.stratoio.com/ncache/4.1.2/

四、快速上手#

NCache使用非常简单,只需将jar包放入classpath,然后即可调用。下面是一个简单的示例:
        int cacheTTL=5*1000;//缓存有效期5秒钟
        NCache<String> ncache=NCache.newInstance();//ncache可复用
        ncache.setTimeToLive(cacheTTL);
        DataLoader<String> loader=new DataLoader<String>() {//loader可复用
            @Override
            public String load() throws Exception {
                int expense=new Random().nextInt(2000);//随机模拟取数据性能消耗
                String value="VALUE_"+expense;
                System.err.println("Reloading:"+value);
                Thread.sleep(expense);
                return value;
            }
        };
        for(int i=0;i<10000;i++){
            String value=ncache.get("somekey", loader);
            System.out.println("Get:"+value);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
程序运行结果截图:
上面的程序模拟了一个5秒的缓存,当失效时间到期时,缓存并不会立即释放,而是在后台启动刷新线程,在获得新数据前,仍然向应用程序提供旧的缓存值。

五、开发指南#

NCache的类结构如下图所示,

说明:

NCache
NCache主类,客户端通过该类的实例存取缓存。
DataLoader
数据加载接口,开发者须实现此接口完成实际数据的加载。
ThreadPool
线程池定义接口,开发者可重载此接口实现自定义的异步任务加载。
DataStoreChain
数据存储链,由一个DataStore列表组成,可借助DataStoreChain实现多级缓存。当存储缓存时,将遍历链条上的每一个DataStore,并调用其update方法,存储到每一个DataStore;当读取缓存时,将遍历链条上的每一个DataStore,返回第一个命中的结果
DataStore
数据存储接口,开发者可重载此接口实现自定义的数据存储,如db、redis、memcached等。

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
png
block.png 16.2 kB 1 27-Aug-2017 17:27 Jarez
png
classdiagram.png 58.2 kB 1 27-Aug-2017 18:17 Jarez
png
nonblock.png 11.7 kB 1 27-Aug-2017 17:27 Jarez
png
run1.png 46.5 kB 1 27-Aug-2017 17:38 Jarez
« This page (revision-20) was last changed on 27-Aug-2017 18:33 by Jarez