Search code examples
javacouchbasespymemcachedmembasecouchbase-java-api

membase server to couchbase server migration : Java client


I was using aspymemcached client to connect to my membase server. code look like :

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, "");
}

For putting object in 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);       
}

For getting object from 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;
}

Now I planning to upgrade membase server to couchbase server, hence I have to use couchbase client java API (Ref : http://docs.couchbase.com/developer/java-2.1/java-intro.html). In cousebase client all operation performed on JsonObject ref :

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

So how can I migrate above two methods to couchbase client


Solution

  • if what you are storing is a serialized Object, the Java SDK offers a SerializableDocument type (see https://developer.couchbase.com/documentation/server/4.6/sdk/java/document-operations.html#story-h2-10).

    It is compatible with Object stored by the 1.x client built on top of spymemcached, but it uses flags metadata and I'm not sure how migrating from Memcached to Couchbase would influence these (so you might have to write some migrating code at some point).

    Compared to Spymemcached, the Couchbase SDK 2.x has an API that is closer to the Couchbase Cluster organization: you start connecting to a Cluster, on which you open a Bucket, on which you can perform key/value operations like get, update, insert, upsert.

    In your first snippet, you'll only need the IPs of at least one couchbase node. Out of that you'll get a Cluster (using CouchbaseCluster.create(...)). Then open the Bucket using cluster.openBucket(bucketName). That should be pretty much like:

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

    Note Cluster and Bucket are thread-safe and should be used as singletons rather than reopened on each call like you do in makeMembaseCacheEntry and getMembaseCacheEntry...

    For make you'll need to wrap your value:

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

    (use upsert if you want to create-or-replace, see the docs for other types of kv operations)

    For get, you'll need to tell the bucket it deserializes an Object:

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