My favorites | 中文(简体) | Sign in

Memcache Java API 概述

对于某些任务,高性能的可扩展网络应用程序通常在稳定持久存储之前使用分布式内存数据缓存,或用分布式内存数据缓存来代替稳定持久存储。App Engine 提供了此用途的内存缓存服务。

使用 JCache 缓存数据

Memcache Java API 实现 JCache 接口 (javax.cache),这是由 JSR 107 描述的标准草案。JCache 提供一个类似于地图的接口来缓存数据。您可以使用键在缓存中存储和检索值。键和值可以是任何 Serializable 类型或类。

import java.util.Collections;
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheManager;

// ...
        Cache cache;

        try {
            cache = CacheManager.getInstance().getCacheFactory().createCache(Collections.emptyMap());
        } catch (CacheException e) {
            // ...
        }

        String key;      // ...
        byte[] value;    // ...

        // Put the value into the cache.
        cache.put(key, value);

        // Get the value from the cache.
        value = (byte[]) cache.get(key);

何时使用内存缓存

内存缓存的用途之一是加快常用数据存储区查询的速度。如果许多请求进行具有相同参数的相同查询,并且对结果所做的更改不需要立即显示在网站上,则应用程序可以将结果缓存在 Memcache 中。后续请求可以检查 Memcache,只有在结果不存在或过期的情况下才执行数据存储区查询。会话数据、用户首选项以及在站点的大多数页面上执行的任何其他查询都是不错的缓存候选项。

Memcache 对其他临时值可能有用。但是,如果考虑是否只在 Memcache 中存储值且不受其他持久存储支持,请确保当值突然不可用时应用程序的行为正常。Memcache 中的值随时可能过期,并且可能在为该值所设置的过期时间之前过期。例如,如果用户会话数据突然丢失会导致会话故障,则除了 Memcache 以外,该数据可能还应该存储在数据存储区中。

缓存的数据如何过期

默认情况下,存储在 Memcache 中的值会保留尽可能长的时间。如果内存的缓存较低,则向缓存添加新值时,可能会从缓存中清除某些值。当因为内存压力而清除某些值时,首先清除的是最近最少使用的值。

应用程序在存储一个值时将提供一个过期时间,要么是相对于该值添加时间的秒数,要么是未来某个绝对 Unix 时间戳(1970 年 1 月 1 日午夜算起的秒数)。该值将在此时间之前被清除,虽然它可能会因为其他原因而提前清除。

在极少数情况下,值也可能因为内存压力以外的原因在过期之前从缓存中消失。虽然 Memcache 能够适应服务器故障,但是 Memcache 值没有保存到磁盘上,所以服务故障可能会导致值不可用。

总而言之,应用程序不能指望缓存的值始终可用。

配额和限制

每个 Memcache 调用都会计算在 Memcache API 调用配额内。

应用程序发送到 Memcache 的数据会计算在发送到 (Memcache) API 的数据配额内。从 Memcache 接收的数据会计算在从 (Memcache) API 接收的数据配额内。

有关配额的详细信息,请参阅配额,以及管理控制台的“配额详细信息”部分。

除了配额以外,使用邮件服务还需遵循以下限制:

限制
缓存值的最大大小 1 兆字节