Memcached Java Client Tutorial using whalin and googlecode.xmemcached Libraries

This is continued tutorial on Memcached which is distributed memory object caching server. Here are previous two tutorials before you go over this one.

In this tutorial we will go over Memcached Java Client using below two approaches:

com.whalin.Memcached-Java-Client Library

<dependency>
        <groupId>com.whalin</groupId>
        <artifactId>Memcached-Java-Client</artifactId>
        <version>3.0.2</version>
</dependency>

com.googlecode.xmemcached Library

<dependency>
        <groupId>com.googlecode.xmemcached</groupId>
        <artifactId>xmemcached</artifactId>
        <version>2.4.5</version>
</dependency>

Just add these two maven dependencies to your project’s pom.xml file to get library in your Eclipse workspace.

Here is a complete CrunchifyComWhalinXMemcachedClient.java program with all details.

package crunchify.java.tutorials;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.whalin.MemCached.MemCachedClient;
import com.whalin.MemCached.SockIOPool;

import net.rubyeye.xmemcached.XMemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;

/**
 * @author Crunchify.com 
 * Version: 1.2.4 
 * Details: Use dependency com.whalin.Memcached-Java-Client and com.googlecode.xmemcached to retrieve, store Key Value pair
 *         from MemCached Server
 */

public class CrunchifyComWhalinXMemcachedClient {
        public static void main(String[] args) {

                log("===================================== Approach-1: Using SpyMemcahed: https://crunchify.com/memcached-java-client-net-spy-spymemcached/ ===================================== \n");

                log("===================================== Approach-2: Using com.whalin.Memcached-Java-Client =====================================\n");
                implementWhalinMemcachedJavaClient();

                log("===================================== Approach-3: Using com.googlecode.xmemcached Method =====================================\n");
                implementXMemCachedClient();

                log("===================================== Program Completed ===================================== \n");

        }

        // Approach-1: Using SpyMemcahed: https://crunchify.com/memcached-java-client-net-spy-spymemcached/

        // Approach-2: Using com.whalin.Memcached-Java-Client
        private static void implementWhalinMemcachedJavaClient() {
                String[] servers = { "localhost:11211" };

                // This class is a connection pool for maintaning a pool of persistent connections to memcached servers.
                // The pool must be initialized prior to use. This should typically be early on in the lifecycle of the JVM instance.
                SockIOPool crunchfiyPool = SockIOPool.getInstance("Crunchify");

                // Sets the minimum number of spare connections to maintain in our available pool.
                crunchfiyPool.setMinConn(2);

                // Sets the maximum number of spare connections allowed in our available pool.
                crunchfiyPool.setMaxConn(20);

                // Sets the list of all cache servers.
                crunchfiyPool.setServers(servers);

                // Sets the failover flag for the pool. If this flag is set to true, and a socket fails to connect, the pool will attempt to return a socket from
                // another server if one exists.
                // If set to false, then getting a socket will return null if it fails to connect to the requested server.
                crunchfiyPool.setFailover(true);

                // Sets the initial number of connections per server in the available pool.
                crunchfiyPool.setInitConn(30);

                // Set the sleep time between runs of the pool maintenance thread. If set to 0, then the maint thread will not be started.
                crunchfiyPool.setMaintSleep(90);

                // Sets the socket timeout for reads.
                crunchfiyPool.setSocketTO(2000);

                // Sets the aliveCheck flag for the pool. When true, this will attempt to talk to the server on every connection checkout to make sure the connection is
                // still valid.
                crunchfiyPool.setAliveCheck(true);

                crunchfiyPool.initialize();

                // Creates a new instance of MemCachedClient accepting a passed in pool name.
                MemCachedClient crunchifyWhalinClient = new MemCachedClient("Crunchify");

                // Adds data to the server; only the key and the value are specified.
                crunchifyWhalinClient.add("Java", "Crunchify.com");
                crunchifyWhalinClient.add("WordPress", "WordPress.com");
                crunchifyWhalinClient.add("Social", "Facebook.com");

                log("==> Total 3 Records added to MemCached using com.whalin.Memcached-Java-Client Method\n");

                // Retrieve a key from the server, using a specific hash. 
                // If the data was compressed or serialized when compressed, it will automatically be decompressed or serialized, as appropriate..
                log("Key: Java, Value: " + crunchifyWhalinClient.get("Java"));
                log("Key: WordPress, Value: " + crunchifyWhalinClient.get("WordPress"));
                log("Key: Social, Value: " + crunchifyWhalinClient.get("Social"));

                log("==> Total 3 Records Retrieved from MemCached using com.whalin.Memcached-Java-Client Method\n");

                // Deletes an object from cache given cache key.
                crunchifyWhalinClient.delete("Social");
                log("==> Record deleted using com.whalin.Memcached-Java-Client Method\n");

                log("Key: Social, Value: " + crunchifyWhalinClient.get("Social"));
                log("==> Failure to get record Social as we deleted that before\n");

        }

        // Approach-3: Using com.googlecode.xmemcached
        private static void implementXMemCachedClient() {
                String city = "New York";
                String city2 = "San Francisco";
                try {

                        // XMemcached constructor,default weight is 1
                        XMemcachedClient xMemCachedclient = new XMemcachedClient("localhost", 11211);

                        // Set a value
                        xMemCachedclient.set("Crunchify", 3600, city);
                        xMemCachedclient.set("Twitter", 3600, city2);

                        // Get a value for specify key
                        Object myCity = xMemCachedclient.get("Twitter");
                        log("=====> Key: Twitter, Value: " + xMemCachedclient.get("Twitter") + "\n");

                        // Get a value for specify key (set timeout of three seconds)
                        myCity = xMemCachedclient.get("Crunchify", 3000);
                        log("=====> Key: Crunchify, Value: " + xMemCachedclient.get("Crunchify", 3000) + "\n");

                        // Set a new expiration time for an existing item,using default opTimeout second.
                        xMemCachedclient.touch("key", 30);

                        xMemCachedclient.delete("Crunchify");
                        log("=====> Key: Crunchify, Value: " + xMemCachedclient.get("Crunchify") + "\n");

                        // delete value
                        xMemCachedclient.delete("key");

                        // let's catch all exceptions
                } catch (IOException e) {
                        e.printStackTrace();
                } catch (MemcachedException e) {
                        e.printStackTrace();
                } catch (TimeoutException e) {
                        e.printStackTrace();
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
        }

        // Simple log utility
        private static void log(Object object) {
                System.out.println(object);

        }

}

Make sure you have Memcached server up and running.

bash-3.2$ memcached -d -p 11211

Just run above command in Eclipse to see below result.

===================================== Approach-1: Using SpyMemcahed: https://crunchify.com/memcached-java-client-net-spy-spymemcached/ ===================================== 

===================================== Approach-2: Using com.whalin.Memcached-Java-Client =====================================

SLF4J: The requested version 1.7.16 by your slf4j binding is not compatible with [1.6]
SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details.
==> Total 3 Records added to MemCached using com.whalin.Memcached-Java-Client Method

Key: Java, Value: Crunchify.com
Key: WordPress, Value: WordPress.com
Key: Social, Value: Facebook.com
==> Total 3 Records Retrieved from MemCached using com.whalin.Memcached-Java-Client Method

18:27:35.433 [main] DEBUG com.whalin.MemCached.MemCachedClient - ++++ deletion of key: Social from cache was a success
==> Record deleted using com.whalin.Memcached-Java-Client Method

Key: Social, Value: null
==> Failure to get record Social as we deleted that before

===================================== Approach-3: Using com.googlecode.xmemcached Method =====================================

18:27:35.456 [main] INFO net.rubyeye.xmemcached.XMemcachedClient - XMemcachedClient is using Text protocol
18:27:35.491 [main] INFO com.google.code.yanf4j.nio.impl.SelectorManager - Creating 8 reactors...
18:27:35.496 [main] INFO com.google.code.yanf4j.core.impl.AbstractController - The Controller started at localhost/127.0.0.1:0 ...
18:27:35.509 [Xmemcached-Reactor-0] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - session started
18:27:35.510 [Xmemcached-Reactor-0] INFO com.google.code.yanf4j.core.impl.AbstractController - Add a session: 127.0.0.1:11211
18:27:35.513 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingset Crunchify 0 3600 8
New York

18:27:35.514 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:set Crunchify 0 3600 8
New York

18:27:35.514 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=34,capacity=34
]
18:27:35.515 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 8 bytes from channel
18:27:35.515 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingset Twitter 0 3600 13
San Francisco

18:27:35.515 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:set Twitter 0 3600 13
San Francisco

18:27:35.515 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=38,capacity=38
]
18:27:35.515 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 8 bytes from channel
18:27:35.516 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingget Twitter

18:27:35.517 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:get Twitter

18:27:35.517 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=13,capacity=13
]
18:27:35.518 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingget Twitter

18:27:35.518 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 40 bytes from channel
18:27:35.518 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:get Twitter

18:27:35.518 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=13,capacity=13
]
=====> Key: Twitter, Value: San Francisco

18:27:35.518 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 40 bytes from channel
18:27:35.519 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingget Crunchify

18:27:35.519 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:get Crunchify

18:27:35.519 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=15,capacity=15
]
18:27:35.519 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 36 bytes from channel
18:27:35.519 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingget Crunchify

18:27:35.519 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:get Crunchify

18:27:35.519 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=15,capacity=15
]
=====> Key: Crunchify, Value: New York

18:27:35.520 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 36 bytes from channel
18:27:35.520 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingtouch key 30

18:27:35.520 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:touch key 30

18:27:35.520 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=14,capacity=14
]
18:27:35.520 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 11 bytes from channel
18:27:35.520 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingdelete Crunchify

18:27:35.520 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:delete Crunchify

18:27:35.521 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=18,capacity=18
]
18:27:35.521 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 9 bytes from channel
18:27:35.521 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingget Crunchify

18:27:35.521 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:get Crunchify

18:27:35.521 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=15,capacity=15
]
=====> Key: Crunchify, Value: null

18:27:35.521 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 5 bytes from channel
18:27:35.521 [main] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - After encodingdelete key

18:27:35.521 [Xmemcached-Reactor-2] DEBUG net.rubyeye.xmemcached.impl.Optimizer - Optimieze merge buffer:delete key

18:27:35.521 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - send buffers:
[
 buffer:position=0,limit=12,capacity=12
]
===================================== Program Completed ===================================== 

18:27:35.522 [Xmemcached-Reactor-2] DEBUG com.google.code.yanf4j.core.impl.AbstractSession - read 11 bytes from channel

As you see in above result, it’s easy to retrieve and save value and it’s a fastest way to have central caching solution for your production Java application.

The post Memcached Java Client Tutorial using whalin.Memcached-Java-Client and googlecode.xmemcached Libraries appeared first on Crunchify.