@Override
  public OperationFuture<Boolean> replace(String key, int exp, Object o) {
    return asyncStore(StoreType.replace, key, exp, o, transcoder);
  }
Replace an object with the given value (transcoded with the default
transcoder) iff there is already a value for the given key.

<p>
The {@code exp} value is passed along to memcached exactly as given,
and will be processed per the memcached protocol specification:
</p>

<p>
Note that the return will be false any time a mutation has not occurred.
</p>

<blockquote>
<p>
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.
</p>
</blockquote>

@param key the key under which this object should be added.
@param exp the expiration of this object
@param o the object to store
@return a future representing the processing of this operation
@throws IllegalStateException in the rare circumstance where queue is too
          full to accept any more requests
src/main/java/net/spy/memcached/MemcachedClient.java