Howto ===== Basic Example: ============== Lets say you have 3 servers. Server 1 and server 2 have 3GB of space and server 3 has 2GB of space for cache. Here is how I would set up my client. import com.danga.MemCached.*; public class MyClass { // create a static client as most installs only need // a single instance protected static MemCachedClient mcc = new MemCachedClient(); // set up connection pool once at class load static { // server list and weights String[] servers = { "server1.mydomain.com:1624", "server2.mydomain.com:1624", "server3.mydomain.com:1624" }; Integer[] weights = { 3, 3, 2 }; // grab an instance of our connection pool SockIOPool pool = SockIOPool.getInstance(); // set the servers and the weights pool.setServers( servers ); pool.setWeights( weights ); // set some basic pool settings // 5 initial, 5 min, and 250 max conns // and set the max idle time for a conn // to 6 hours pool.setInitConn( 5 ); pool.setMinConn( 5 ); pool.setMaxConn( 250 ); pool.setMaxIdle( 1000 * 60 * 60 * 6 ); // set the sleep for the maint thread // it will wake up every x seconds and // maintain the pool size pool.setMaintSleep( 30 ); // set some TCP settings // disable nagle // set the read timeout to 3 secs // and don't set a connect timeout pool.setNagle( false ); pool.setSocketTO( 3000 ); pool.setSocketConnectTO( 0 ); // initialize the connection pool pool.initialize(); // lets set some compression on for the client // compress anything larger than 64k mcc.setCompressEnable( true ); mcc.setCompressThreshold( 64 * 1024 ); } // from here on down, you can call any of the client calls public static void examples() { mcc.set( "foo", "This is a test String" ); String bar = mcc.get( "foo" ); } } Multi-client Example: ===================== If you need to support multiple clients (i.e. Java, PHP, Perl, etc.) you need to make a few changes when you are setting things up: // use a compatible hashing algorithm pool.setHashingAlg( SockIOPool.NEW_COMPAT_HASH ); // store primitives as strings // the java client serializes primitives // // note: this will not help you when it comes to // storing non primitives mcc.setPrimitiveAsString( true ); // don't url encode keys // by default the java client url encodes keys // to sanitize them so they will always work on the server // however, other clients do not do this mcc.setSanitizeKeys( false ); Failover/Failback Notes: ======================== By default the java client will failover to a new server when a server dies. It will also failback to the original if it detects that the server comes back (it checks the server in a falling off pattern). If you want to disable this (useful if you have flapping servers), there are two settings to handle this. pool.setFailover( false ); pool.setFailback( false ); Serialization: ============== For java "native types", which include: Boolean Byte String Character StringBuffer StringBuilder Short Long Double Float Date Integer The client will by default *NOT* use java serialization, and instead will serialize using the primitive values to save space. You can override this by using the mcc.setPrimitiveAsString( true ), which will use the toString representation of the object. For other java objects, you need to make sure the class implements Serializable in order to be able to be stored in the cache. I would also reccomend that if possible, classes should instead implement Externalizable as opposed to Serializable. This allows the author of the class to define how objects of that class should serialize. In practice at Meetup.com, we saw a 60% reduction in the size of our serialized objects by doing this. This means less data to eat up cache space and less data to transfer over the network. Other: ====== See the java docs.