net.spy.memcached
Class MemcachedClient

java.lang.Object
  extended by java.lang.Thread
      extended by net.spy.memcached.compat.SpyThread
          extended by net.spy.memcached.MemcachedClient
All Implemented Interfaces:
Runnable, MemcachedClientIF

public class MemcachedClient
extends SpyThread
implements MemcachedClientIF

Client to a memcached server.

Basic usage

        MemcachedClient c=new MemcachedClient(
                new InetSocketAddress("hostname", portNum));

        // Store a value (async) for one hour
        c.set("someKey", 3600, someObject);
        // Retrieve a value.
        Object myObject=c.get("someKey");
        

Advanced Usage

MemcachedClient may be processing a great deal of asynchronous messages or possibly dealing with an unreachable memcached, which may delay processing. If a memcached is disabled, for example, MemcachedConnection will continue to attempt to reconnect and replay pending operations until it comes back up. To prevent this from causing your application to hang, you can use one of the asynchronous mechanisms to time out a request and cancel the operation to the server.

      // Get a memcached client connected to several servers
      // over the binary protocol
      MemcachedClient c = new MemcachedClient(new BinaryConnectionFactory(),
              AddrUtil.getAddresses("server1:11211 server2:11211"));

      // Try to get a value, for up to 5 seconds, and cancel if it
      // doesn't return
      Object myObj = null;
      Future<Object> f = c.asyncGet("someKey");
      try {
          myObj = f.get(5, TimeUnit.SECONDS);
      // throws expecting InterruptedException, ExecutionException
      // or TimeoutException
      } catch (Exception e) {  /*  /
          // Since we don't need this, go ahead and cancel the operation.
          // This is not strictly necessary, but it'll save some work on
          // the server.  It is okay to cancel it if running.
          f.cancel(true);
          // Do other timeout related stuff
      }
 


Nested Class Summary
 
Nested classes/interfaces inherited from class java.lang.Thread
Thread.State, Thread.UncaughtExceptionHandler
 
Field Summary
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Fields inherited from interface net.spy.memcached.MemcachedClientIF
MAX_KEY_LENGTH
 
Constructor Summary
MemcachedClient(ConnectionFactory cf, List<InetSocketAddress> addrs)
          Get a memcache client over the specified memcached locations.
MemcachedClient(InetSocketAddress... ia)
          Get a memcache client operating on the specified memcached locations.
MemcachedClient(List<InetSocketAddress> addrs)
          Get a memcache client over the specified memcached locations.
 
Method Summary
 Future<Boolean> add(String key, int exp, Object o)
          Add an object to the cache (using the default transcoder) iff it does not exist already.
<T> Future<Boolean>
add(String key, int exp, T o, Transcoder<T> tc)
          Add an object to the cache iff it does not exist already.
 boolean addObserver(ConnectionObserver obs)
          Add a connection observer.
 Future<Boolean> append(long cas, String key, Object val)
          Append to an existing value in the cache.
<T> Future<Boolean>
append(long cas, String key, T val, Transcoder<T> tc)
          Append to an existing value in the cache.
<T> Future<CASResponse>
asyncCAS(String key, long casId, int exp, T value, Transcoder<T> tc)
          Asynchronous CAS operation.
 Future<CASResponse> asyncCAS(String key, long casId, Object value)
          Asynchronous CAS operation using the default transcoder.
<T> Future<CASResponse>
asyncCAS(String key, long casId, T value, Transcoder<T> tc)
          Asynchronous CAS operation.
 Future<Long> asyncDecr(String key, int by)
          Asynchronous decrement.
 Future<Object> asyncGet(String key)
          Get the given key asynchronously and decode with the default transcoder.
<T> Future<T>
asyncGet(String key, Transcoder<T> tc)
          Get the given key asynchronously.
 Future<Map<String,Object>> asyncGetBulk(Collection<String> keys)
          Asynchronously get a bunch of objects from the cache and decode them with the given transcoder.
<T> Future<Map<String,T>>
asyncGetBulk(Collection<String> keys, Transcoder<T> tc)
          Asynchronously get a bunch of objects from the cache.
 Future<Map<String,Object>> asyncGetBulk(String... keys)
          Varargs wrapper for asynchronous bulk gets with the default transcoder.
<T> Future<Map<String,T>>
asyncGetBulk(Transcoder<T> tc, String... keys)
          Varargs wrapper for asynchronous bulk gets.
 Future<CASValue<Object>> asyncGets(String key)
          Gets (with CAS support) the given key asynchronously and decode using the default transcoder.
<T> Future<CASValue<T>>
asyncGets(String key, Transcoder<T> tc)
          Gets (with CAS support) the given key asynchronously.
 Future<Long> asyncIncr(String key, int by)
          Asychronous increment.
<T> CASResponse
cas(String key, long casId, int exp, T value, Transcoder<T> tc)
          Perform a synchronous CAS operation.
 CASResponse cas(String key, long casId, Object value)
          Perform a synchronous CAS operation with the default transcoder.
<T> CASResponse
cas(String key, long casId, T value, Transcoder<T> tc)
          Perform a synchronous CAS operation.
 long decr(String key, int by)
          Decrement the given key by the given value.
 long decr(String key, int by, long def)
          Decrement the given counter, returning the new value.
 long decr(String key, int by, long def, int exp)
          Decrement the given counter, returning the new value.
 Future<Boolean> delete(String key)
          Delete the given key from the cache.
 Future<Boolean> delete(String key, int hold)
          Deprecated. Hold values are no longer honored.
 Future<Boolean> flush()
          Flush all caches from all servers immediately.
 Future<Boolean> flush(int delay)
          Flush all caches from all servers with a delay of application.
 Object get(String key)
          Get with a single key and decode using the default transcoder.
<T> T
get(String key, Transcoder<T> tc)
          Get with a single key.
 Collection<SocketAddress> getAvailableServers()
          Get the addresses of available servers.
 Map<String,Object> getBulk(Collection<String> keys)
          Get the values for multiple keys from the cache.
<T> Map<String,T>
getBulk(Collection<String> keys, Transcoder<T> tc)
          Get the values for multiple keys from the cache.
 Map<String,Object> getBulk(String... keys)
          Get the values for multiple keys from the cache.
<T> Map<String,T>
getBulk(Transcoder<T> tc, String... keys)
          Get the values for multiple keys from the cache.
 NodeLocator getNodeLocator()
          Get a read-only wrapper around the node locator wrapping this instance.
 CASValue<Object> gets(String key)
          Gets (with CAS support) with a single key using the default transcoder.
<T> CASValue<T>
gets(String key, Transcoder<T> tc)
          Gets (with CAS support) with a single key.
 Map<SocketAddress,Map<String,String>> getStats()
          Get all of the stats from all of the connections.
 Map<SocketAddress,Map<String,String>> getStats(String arg)
          Get a set of stats from all connections.
 Transcoder<Object> getTranscoder()
          Get the default transcoder that's in use.
 Collection<SocketAddress> getUnavailableServers()
          Get the addresses of unavailable servers.
 Map<SocketAddress,String> getVersions()
          Get the versions of all of the connected memcacheds.
 long incr(String key, int by)
          Increment the given key by the given amount.
 long incr(String key, int by, long def)
          Increment the given counter, returning the new value.
 long incr(String key, int by, long def, int exp)
          Increment the given counter, returning the new value.
 Future<Boolean> prepend(long cas, String key, Object val)
          Prepend to an existing value in the cache.
<T> Future<Boolean>
prepend(long cas, String key, T val, Transcoder<T> tc)
          Prepend to an existing value in the cache.
 boolean removeObserver(ConnectionObserver obs)
          Remove a connection observer.
 Future<Boolean> replace(String key, int exp, Object o)
          Replace an object with the given value (transcoded with the default transcoder) iff there is already a value for the given key.
<T> Future<Boolean>
replace(String key, int exp, T o, Transcoder<T> tc)
          Replace an object with the given value iff there is already a value for the given key.
 void run()
          Infinitely loop processing IO.
 Future<Boolean> set(String key, int exp, Object o)
          Set an object in the cache (using the default transcoder) regardless of any existing value.
<T> Future<Boolean>
set(String key, int exp, T o, Transcoder<T> tc)
          Set an object in the cache regardless of any existing value.
 void shutdown()
          Shut down immediately.
 boolean shutdown(long timeout, TimeUnit unit)
          Shut down this client gracefully.
 boolean waitForQueues(long timeout, TimeUnit unit)
          Wait for the queues to die down.
 
Methods inherited from class net.spy.memcached.compat.SpyThread
getLogger
 
Methods inherited from class java.lang.Thread
activeCount, checkAccess, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, stop, suspend, toString, yield
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

MemcachedClient

public MemcachedClient(InetSocketAddress... ia)
                throws IOException
Get a memcache client operating on the specified memcached locations.

Parameters:
ia - the memcached locations
Throws:
IOException - if connections cannot be established

MemcachedClient

public MemcachedClient(List<InetSocketAddress> addrs)
                throws IOException
Get a memcache client over the specified memcached locations.

Parameters:
addrs - the socket addrs
Throws:
IOException - if connections cannot be established

MemcachedClient

public MemcachedClient(ConnectionFactory cf,
                       List<InetSocketAddress> addrs)
                throws IOException
Get a memcache client over the specified memcached locations.

Parameters:
cf - the connection factory to configure connections for this client
addrs - the socket addresses
Throws:
IOException - if connections cannot be established
Method Detail

getAvailableServers

public Collection<SocketAddress> getAvailableServers()
Get the addresses of available servers.

This is based on a snapshot in time so shouldn't be considered completely accurate, but is a useful for getting a feel for what's working and what's not working.

Specified by:
getAvailableServers in interface MemcachedClientIF

getUnavailableServers

public Collection<SocketAddress> getUnavailableServers()
Get the addresses of unavailable servers.

This is based on a snapshot in time so shouldn't be considered completely accurate, but is a useful for getting a feel for what's working and what's not working.

Specified by:
getUnavailableServers in interface MemcachedClientIF

getNodeLocator

public NodeLocator getNodeLocator()
Get a read-only wrapper around the node locator wrapping this instance.

Specified by:
getNodeLocator in interface MemcachedClientIF

getTranscoder

public Transcoder<Object> getTranscoder()
Get the default transcoder that's in use.

Specified by:
getTranscoder in interface MemcachedClientIF

append

public Future<Boolean> append(long cas,
                              String key,
                              Object val)
Append to an existing value in the cache.

Specified by:
append in interface MemcachedClientIF
Parameters:
cas - cas identifier (ignored in the ascii protocol)
key - the key to whose value will be appended
val - the value to append
Returns:
a future indicating success
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

append

public <T> Future<Boolean> append(long cas,
                                  String key,
                                  T val,
                                  Transcoder<T> tc)
Append to an existing value in the cache.

Specified by:
append in interface MemcachedClientIF
Parameters:
cas - cas identifier (ignored in the ascii protocol)
key - the key to whose value will be appended
val - the value to append
tc - the transcoder to serialize and unserialize the value
Returns:
a future indicating success
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

prepend

public Future<Boolean> prepend(long cas,
                               String key,
                               Object val)
Prepend to an existing value in the cache.

Specified by:
prepend in interface MemcachedClientIF
Parameters:
cas - cas identifier (ignored in the ascii protocol)
key - the key to whose value will be prepended
val - the value to append
Returns:
a future indicating success
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

prepend

public <T> Future<Boolean> prepend(long cas,
                                   String key,
                                   T val,
                                   Transcoder<T> tc)
Prepend to an existing value in the cache.

Specified by:
prepend in interface MemcachedClientIF
Parameters:
cas - cas identifier (ignored in the ascii protocol)
key - the key to whose value will be prepended
val - the value to append
tc - the transcoder to serialize and unserialize the value
Returns:
a future indicating success
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncCAS

public <T> Future<CASResponse> asyncCAS(String key,
                                        long casId,
                                        T value,
                                        Transcoder<T> tc)
Asynchronous CAS operation.

Specified by:
asyncCAS in interface MemcachedClientIF
Parameters:
key - the key
casId - the CAS identifier (from a gets operation)
value - the new value
tc - the transcoder to serialize and unserialize the value
Returns:
a future that will indicate the status of the CAS
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncCAS

public <T> Future<CASResponse> asyncCAS(String key,
                                        long casId,
                                        int exp,
                                        T value,
                                        Transcoder<T> tc)
Asynchronous CAS operation.

Parameters:
key - the key
casId - the CAS identifier (from a gets operation)
exp - the expiration of this object
value - the new value
tc - the transcoder to serialize and unserialize the value
Returns:
a future that will indicate the status of the CAS
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncCAS

public Future<CASResponse> asyncCAS(String key,
                                    long casId,
                                    Object value)
Asynchronous CAS operation using the default transcoder.

Specified by:
asyncCAS in interface MemcachedClientIF
Parameters:
key - the key
casId - the CAS identifier (from a gets operation)
value - the new value
Returns:
a future that will indicate the status of the CAS
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

cas

public <T> CASResponse cas(String key,
                           long casId,
                           T value,
                           Transcoder<T> tc)
Perform a synchronous CAS operation.

Specified by:
cas in interface MemcachedClientIF
Parameters:
key - the key
casId - the CAS identifier (from a gets operation)
value - the new value
tc - the transcoder to serialize and unserialize the value
Returns:
a CASResponse
Throws:
OperationTimeoutException - if global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

cas

public <T> CASResponse cas(String key,
                           long casId,
                           int exp,
                           T value,
                           Transcoder<T> tc)
Perform a synchronous CAS operation.

Parameters:
key - the key
casId - the CAS identifier (from a gets operation)
exp - the expiration of this object
value - the new value
tc - the transcoder to serialize and unserialize the value
Returns:
a CASResponse
Throws:
OperationTimeoutException - if global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

cas

public CASResponse cas(String key,
                       long casId,
                       Object value)
Perform a synchronous CAS operation with the default transcoder.

Specified by:
cas in interface MemcachedClientIF
Parameters:
key - the key
casId - the CAS identifier (from a gets operation)
value - the new value
Returns:
a CASResponse
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

add

public <T> Future<Boolean> add(String key,
                               int exp,
                               T o,
                               Transcoder<T> tc)
Add an object to the cache iff it does not exist already.

The exp value is passed along to memcached exactly as given, and will be processed per the memcached protocol specification:

The actual value sent may either be Unix time (number of seconds since January 1, 1970, as a 32-bit value), or a number of seconds starting from current time. In the latter case, this number of seconds may not exceed 60*60*24*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Specified by:
add in interface MemcachedClientIF
Parameters:
key - the key under which this object should be added.
exp - the expiration of this object
o - the object to store
tc - the transcoder to serialize and unserialize the value
Returns:
a future representing the processing of this operation
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

add

public Future<Boolean> add(String key,
                           int exp,
                           Object o)
Add an object to the cache (using the default transcoder) iff it does not exist already.

The exp value is passed along to memcached exactly as given, and will be processed per the memcached protocol specification:

The actual value sent may either be Unix time (number of seconds since January 1, 1970, as a 32-bit value), or a number of seconds starting from current time. In the latter case, this number of seconds may not exceed 60*60*24*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Specified by:
add in interface MemcachedClientIF
Parameters:
key - the key under which this object should be added.
exp - the expiration of this object
o - the object to store
Returns:
a future representing the processing of this operation
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

set

public <T> Future<Boolean> set(String key,
                               int exp,
                               T o,
                               Transcoder<T> tc)
Set an object in the cache regardless of any existing value.

The exp value is passed along to memcached exactly as given, and will be processed per the memcached protocol specification:

The actual value sent may either be Unix time (number of seconds since January 1, 1970, as a 32-bit value), or a number of seconds starting from current time. In the latter case, this number of seconds may not exceed 60*60*24*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Specified by:
set in interface MemcachedClientIF
Parameters:
key - the key under which this object should be added.
exp - the expiration of this object
o - the object to store
tc - the transcoder to serialize and unserialize the value
Returns:
a future representing the processing of this operation
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

set

public Future<Boolean> set(String key,
                           int exp,
                           Object o)
Set an object in the cache (using the default transcoder) regardless of any existing value.

The exp value is passed along to memcached exactly as given, and will be processed per the memcached protocol specification:

The actual value sent may either be Unix time (number of seconds since January 1, 1970, as a 32-bit value), or a number of seconds starting from current time. In the latter case, this number of seconds may not exceed 60*60*24*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Specified by:
set in interface MemcachedClientIF
Parameters:
key - the key under which this object should be added.
exp - the expiration of this object
o - the object to store
Returns:
a future representing the processing of this operation
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

replace

public <T> Future<Boolean> replace(String key,
                                   int exp,
                                   T o,
                                   Transcoder<T> tc)
Replace an object with the given value iff there is already a value for the given key.

The exp value is passed along to memcached exactly as given, and will be processed per the memcached protocol specification:

The actual value sent may either be Unix time (number of seconds since January 1, 1970, as a 32-bit value), or a number of seconds starting from current time. In the latter case, this number of seconds may not exceed 60*60*24*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Specified by:
replace in interface MemcachedClientIF
Parameters:
key - the key under which this object should be added.
exp - the expiration of this object
o - the object to store
tc - the transcoder to serialize and unserialize the value
Returns:
a future representing the processing of this operation
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

replace

public Future<Boolean> replace(String key,
                               int exp,
                               Object o)
Replace an object with the given value (transcoded with the default transcoder) iff there is already a value for the given key.

The exp value is passed along to memcached exactly as given, and will be processed per the memcached protocol specification:

The actual value sent may either be Unix time (number of seconds since January 1, 1970, as a 32-bit value), or a number of seconds starting from current time. In the latter case, this number of seconds may not exceed 60*60*24*30 (number of seconds in 30 days); if the number sent by a client is larger than that, the server will consider it to be real Unix time value rather than an offset from current time.

Specified by:
replace in interface MemcachedClientIF
Parameters:
key - the key under which this object should be added.
exp - the expiration of this object
o - the object to store
Returns:
a future representing the processing of this operation
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGet

public <T> Future<T> asyncGet(String key,
                              Transcoder<T> tc)
Get the given key asynchronously.

Specified by:
asyncGet in interface MemcachedClientIF
Parameters:
key - the key to fetch
tc - the transcoder to serialize and unserialize value
Returns:
a future that will hold the return value of the fetch
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGet

public Future<Object> asyncGet(String key)
Get the given key asynchronously and decode with the default transcoder.

Specified by:
asyncGet in interface MemcachedClientIF
Parameters:
key - the key to fetch
Returns:
a future that will hold the return value of the fetch
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGets

public <T> Future<CASValue<T>> asyncGets(String key,
                                         Transcoder<T> tc)
Gets (with CAS support) the given key asynchronously.

Specified by:
asyncGets in interface MemcachedClientIF
Parameters:
key - the key to fetch
tc - the transcoder to serialize and unserialize value
Returns:
a future that will hold the return value of the fetch
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGets

public Future<CASValue<Object>> asyncGets(String key)
Gets (with CAS support) the given key asynchronously and decode using the default transcoder.

Specified by:
asyncGets in interface MemcachedClientIF
Parameters:
key - the key to fetch
Returns:
a future that will hold the return value of the fetch
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

gets

public <T> CASValue<T> gets(String key,
                            Transcoder<T> tc)
Gets (with CAS support) with a single key.

Specified by:
gets in interface MemcachedClientIF
Parameters:
key - the key to get
tc - the transcoder to serialize and unserialize value
Returns:
the result from the cache and CAS id (null if there is none)
Throws:
OperationTimeoutException - if global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

gets

public CASValue<Object> gets(String key)
Gets (with CAS support) with a single key using the default transcoder.

Specified by:
gets in interface MemcachedClientIF
Parameters:
key - the key to get
Returns:
the result from the cache and CAS id (null if there is none)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

get

public <T> T get(String key,
                 Transcoder<T> tc)
Get with a single key.

Specified by:
get in interface MemcachedClientIF
Parameters:
key - the key to get
tc - the transcoder to serialize and unserialize value
Returns:
the result from the cache (null if there is none)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

get

public Object get(String key)
Get with a single key and decode using the default transcoder.

Specified by:
get in interface MemcachedClientIF
Parameters:
key - the key to get
Returns:
the result from the cache (null if there is none)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGetBulk

public <T> Future<Map<String,T>> asyncGetBulk(Collection<String> keys,
                                              Transcoder<T> tc)
Asynchronously get a bunch of objects from the cache.

Specified by:
asyncGetBulk in interface MemcachedClientIF
Parameters:
keys - the keys to request
tc - the transcoder to serialize and unserialize value
Returns:
a Future result of that fetch
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGetBulk

public Future<Map<String,Object>> asyncGetBulk(Collection<String> keys)
Asynchronously get a bunch of objects from the cache and decode them with the given transcoder.

Specified by:
asyncGetBulk in interface MemcachedClientIF
Parameters:
keys - the keys to request
Returns:
a Future result of that fetch
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGetBulk

public <T> Future<Map<String,T>> asyncGetBulk(Transcoder<T> tc,
                                              String... keys)
Varargs wrapper for asynchronous bulk gets.

Specified by:
asyncGetBulk in interface MemcachedClientIF
Parameters:
tc - the transcoder to serialize and unserialize value
keys - one more more keys to get
Returns:
the future values of those keys
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncGetBulk

public Future<Map<String,Object>> asyncGetBulk(String... keys)
Varargs wrapper for asynchronous bulk gets with the default transcoder.

Specified by:
asyncGetBulk in interface MemcachedClientIF
Parameters:
keys - one more more keys to get
Returns:
the future values of those keys
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getBulk

public <T> Map<String,T> getBulk(Collection<String> keys,
                                 Transcoder<T> tc)
Get the values for multiple keys from the cache.

Specified by:
getBulk in interface MemcachedClientIF
Parameters:
keys - the keys
tc - the transcoder to serialize and unserialize value
Returns:
a map of the values (for each value that exists)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getBulk

public Map<String,Object> getBulk(Collection<String> keys)
Get the values for multiple keys from the cache.

Specified by:
getBulk in interface MemcachedClientIF
Parameters:
keys - the keys
Returns:
a map of the values (for each value that exists)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getBulk

public <T> Map<String,T> getBulk(Transcoder<T> tc,
                                 String... keys)
Get the values for multiple keys from the cache.

Specified by:
getBulk in interface MemcachedClientIF
Parameters:
tc - the transcoder to serialize and unserialize value
keys - the keys
Returns:
a map of the values (for each value that exists)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getBulk

public Map<String,Object> getBulk(String... keys)
Get the values for multiple keys from the cache.

Specified by:
getBulk in interface MemcachedClientIF
Parameters:
keys - the keys
Returns:
a map of the values (for each value that exists)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getVersions

public Map<SocketAddress,String> getVersions()
Get the versions of all of the connected memcacheds.

Specified by:
getVersions in interface MemcachedClientIF
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getStats

public Map<SocketAddress,Map<String,String>> getStats()
Get all of the stats from all of the connections.

Specified by:
getStats in interface MemcachedClientIF
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

getStats

public Map<SocketAddress,Map<String,String>> getStats(String arg)
Get a set of stats from all connections.

Specified by:
getStats in interface MemcachedClientIF
Parameters:
arg - which stats to get
Returns:
a Map of the server SocketAddress to a map of String stat keys to String stat values.
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

incr

public long incr(String key,
                 int by)
Increment the given key by the given amount.

Specified by:
incr in interface MemcachedClientIF
Parameters:
key - the key
by - the amount to increment
Returns:
the new value (-1 if the key doesn't exist)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

decr

public long decr(String key,
                 int by)
Decrement the given key by the given value.

Specified by:
decr in interface MemcachedClientIF
Parameters:
key - the key
by - the value
Returns:
the new value (-1 if the key doesn't exist)
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

incr

public long incr(String key,
                 int by,
                 long def,
                 int exp)
Increment the given counter, returning the new value.

Specified by:
incr in interface MemcachedClientIF
Parameters:
key - the key
by - the amount to increment
def - the default value (if the counter does not exist)
exp - the expiration of this object
Returns:
the new value, or -1 if we were unable to increment or add
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

decr

public long decr(String key,
                 int by,
                 long def,
                 int exp)
Decrement the given counter, returning the new value.

Specified by:
decr in interface MemcachedClientIF
Parameters:
key - the key
by - the amount to decrement
def - the default value (if the counter does not exist)
exp - the expiration of this object
Returns:
the new value, or -1 if we were unable to decrement or add
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncIncr

public Future<Long> asyncIncr(String key,
                              int by)
Asychronous increment.

Specified by:
asyncIncr in interface MemcachedClientIF
Returns:
a future with the incremented value, or -1 if the increment failed.
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

asyncDecr

public Future<Long> asyncDecr(String key,
                              int by)
Asynchronous decrement.

Specified by:
asyncDecr in interface MemcachedClientIF
Returns:
a future with the decremented value, or -1 if the increment failed.
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

incr

public long incr(String key,
                 int by,
                 long def)
Increment the given counter, returning the new value.

Specified by:
incr in interface MemcachedClientIF
Parameters:
key - the key
by - the amount to increment
def - the default value (if the counter does not exist)
Returns:
the new value, or -1 if we were unable to increment or add
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

decr

public long decr(String key,
                 int by,
                 long def)
Decrement the given counter, returning the new value.

Specified by:
decr in interface MemcachedClientIF
Parameters:
key - the key
by - the amount to decrement
def - the default value (if the counter does not exist)
Returns:
the new value, or -1 if we were unable to decrement or add
Throws:
OperationTimeoutException - if the global operation timeout is exceeded
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

delete

@Deprecated
public Future<Boolean> delete(String key,
                                         int hold)
Deprecated. Hold values are no longer honored.

Delete the given key from the cache.

The hold argument specifies the amount of time in seconds (or Unix time until which) the client wishes the server to refuse "add" and "replace" commands with this key. For this amount of item, the item is put into a delete queue, which means that it won't possible to retrieve it by the "get" command, but "add" and "replace" command with this key will also fail (the "set" command will succeed, however). After the time passes, the item is finally deleted from server memory.

Parameters:
key - the key to delete
hold - how long the key should be unavailable to add commands

delete

public Future<Boolean> delete(String key)
Delete the given key from the cache.

Specified by:
delete in interface MemcachedClientIF
Parameters:
key - the key to delete
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

flush

public Future<Boolean> flush(int delay)
Flush all caches from all servers with a delay of application.

Specified by:
flush in interface MemcachedClientIF
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

flush

public Future<Boolean> flush()
Flush all caches from all servers immediately.

Specified by:
flush in interface MemcachedClientIF
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

run

public void run()
Infinitely loop processing IO.

Specified by:
run in interface Runnable
Overrides:
run in class Thread

shutdown

public void shutdown()
Shut down immediately.

Specified by:
shutdown in interface MemcachedClientIF

shutdown

public boolean shutdown(long timeout,
                        TimeUnit unit)
Shut down this client gracefully.

Specified by:
shutdown in interface MemcachedClientIF

waitForQueues

public boolean waitForQueues(long timeout,
                             TimeUnit unit)
Wait for the queues to die down.

Specified by:
waitForQueues in interface MemcachedClientIF
Throws:
IllegalStateException - in the rare circumstance where queue is too full to accept any more requests

addObserver

public boolean addObserver(ConnectionObserver obs)
Add a connection observer.

Specified by:
addObserver in interface MemcachedClientIF
Returns:
true if the observer was added.

removeObserver

public boolean removeObserver(ConnectionObserver obs)
Remove a connection observer.

Specified by:
removeObserver in interface MemcachedClientIF
Returns:
true if the observer existed, but no longer does