Mis favoritos | Español | Acceder

Uso de JCache

El API Java de Memcache es compatible con la interfaz estándar de JCache (javax.cache). Con el uso de JCache, puedes establecer y obtener valores, controlar cómo los valores vencen en la memoria caché, inspeccionar el contenido de la memoria caché y obtener estadísticas sobre ella. También puedes utilizar "funciones de escucha" para añadir un comportamiento personalizado al establecer y borrar valores.

El estándar del API de JCache aún está en desarrollo. La implementación App Engine intenta implementar un subconjunto leal. Sin embargo, es posible que quieras considerar el uso del API de Memcache de nivel inferior para acceder a más funciones del servicio subyacente.

Para obtener más información sobre JCache, consulta JSR 107 y la especificación del API de JCache correspondiente.

Obtención de una instancia Cache

Puedes utilizar una implementación de la interfaz javax.cache.Cache para interactuar con la memoria caché. Puedes obtener una instancia Cache mediante una instancia CacheFactory, que se obtiene de un método estático en el CacheManager. El siguiente código obtiene una instancia Cache con la configuración predeterminada:

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

// ...
        Cache cache;

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

El método createCache() de CacheFactory adopta un asignación de propiedades de configuración. A continuación se tratan estas propiedades. Para aceptar los valores predeterminados, asigna al método una asignación vacía.

Establecimiento y obtención de valores

La instancia Cache se comporta como una asignación: puedes almacenar claves y valores a través del método put() y recuperar valores con el método get(). Puedes utilizar cualquier objeto serializable para la clave o el valor.

        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);

Para establecer varios valores, puedes ejecutar el método putAll() con una asignación como argumento.

Para eliminar un valor de la memoria caché (para expulsarlo de forma inmediata), ejecuta el método remove() con la clave como argumento. Para eliminar todos los valores de la memoria caché de la aplicación, ejecuta el método clear().

El método containsKey() toma una clave y devuelve un valor booleano boolean (true o false) para indicar si existe un valor con esa clave en la memoria caché. El método isEmpty() comprueba si la memoria caché está vacía. El método size() devuelve el número de valores actualmente en la memoria caché.

Configuración del vencimiento

De forma predeterminada, todos los valores permanecen en la memoria caché el mayor tiempo posible, hasta que se expulsan por presión de la memoria, se eliminan de forma explícita por la aplicación o dejan de estar disponibles por otra razón (como, por ejemplo, una interrupción del servicio). La aplicación puede especificar una fecha de vencimiento para los valores, es decir, una cantidad de tiempo máxima durante la que el valor estará disponible. El tiempo de vencimiento se puede establecer como una cantidad de tiempo relacionada con el momento en el que se estableció el valor o como una fecha y hora absolutas.

Puedes especificar la política de vencimiento a través de las propiedades de configuración al crear la instancia Cache. Todos los valores establecidos con esa instancia utilizan la misma política de vencimiento. Por ejemplo, para configurar una instancia Cache cuyos valores venzan una hora (3.600 segundos) después de haberse establecido:

import java.util.Map;
import javax.cache.Cache;
import javax.cache.CacheException;
import javax.cache.CacheFactory;
import com.google.appengine.api.memcache.GCacheFactory;

// ...
        Cache cache;

        Map props = new Map;
        props.put(GCacheFactory.EXPIRATION_DELTA, 3600);

        try {
            CacheFactory cacheFactory = CacheManager.getInstance().getCacheFactory();
            cache = cacheFactory.createCache(props);
        } catch (CacheException e) {
            // ...
        }

Las siguientes propiedades controlan el vencimiento de los valores:

  • GCacheFactory.EXPIRATION_DELTA: los valores vencen según la cantidad de tiempo dada en relación al momento en el que se establecieron, como un número entero de segundos.
  • GCacheFactory.EXPIRATION_DELTA_MILLIS: los valores vencen según la cantidad de tiempo dada en relación al momento en el que se establecieron, como un número entero de milisegundos.
  • GCacheFactory.EXPIRATION: los valores vencen en la fecha y hora especificadas, como un java.util.Date.

Configuración de la política establecida

De forma predeterminada, el establecimiento de un valor en la memoria caché añade el valor si no existe ningún valor con la clave especificada y sustituye un valor si existe uno con la clave especificada. Puedes configurar la memoria caché para que los valores sólo se añadan (protegiendo así los valores existentes) o para que se sustituyan (sin añadirlos).

import java.util.Map;
import com.google.appengine.api.memcache.MemcacheService;

// ...
        Map props = new Map;
        props.put(MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT, true);

Las siguientes propiedades controlan la política establecida:

  • MemcacheService.SetPolicy.SET_ALWAYS: añade el valor si no existe ningún valor con la clave o sustituye un valor existente si existe un valor con la clave (este es el valor predeterminado).
  • MemcacheService.SetPolicy.ADD_ONLY_IF_NOT_PRESENT: añade el valor si no existe ningún otro valor con la clave o no hace nada si la clave existe.
  • MemcacheService.SetPolicy.REPLACE_ONLY_IF_PRESENT: no hace nada si no existe ningún valor con la clave o sustituye un valor existente si existe un valor con la clave.

Estadísticas de la memoria caché

La aplicación puede recuperar estadísticas sobre su propio uso de la memoria caché. Estas estadísticas son útiles para controlar y ajustar el comportamiento de la memoria caché. Puedes acceder a las estadísticas a través de un objeto CacheStatistics, que puedes obtener si ejecutas el método getCacheStatistics() de Cache.

Las estadísticas disponibles incluyen el número de aciertos de caché (se obtiene para claves ya existentes), el número de errores de caché (se obtiene para claves no existentes previamente) y el número de valores de la memoria caché.

import javax.cache.CacheStatistics;

// ...
        CacheStatistics stats = cache.getCacheStatistics();
        int hits = stats.getCacheHits();
        int misses = stats.getCacheMisses();

La implementación de App Engine no admite el restablecimiento de los recuentos de aciertos y de errores. Los recuentos de aciertos y de errores se mantienen de forma indefinida, pero pueden volver a establecerse debido a estados transitorios de los servidores Memcache.

Funciones de JCache que no se admiten

El API de escucha de JCache es parcialmente compatible con funciones de escucha que pueden ejecutarse durante el procesamiento de una llamada al API de la aplicación como, por ejemplo, las funciones de escucha onRemove y onPut. No se admiten las funciones de escucha que requieren procesamiento de fondo como, por ejemplo, onEvict.

Una aplicación puede comprobar si la memoria caché contiene una clave dada (no se admite containsValue()).

Una aplicación no puede volcar el contenido de las claves o los valores de la memoria caché.

Una aplicación no puede volver a establecer las estadísticas de la memoria caché de forma manual.

No se admite la carga de la memoria caché asíncrona.

El método put() no devuelve el valor previo conocido de una clave. Siempre devuelve null.

Funciones del API de nivel inferior

El API de nivel inferior del servicio Memcache incluye métodos para aumentar y disminuir atómicamente valores enteros de recuentos.

El API de nivel inferior muestra más estadísticas de la memoria caché como, por ejemplo, la cantidad de tiempo desde que se accedió a la entrada que menos se ha utilizado recientemente y el tamaño total de todos los elementos de la memoria caché.

Para obtener más información sobre el API de nivel inferior, consulta el Javadoc de Memcache.