无线开放 API

缓存服务简介

TAE缓存服务采用阿里云开放缓存服务(Open Cache Service,简称OCS),提供基于内存的缓存服务,支持海量小数据的高速访问。OCS可以极大缓解对后端存储的压力,提高网站或应用的响应速度。OCS支持Key-Value的数据结构,兼容Memcached协议的客户端都可与OCS通信。

缓存服务API

本节对缓存服务API的使用方式进行介绍。关于详细的API说明,请 参考Java Doc

引入服务包

获取缓存服务对象

    import com.alibaba.appengine.api.cache.CacheService;
import com.alibaba.appengine.api.cache.CacheServiceFactory;
CacheService cacheService = CacheServiceFactory.getCacheService(alias);

使用CacheServiceFactory的带参getCacheService (String alias)方法获取的cacheService。其中,在TAE控制台中通过:工作站->Cache->实例名称获取alias

在本地开发时,可以指定任意的alias或者使用无参的getCacheService方法均可以;不过为了统一起见,建议和线上环境的alias保持一致。

cacheService.put(key, value) 方法

    /**

  • 通过缓存key,关联被缓存的文本内容
  • 如果缓存key已经存在于缓存中,方法调动将会覆盖之前的关联的缓存内容
  • 相当于set(key,value,NEVER_EXPIRE)
  • @param key 缓存key,不能为空null
  • @param value 缓存内容,不能为空null
  • @return 如果关联的缓存成功的话,返回true,否则返回false
  • @throws CacheException 操作超时,或是Cache出错,比如连接失败
  • @throws NullPointerException 参数key或value为null / boolean put(String key, Serializable value);
    这个方法没有过期时间设置,默认为永不过期。

    cacheService.put(key, value, expire)方法

      /*
  • 通过缓存key,关联被缓存的文本内容
  • 如果缓存key已经存在于缓存中,方法调动将会覆盖之前的关联的缓存内容
  • @param key 缓存key,不能为空null
  • @param value 缓存内容,不能为空null
  • @param expire 过期时长,单位为秒。小于等于0的值,表示永不失效,推荐使用常量{@link #NEVER_EXPIRE}。
  • @return 如果关联的缓存成功的话,返回true,否则返回false
  • @throws CacheException 操作超时,或是Cache出错,比如连接失败
  • @throws NullPointerException 参数key或value为null / boolean put(String key, Serializable value, int expire);

    putIfUntouched方法

      /**
    
    如果没有原来的值没有被更新,则去更新,否则不做更新;即CAS操作。
  • @param key 缓存key,不能为空null
  • @param identifiableValue - 原来的CacheService.IdentifiableValue
  • @param newValue - 新值
  • @param expire - 过期时长,单位为秒。小于等于0的值,表示永不失效,推荐使用常量NEVER_EXPIRE。
  • @return 如果关联的缓存成功的话,返回true,否则返回false / CacheService.IdentifiableValue putIfUntouched(String key, Serializable value, Serializable newValue, int expire);

    cacheService.get(key)方法

      /*
    • 通过key,获取其关联缓存的内容
    • @param key 缓存key,不能为空null
    • @return 如果没有关联缓存,或缓存的内容已过期的话,返回为null
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null / Serializable get(String key);

      cacheService.getAll(key)方法

      /*
    • 一次get多个Key
    • @param key keys - Key集合
    • @return 包含找到的Key-Value对的Map
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数为null / Map getAll(String key);

      cacheService.getIdentifiable(key)方法

      /*
    • 和get(String)类似,返回的CacheService.IdentifiableValue对象给putIfUntouched(java.lang.String, com.alibaba.appengine.api.cache.CacheService.IdentifiableValue, java.io.Serializable, int)方法使用
    • @param key 缓存key,不能为空null
    • @return 返回CacheService.IdentifiableValue
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败 / CacheService.IdentifiableValue getIdentifiable(String key);

      cacheService.delete(key)方法

      /*
    • 删除缓存key关联的缓存内容
    • @param key 缓存key,不能为空null
    • @return 如果删除关联的缓存成功的话,返回true,否则返回false
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null / boolean delete(String key);

      cacheService.deleteAll(key)方法

      /*
    • 删除缓存key关联的缓存内容
    • @param keys 缓存key集合,不能为空null
    • @return 如果删除成功的key的集合
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null / Set deleteAll(String keys);

      increment方法

      /*
    • 递增Key的值
    • @param key 缓存key集合,不能为空null
    • @param delta 递增步长。可以是负数或正数
    • @return 返回递增之后的值
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null / Long increment(String key,long delta)

      increment方法

      /*
    • 递增Key的值
    • @param key 缓存key集合,不能为空null
    • @param delta 递增步长。可以是负数或正数
    • @param initialValue 如果Key不存在,则这个初始值。
    • @return 返回递增之后的值
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null / Long increment(String key,long delta,long initialValue)

      decrement方法

      /*
    • 递减Key的值
    • @param key 缓存key集合,不能为空null
    • @param delta 递减步长。可以是负数或正数
    • @return 返回递减之后的值。
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null / Long decrement(String key,long delta)

      decrement方法

      /*
    • 递减Key的值
    • @param key 缓存key集合,不能为空null
    • @param delta 递减步长。可以是负数或正数
    • @param initialValue 如果Key不存在,则这个初始值。
    • @return 返回递减之后的值
    • @throws CacheException 操作超时,或是Cache出错,比如连接失败
    • @throws NullPointerException 参数key为null */ Long decrement(String key,long delta,long initialValue)

      缓存服务使用示例

      本节将向读者展示如何通过TAE SDK开发并运行一个缓存服务应用。

      结果演示

      访问127.0.0.1:8080/CacheServiceDemo.do,将返回:

      &gt;&gt; Begin cache service test.</p>
      

      Save value FooKey to key cache-value.</p>
      

      Read value FooKey to key cache-value.</p>
      

      Cache service test ok!</p>
      

      Save value UserKey to key User{name='Shylock', sex=true, age=20, weight=150}.</p>
      

      cache put result:true</p>
      

      Read value UserKey to key User{name='Shylock', sex=true, age=20, weight=150}</p>
      

      准备工作

        <li>
            预留大约15分钟无干扰时间。</li>
        <li>
            安装配置TAE SDK,应用类型设置为前台(即app.apptype =0),开发语言设置为Java(即app.language =Java)<a href="http://jae.cloud.daily.taobao.net/support/article/183" target="_blank" title="安装配置TAE 本地SDK">参考链接</a></li>
        

      如何完成?

      读者可以选择从头开始工程搭建、开发和部署,或者略过这些步骤,选择直接下载源码、打包部署来完成本篇向导。
        <li>
            选择从头开始的读者,也请<a href="http://img01.taobaocdn.com/top/i1/TB1TzX7FVXXXXXJXVXXcvNbFXXX.zip" target="_blank" title="应用源码与war包">下载应用源码与war包</a>,以便参考,并跳到下一节——工程创建。</li>
        <li>
            选择直接部署的读者,请执行以下步骤:</li>
        
             2、将该tae-java-ocs-1.0.0.war文件拷贝到已在本地解压的容器webapps目录下,并重命名为ROOT.war。
             3、运行bin/startup.sh(bat)启动容器。
             4、容器启动成功后,可以根据结果演示一节进行验证。

      开发实战

      1、创建User类作为POJO数据模型,完整示例参见:tae-java-hello/src/main/java/tae/demo/model/User.java
      2、创建CacheServiceDemo Servlet使用缓存服务
      CacheService cacheService = CacheServiceFactory.getCacheService();

// Test String final String key = "FooKey"; final String value = "cache-value";

resp.getWriter().printf("Save value %s to key %s.\n", key, value); cacheService.put(key, value);

String get = (String) cacheService.get(key); resp.getWriter().printf("Read value %s to key %s.\n", key, get);

if (value.equals(get)) { resp.getWriter().println("Cache service test ok!"); } else { resp.getWriter().printf("Fail to get, expect %s, actual %s!\n", value, get); }

// Test Pojo final User user = new User(); user.setName("Shylock"); user.setSex(true); user.setAge((byte) 20); user.setWeight(150); final String cacheKey = "UserKey";

resp.getWriter().printf("Save value %s to key %s.\n", cacheKey, user); boolean success = cacheService.put(cacheKey, user); resp.getWriter().println("cache put result:" + success);

User cacheUser = (User) cacheService.get(cacheKey); resp.getWriter().printf("Read value %s to key %s.\n", cacheKey, cacheUser);

完整示例参见:tae-java-hello/src/main/java/tae/demo/services/CacheServiceDemo.java

3、在web.xml中添加以下配置:

    <servlet>
    <servlet-name>CacheServiceDemo</servlet-name>
    <servlet-class>tae.demo.services.CacheServiceDemo</servlet-class>
</servlet>

<servlet-mapping> <servlet-name>CacheServiceDemo</servlet-name> <url-pattern>/CacheServiceDemo.do</url-pattern> </servlet-mapping>

4、编译打包:

使用maven的开发在工程目录下执行下面的命令,编译打包:

mvn clean install

其他开发者,利用自己开发工具的打包功能,编译打包

5、将生成的war包拷贝到本地容器webapps目录,并重命名为ROOT.war。

6、执行bin/startup.bat(sh)。

7、访问127.0.0.1:8080/CacheServiceDemo.do,将返回:

>> Begin cache service test.

Save value FooKey to key cache-value.

Read value FooKey to key cache-value.

Cache service test ok!

Save value UserKey to key User{name='Shylock', sex=true, age=20, weight=150}.

cache put result:true

Read value UserKey to key User{name='Shylock', sex=true, age=20, weight=150}.