AWS 插件扩展开发参考指南

缓存索引示例

AWS的Cache本质上是基于键/值的ConcurrentHashMap,通过哈希快速命中缓存对象(值)。如果你需要遍历缓存并从值对象的某个属性中匹配查询,AWS Cache还提供一种更高效的索引模式。

  • 缓存唯一索引
  • 缓存多值索引

在某种查询频繁且遍历的数据量较大时,建立缓存索引能明显改善性能,同时AWS Cache也会为维护索引增加一定的开销。因此,为缓存建立索引应保持适度、合理的原则。

AWS Cache自动维护索引的主要开销

  • put/remove等发生结构变化时,同步维护Index结构
  • 每个Index会增加一份链表结构,但不会增加值副本

源码见扩展插件概念验证应用

缓存唯一索引

继承SingleValueIndex父类,要求这类查询的业务key值必须不能重复。

com.actionsoft.apps.poc.plugin.cache.BookIndex1

package com.actionsoft.apps.poc.plugin.cache;

import com.actionsoft.bpms.commons.cache.SingleValueIndex;

/**
 * 索引示例。为“书名”字段建立缓存唯一索引。要求“书名”字段值不能有重复的
 */
public class BookIndex1 extends SingleValueIndex<String, BookModel> {

    /**
     * 返回该索引的键值
     */
    public String key(BookModel model) {
        return model.getName();
    }

}

缓存多值索引

继承ListValueIndex父类。

com.actionsoft.apps.poc.plugin.cache.BookIndex2

package com.actionsoft.apps.poc.plugin.cache;

import com.actionsoft.bpms.commons.cache.ListValueIndex;

/**
 * 索引示例。为“出版年份”字段建立缓存多值索引,快速索引到某年份的书
 */
public class BookIndex2 extends ListValueIndex<String, BookModel> {

    /**
     * 返回该索引的键值
     */
    public String key(BookModel model) {
        return Integer.toString(model.getYear());
    }

}

BookCache

com.actionsoft.apps.poc.plugin.cache.BookCache


public class BookCache extends Cache<String, BookModel> {

    public BookCache(CachePluginProfile profile) {
        super(profile);
        // 注册索引,为“书名”字段建立缓存唯一索引。要求“书名”字段值不能有重复的
        registeIndex(BookIndex1.class, new BookIndex1());
        // 注册索引,为“出版年份”字段建立缓存多值索引,快速索引到某年份的书
        registeIndex(BookIndex2.class, new BookIndex2());
    }

    /**
     * 让Cache使用者直接访问到内部封装的操作,如put/remove
     *
     * @return
     */
    public static BookCache getCache() {
        return CacheManager.getCache(BookCache.class);
    }

    /**
     * 索引示例。从“书名”获得缓存对象
     *
     * @param name 书名
     * @return
     */
    public static BookModel getByName(String name) {
        return getCache().getByIndexSingle(BookIndex1.class, name);
    }

    /**
     * 索引示例。从“出版年份”获得多个缓存对象
     *
     * @param year
     * @return
     */
    public static Iterator<BookModel> listByYear(int year) {
        return getCache().getByIndex(BookIndex2.class, Integer.toString(year));
    }

    ...

验证

进入AWS CONSOLE > 应用管理并打开你的应用,在部署中点击CacheSample,在弹出的对话框中点击索引示例按钮,你会看到页面返回如下类似信息

对话框部分的代码示例

com.actionsoft.apps.poc.plugin.web.SampleWeb#getCacheSampleHome2

public String getCacheSampleHome2() {
    StringBuilder data = new StringBuilder();
    data.append("<b>BookCache ==> BookIndex1/BookIndex2</b><hr>\n");
    data.append("<b>BookCache.getByName(\"你总会路过这个世界的美好\")</b><br/>" + BookCache.getByName("你总会路过这个世界的美好").toJson()).append("<br/>");
    Iterator<BookModel> iterator = BookCache.listByYear(2014);
    data.append("<b>BookCache.getByYear(2014)</b><br/>");
    while (iterator.hasNext()) {
        BookModel bookModel = iterator.next();
        data.append(bookModel.toJson()).append("<br/>");
    }
    Map<String, Object> macroLibraries = new LinkedHashMap<String, Object>();
    macroLibraries.put("data", data.toString());
    macroLibraries.put("sid", getContext().getSessionId());
    return HtmlPageTemplate.merge("com.actionsoft.apps.poc.plugin", "cache-sample-dialog.htm", macroLibraries);
}


Seven
 010-62962343-690
 liujx@actionsoft.com.cn
感谢您对该文档的关注!如果您对当前页面内容有疑问或好的建议,请与我联系。如果您需要解答相关技术问题请登录AWS客户成功社区