All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.infinispan.api.BasicCache Maven / Gradle / Ivy

There is a newer version: 15.1.3.Final
Show newest version
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2009 Red Hat Inc. and/or its affiliates and other
 * contributors as indicated by the @author tags. All rights reserved.
 * See the copyright.txt in the distribution for a full listing of
 * individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.infinispan.api;

import org.infinispan.lifecycle.Lifecycle;
import org.infinispan.util.concurrent.NotifyingFuture;

import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;

/**
 * BasicCache provides the common building block for the two different types of caches that Infinispan provides: 
 * embedded and remote. 
 * 

* For convenience, BasicCache extends {@link ConcurrentMap} and implements all methods accordingly, although methods like * {@link ConcurrentMap#keySet()}, {@link ConcurrentMap#values()} and {@link ConcurrentMap#entrySet()} are expensive * (prohibitively so when using a distributed cache) and frequent use of these methods is not recommended. *

* Other methods such as {@link #size()} provide an approximation-only, and should not be relied on for an accurate picture * as to the size of the entire, distributed cache. Remote nodes are not queried and in-fly transactions are not * taken into account, even if {@link #size()} is invoked from within such a transaction. *

* Also, like many {@link ConcurrentMap} implementations, BasicCache does not support the use of null keys or * values. *

*

Unsupported operations

*

{@link #containsValue(Object)}

*

Asynchronous operations

BasicCache also supports the use of "async" remote operations. Note that these methods * only really make sense if you are using a clustered cache. I.e., when used in LOCAL mode, these "async" operations * offer no benefit whatsoever. These methods, such as {@link #putAsync(Object, Object)} offer the best of both worlds * between a fully synchronous and a fully asynchronous cache in that a {@link NotifyingFuture} is returned. The * NotifyingFuture can then be ignored or thrown away for typical asynchronous behaviour, or queried for * synchronous behaviour, which would block until any remote calls complete. Note that all remote calls are, as far as * the transport is concerned, synchronous. This allows you the guarantees that remote calls succeed, while not * blocking your application thread unnecessarily. For example, usage such as the following could benefit from the * async operations: *
 *   NotifyingFuture f1 = cache.putAsync("key1", "value1");
 *   NotifyingFuture f2 = cache.putAsync("key2", "value2");
 *   NotifyingFuture f3 = cache.putAsync("key3", "value3");
 *   f1.get();
 *   f2.get();
 *   f3.get();
 * 
* The net result is behavior similar to synchronous RPC calls in that at the end, you have guarantees that all calls * completed successfully, but you have the added benefit that the three calls could happen in parallel. This is * especially advantageous if the cache uses distribution and the three keys map to different cache instances in the * cluster. *

* Also, the use of async operations when within a transaction return your local value only, as expected. A * NotifyingFuture is still returned though for API consistency. *

* Please see the Infinispan documentation and/or the 5 Minute Usage Tutorial for more details. *

* * @author [email protected] * @author Manik Surtani * @author Galder Zamarreño * @see org.infinispan.manager.CacheContainer * @see DefaultCacheManager * @see Infinispan documentation * @see 5 Minute Usage Tutorial * @since 4.0 */ public interface BasicCache extends ConcurrentMap, Lifecycle { /** * Retrieves the name of the cache * * @return the name of the cache */ String getName(); /** * Retrieves the version of Infinispan * * @return a version string */ String getVersion(); /** * {@inheritDoc} * * If the return value of this operation will be ignored by the application, * the user is strongly encouraged to use the {@link org.infinispan.context.Flag#IGNORE_RETURN_VALUES} * flag when invoking this method in order to make it behave as efficiently * as possible (i.e. avoiding needless remote or network calls). */ V put(K key, V value); /** * An overloaded form of {@link #put(Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param unit unit of measurement for the lifespan * @return the value being replaced, or null if nothing is being replaced. */ V put(K key, V value, long lifespan, TimeUnit unit); /** * An overloaded form of {@link #putIfAbsent(Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param unit unit of measurement for the lifespan * @return the value being replaced, or null if nothing is being replaced. */ V putIfAbsent(K key, V value, long lifespan, TimeUnit unit); /** * An overloaded form of {@link #putAll(Map)}, which takes in lifespan parameters. Note that the lifespan is applied * to all mappings in the map passed in. * * @param map map containing mappings to enter * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param unit unit of measurement for the lifespan */ void putAll(Map map, long lifespan, TimeUnit unit); /** * An overloaded form of {@link #replace(Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param unit unit of measurement for the lifespan * @return the value being replaced, or null if nothing is being replaced. */ V replace(K key, V value, long lifespan, TimeUnit unit); /** * An overloaded form of {@link #replace(Object, Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param oldValue value to replace * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param unit unit of measurement for the lifespan * @return true if the value was replaced, false otherwise */ boolean replace(K key, V oldValue, V value, long lifespan, TimeUnit unit); /** * An overloaded form of {@link #put(Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param lifespanUnit time unit for lifespan * @param maxIdleTime the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleTimeUnit time unit for max idle time * @return the value being replaced, or null if nothing is being replaced. */ V put(K key, V value, long lifespan, TimeUnit lifespanUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit); /** * An overloaded form of {@link #putIfAbsent(Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param lifespanUnit time unit for lifespan * @param maxIdleTime the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleTimeUnit time unit for max idle time * @return the value being replaced, or null if nothing is being replaced. */ V putIfAbsent(K key, V value, long lifespan, TimeUnit lifespanUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit); /** * An overloaded form of {@link #putAll(Map)}, which takes in lifespan parameters. Note that the lifespan is applied * to all mappings in the map passed in. * * @param map map containing mappings to enter * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param lifespanUnit time unit for lifespan * @param maxIdleTime the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleTimeUnit time unit for max idle time */ void putAll(Map map, long lifespan, TimeUnit lifespanUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit); /** * An overloaded form of {@link #replace(Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param lifespanUnit time unit for lifespan * @param maxIdleTime the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleTimeUnit time unit for max idle time * @return the value being replaced, or null if nothing is being replaced. */ V replace(K key, V value, long lifespan, TimeUnit lifespanUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit); /** * An overloaded form of {@link #replace(Object, Object, Object)}, which takes in lifespan parameters. * * @param key key to use * @param oldValue value to replace * @param value value to store * @param lifespan lifespan of the entry. Negative values are interpreted as unlimited lifespan. * @param lifespanUnit time unit for lifespan * @param maxIdleTime the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleTimeUnit time unit for max idle time * @return true if the value was replaced, false otherwise */ boolean replace(K key, V oldValue, V value, long lifespan, TimeUnit lifespanUnit, long maxIdleTime, TimeUnit maxIdleTimeUnit); /** * Asynchronous version of {@link #put(Object, Object)}. This method does not block on remote calls, even if your * cache mode is synchronous. Has no benefit over {@link #put(Object, Object)} if used in LOCAL mode. *

* * @param key key to use * @param value value to store * @return a future containing the old value replaced. */ NotifyingFuture putAsync(K key, V value); /** * Asynchronous version of {@link #put(Object, Object, long, TimeUnit)} . This method does not block on remote * calls, even if your cache mode is synchronous. Has no benefit over {@link #put(Object, Object, long, TimeUnit)} * if used in LOCAL mode. * * @param key key to use * @param value value to store * @param lifespan lifespan of entry * @param unit time unit for lifespan * @return a future containing the old value replaced */ NotifyingFuture putAsync(K key, V value, long lifespan, TimeUnit unit); /** * Asynchronous version of {@link #put(Object, Object, long, TimeUnit, long, TimeUnit)}. This method does not block * on remote calls, even if your cache mode is synchronous. Has no benefit over {@link #put(Object, Object, long, * TimeUnit, long, TimeUnit)} if used in LOCAL mode. * * @param key key to use * @param value value to store * @param lifespan lifespan of entry * @param lifespanUnit time unit for lifespan * @param maxIdle the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleUnit time unit for max idle time * @return a future containing the old value replaced */ NotifyingFuture putAsync(K key, V value, long lifespan, TimeUnit lifespanUnit, long maxIdle, TimeUnit maxIdleUnit); /** * Asynchronous version of {@link #putAll(Map)}. This method does not block on remote calls, even if your cache mode * is synchronous. Has no benefit over {@link #putAll(Map)} if used in LOCAL mode. * * @param data to store * @return a future containing a void return type */ NotifyingFuture putAllAsync(Map data); /** * Asynchronous version of {@link #putAll(Map, long, TimeUnit)}. This method does not block on remote calls, even if * your cache mode is synchronous. Has no benefit over {@link #putAll(Map, long, TimeUnit)} if used in LOCAL mode. * * @param data to store * @param lifespan lifespan of entry * @param unit time unit for lifespan * @return a future containing a void return type */ NotifyingFuture putAllAsync(Map data, long lifespan, TimeUnit unit); /** * Asynchronous version of {@link #putAll(Map, long, TimeUnit, long, TimeUnit)}. This method does not block on * remote calls, even if your cache mode is synchronous. Has no benefit over {@link #putAll(Map, long, TimeUnit, * long, TimeUnit)} if used in LOCAL mode. * * @param data to store * @param lifespan lifespan of entry * @param lifespanUnit time unit for lifespan * @param maxIdle the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleUnit time unit for max idle time * @return a future containing a void return type */ NotifyingFuture putAllAsync(Map data, long lifespan, TimeUnit lifespanUnit, long maxIdle, TimeUnit maxIdleUnit); /** * Asynchronous version of {@link #clear()}. This method does not block on remote calls, even if your cache mode is * synchronous. Has no benefit over {@link #clear()} if used in LOCAL mode. * * @return a future containing a void return type */ NotifyingFuture clearAsync(); /** * Asynchronous version of {@link #putIfAbsent(Object, Object)}. This method does not block on remote calls, even if * your cache mode is synchronous. Has no benefit over {@link #putIfAbsent(Object, Object)} if used in LOCAL mode. *

* * @param key key to use * @param value value to store * @return a future containing the old value replaced. */ NotifyingFuture putIfAbsentAsync(K key, V value); /** * Asynchronous version of {@link #putIfAbsent(Object, Object, long, TimeUnit)} . This method does not block on * remote calls, even if your cache mode is synchronous. Has no benefit over {@link #putIfAbsent(Object, Object, * long, TimeUnit)} if used in LOCAL mode. * * @param key key to use * @param value value to store * @param lifespan lifespan of entry * @param unit time unit for lifespan * @return a future containing the old value replaced */ NotifyingFuture putIfAbsentAsync(K key, V value, long lifespan, TimeUnit unit); /** * Asynchronous version of {@link #putIfAbsent(Object, Object, long, TimeUnit, long, TimeUnit)}. This method does * not block on remote calls, even if your cache mode is synchronous. Has no benefit over {@link * #putIfAbsent(Object, Object, long, TimeUnit, long, TimeUnit)} if used in LOCAL mode. * * @param key key to use * @param value value to store * @param lifespan lifespan of entry * @param lifespanUnit time unit for lifespan * @param maxIdle the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleUnit time unit for max idle time * @return a future containing the old value replaced */ NotifyingFuture putIfAbsentAsync(K key, V value, long lifespan, TimeUnit lifespanUnit, long maxIdle, TimeUnit maxIdleUnit); /** * {@inheritDoc} * * If the return value of this operation will be ignored by the application, * the user is strongly encouraged to use the {@link org.infinispan.context.Flag#IGNORE_RETURN_VALUES} * flag when invoking this method in order to make it behave as efficiently * as possible (i.e. avoiding needless remote or network calls). */ V remove(Object key); /** * Asynchronous version of {@link #remove(Object)}. This method does not block on remote calls, even if your cache * mode is synchronous. Has no benefit over {@link #remove(Object)} if used in LOCAL mode. * * @param key key to remove * @return a future containing the value removed */ NotifyingFuture removeAsync(Object key); /** * Asynchronous version of {@link #remove(Object, Object)}. This method does not block on remote calls, even if your * cache mode is synchronous. Has no benefit over {@link #remove(Object, Object)} if used in LOCAL mode. * * @param key key to remove * @param value value to match on * @return a future containing a boolean, indicating whether the entry was removed or not */ NotifyingFuture removeAsync(Object key, Object value); /** * Asynchronous version of {@link #replace(Object, Object)}. This method does not block on remote calls, even if * your cache mode is synchronous. Has no benefit over {@link #replace(Object, Object)} if used in LOCAL mode. * * @param key key to remove * @param value value to store * @return a future containing the previous value overwritten */ NotifyingFuture replaceAsync(K key, V value); /** * Asynchronous version of {@link #replace(Object, Object, long, TimeUnit)}. This method does not block on remote * calls, even if your cache mode is synchronous. Has no benefit over {@link #replace(Object, Object, long, * TimeUnit)} if used in LOCAL mode. * * @param key key to remove * @param value value to store * @param lifespan lifespan of entry * @param unit time unit for lifespan * @return a future containing the previous value overwritten */ NotifyingFuture replaceAsync(K key, V value, long lifespan, TimeUnit unit); /** * Asynchronous version of {@link #replace(Object, Object, long, TimeUnit, long, TimeUnit)}. This method does not * block on remote calls, even if your cache mode is synchronous. Has no benefit over {@link #replace(Object, * Object, long, TimeUnit, long, TimeUnit)} if used in LOCAL mode. * * @param key key to remove * @param value value to store * @param lifespan lifespan of entry * @param lifespanUnit time unit for lifespan * @param maxIdle the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleUnit time unit for max idle time * @return a future containing the previous value overwritten */ NotifyingFuture replaceAsync(K key, V value, long lifespan, TimeUnit lifespanUnit, long maxIdle, TimeUnit maxIdleUnit); /** * Asynchronous version of {@link #replace(Object, Object, Object)}. This method does not block on remote calls, * even if your cache mode is synchronous. Has no benefit over {@link #replace(Object, Object, Object)} if used in * LOCAL mode. * * @param key key to remove * @param oldValue value to overwrite * @param newValue value to store * @return a future containing a boolean, indicating whether the entry was replaced or not */ NotifyingFuture replaceAsync(K key, V oldValue, V newValue); /** * Asynchronous version of {@link #replace(Object, Object, Object, long, TimeUnit)}. This method does not block on * remote calls, even if your cache mode is synchronous. Has no benefit over {@link #replace(Object, Object, Object, * long, TimeUnit)} if used in LOCAL mode. * * @param key key to remove * @param oldValue value to overwrite * @param newValue value to store * @param lifespan lifespan of entry * @param unit time unit for lifespan * @return a future containing a boolean, indicating whether the entry was replaced or not */ NotifyingFuture replaceAsync(K key, V oldValue, V newValue, long lifespan, TimeUnit unit); /** * Asynchronous version of {@link #replace(Object, Object, Object, long, TimeUnit, long, TimeUnit)}. This method * does not block on remote calls, even if your cache mode is synchronous. Has no benefit over {@link * #replace(Object, Object, Object, long, TimeUnit, long, TimeUnit)} if used in LOCAL mode. * * @param key key to remove * @param oldValue value to overwrite * @param newValue value to store * @param lifespan lifespan of entry * @param lifespanUnit time unit for lifespan * @param maxIdle the maximum amount of time this key is allowed to be idle for before it is considered as * expired * @param maxIdleUnit time unit for max idle time * @return a future containing a boolean, indicating whether the entry was replaced or not */ NotifyingFuture replaceAsync(K key, V oldValue, V newValue, long lifespan, TimeUnit lifespanUnit, long maxIdle, TimeUnit maxIdleUnit); /** * Asynchronous version of {@link #get(Object)} that allows user code to * retrieve the value associated with a key at a later stage, hence allowing * multiple parallel get requests to be sent. Normally, when this method * detects that the value is likely to be retrieved from from a remote * entity, it will span a different thread in order to allow the * asynchronous get call to return immediately. If the call will definitely * resolve locally, for example when the cache is configured with LOCAL mode * and no cache loaders are configured, the get asynchronous call will act * sequentially and will have no different to {@link #get(Object)}. * * @param key key to retrieve * @return a future that can be used to retrieve value associated with the * key when this is available. The actual value returned by the future * follows the same rules as {@link #get(Object)} */ NotifyingFuture getAsync(K key); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy