1

La réponse à cette question semble évidente, mais je dois être complètement sûr. Donc, si la réponse peut fournir une référence faisant autorité avec des énoncés clairs et non ambigus, ce serait formidable.MemcacheService est fondamentalement un singleton

Dire que j'ai les deux méthodes suivantes

public CollectionResponse<Dog> getDogs(Identification request){ 
    MemcacheService syncCacheDog = MemcacheServiceFactory.getMemcacheService(); 
    syncCacheDog.setErrorHandler(ErrorHandlers.getConsistentLogAndContinue(Level.INFO)); 
    // ........ 
    value = (byte[]) syncCacheDog.get(key); // read from cache 
    if (value == null) { 
     // get value from other source 
     // ........ 

     syncCacheDog.put(key, value); // populate cache 
    } 
    // ........ 
} 

public CollectionResponse<Cat> getCats(Identification request){ 
    MemcacheService syncCacheCat = MemcacheServiceFactory.getMemcacheService(); 
    syncCacheCat.setErrorHandler(ErrorHandlers.getConsistentLogAndContinue(Level.INFO)); 
    // ........ 
    value = (byte[]) syncCacheCat.get(key); // read from cache 
    if (value == null) { 
     // get value from other source 
     // ........ 

     syncCacheCat.put(key, value); // populate cache 
    } 
    // ........ 
} 

sont-syncCacheDog et syncCacheCat pointant vers la même carte? Ou si je veux qu'ils pointer sur la même carte, dois-je créer

static MemcacheService syncCache = MemcacheServiceFactory.getMemcacheService(); 

puis utilisez syncCache dans les deux méthodes? En revanche, si c'est un singleton, comment puis-je maintenir deux caches différents? C'est à dire. quelqu'un peut-il s'il vous plaît copier et coller une de mes méthodes et le montrer écrit avec un espace de noms et au lieu de traiter avec un octet générique pour traiter un objet spécifique comme le chien?

Répondre

1

Oui, d'après mon expérience avec GAE et sa documentation, le service Memcache est un singleton. Plus encore, différentes versions de l'application voient toutes le même cache.

Afin de maintenir différentes caches faites comme d'habitude: utilisez un préfixe. Maintenir un ensemble unique de préfixes pour différentes classes devrait être relativement facile - avoir une énumération quelque part, en gardant une trace du préfixe maximum. Et ne réutilisez jamais les anciens numéros de préfixe.

public enum MemcachePrefix { 
    DOGS(1), 
    CATS(2); 
    // Max: 2. 
    public final int value; 
    private MemcachePrefix (int value) {this.value = value;} 
}; 

public class Dog { 
    static final MemcachePrefix MEMCACHE_PREFIX = MemcachePrefix.DOGS; 
}; 

class Main { 
    public static void main (String[] args) { 
    Dog dog = new Dog(); 
    System.out.println (dog.MEMCACHE_PREFIX); 
    } 
} 

Il existe également Namespaces. Au lieu d'ajouter manuellement le préfixe à la clé de cache, vous pouvez l'utiliser comme un espace de noms, en laissant GAE faire les manipulations de clé pour vous.

Questions connexes