2017-03-21 3 views
0

J'utilisais un client aspymemcached pour me connecter à mon serveur membase. regard de code comme:serveur membase à la migration du serveur couchbase: client Java

public static MemcachedClient MemcachedClient(String bucketName){ 
     URI server1 = new URI("http://192.168.100.111:8091/pools"); 
     URI server2 = new URI("http://127.0.0.1:8091/pools"); 
     ArrayList<URI> serverList = new ArrayList<URI>(); 
     serverList.add(server1); 
     serverList.add(server2); 
     return new MemcachedClient(serverList, bucketName, ""); 
} 

Pour mettre l'objet dans le cache:

public static void makeMembaseCacheEntry(final String key, final int expiryTime, final Object value, final String bucketName) { 
    MemcachedClient client = getMembaseClient(bucketName); 
    if (client != null) { 
     client.set(key, expiryTime, value);  
} 

Pour objet d'obtenir du cache:

public static Object getMembaseCacheEntry(String key) { 
     Object value = null; 
     try { 
      MemcachedClient client = getMembaseClient(bucketName); 
      if (client != null) { 
       value = client.get(key); 
      } 
     } catch (Exception e) { 
     } 
     return value; 
} 

Maintenant, je l'intention de mettre à jour le serveur membase à Couchbase serveur, d'où Je dois utiliser l'API java couchbase client (Ref: http://docs.couchbase.com/developer/java-2.1/java-intro.html). En client cousebase toutes les opérations effectuées sur ref JsonObject:

http://docs.couchbase.com/developer/java-2.0/documents-basics.html

Alors, comment puis-je migrer au-dessus de deux méthodes pour Couchbase client

+0

attention, le dernier client java est 2.4 et documentation la plus récente est ici: https://developer.couchbase.com/documentation/server/4.6/sdk/java/start-using-sdk.html (vous avez lié 2 différentes versions des documents, à la fois obsolète) –

Répondre

1

si ce que vous stockez est un Object sérialisé, le SDK Java offre une Type SerializableDocument (voir https://developer.couchbase.com/documentation/server/4.6/sdk/java/document-operations.html#story-h2-10).

Il est compatible avec l'objet stocké par le client 1.x construit au-dessus de spymemcached, mais il utilise des métadonnées de drapeaux et je ne suis pas sûr de savoir comment migrer de Memcached vers Couchbase les influencerait (donc vous devrez écrire code de migration à un moment donné).

Par rapport à Spymemcached, le 2.x SDK Couchbase a une API qui est plus proche de l'organisation du cluster Couchbase: vous commencez à se connecter à un Cluster, sur lequel vous ouvrez un Bucket, sur lequel vous pouvez effectuer des opérations clé/valeur comme get, update, insert, upsert.

Dans votre premier extrait, vous aurez seulement besoin les adresses IP d'au moins un noeud Couchbase. De cela, vous obtiendrez un Cluster (en utilisant CouchbaseCluster.create(...)). Puis ouvrez le Bucket en utilisant cluster.openBucket(bucketName). Cela devrait être à peu près comme:

//TODO make both of these singletons 
Cluster cluster = CouchbaseCluster.create("192.168.100.111", "127.0.0.1:8091"); 
Bucket bucket = cluster.openBucket(bucketName, bucketPassword); 

Remarque Cluster et Bucket sont thread-safe et devrait être utilisé comme singletons plutôt que rouvertes sur chaque appel comme vous le faites dans makeMembaseCacheEntry et getMembaseCacheEntry ...

pour faire, vous aurez besoin d'envelopper votre value:

Document doc = SerializableDocument.create(key, expiry, value); 
bucket.upsert(doc); 

(utilisez upsert si vous voulez créer ou-remplacer, voir la documentation pour d'autres types d'opérations kv)

Pour obtenir, vous devrez indiquer le seau il désérialise un objet:

SerializableDocument doc = bucket.get(key, SerializableDocument.class); 
Object value = doc.content(); 
+0

J'ai essayé avec 'SerializableDocument' mais cela ne fonctionne pas car je stocke' Object' dans le serveur.vous pouvez voir la signature de méthode pour 'makeMembaseCacheEntry' et' Object' n'est pas 'Serializable'. ex: public static void makeMembaseCacheEntry (clé finale String, final int expiryTime, valeur finale de l'objet, final String binketName) 'il donne une erreur de compilation:' La méthode create (String, int, ByteBuf) dans le type BinaryDocument n'est pas applicable pour le arguments (String, int, Object) ' –

+0

vous n'avez pas un type de base plus concret qui soit' Serializable' que vous pourriez utiliser? En outre, l'erreur de compilation semble indiquer que vous avez utilisé 'BinaryDocument.create', pas' SerializableDocument' –

+0

vous n'avez pas un type de base plus concret qui est Serializable que vous pourriez utiliser? > Je peux restreindre la méthode au type 'Serializable' car mon utilisateur d'API voudra peut-être stocker n'importe quel type d'objet, c'est pourquoi j'ai mis le type' Object' dans mon argument. Cela fonctionne bien avec spymemcached java clinet –