Basic Cache Operations
Getting an Instance of a Cache
All operations on a cache are performed through an instance of IgniteCache
.
You can obtain IgniteCache
for an existing cache, or you can create a cache dynamically.
Ignite ignite = Ignition.ignite();
// Obtain an instance of the cache named "myCache".
// Note that different caches may have different generics.
IgniteCache<Integer, String> cache = ignite.cache("myCache");
IIgnite ignite = Ignition.Start();
// Obtain an instance of cache named "myCache".
// Note that generic arguments are only for your convenience.
// You can work with any cache in terms of any generic arguments.
// However, attempt to retrieve an entry of incompatible type
// will result in exception.
ICache<int, string> cache = ignite.GetCache<int, string>("myCache");
IgniteConfiguration cfg;
cfg.springCfgPath = "/path/to/configuration.xml";
Ignite ignite = Ignition::Start(cfg);
// Obtain instance of cache named "myCache".
// Note that different caches may have different generics.
Cache<int32_t, std::string> cache = ignite.GetCache<int32_t, std::string>("myCache");
Creating Caches Dynamically
You can also create a cache dynamically:
Ignite ignite = Ignition.ignite();
CacheConfiguration<Integer, String> cfg = new CacheConfiguration<>();
cfg.setName("myNewCache");
cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
// Create a cache with the given name if it does not exist.
IgniteCache<Integer, String> cache = ignite.getOrCreateCache(cfg);
Refer to the Cache Configuration section for the list of cache parameters.
IIgnite ignite = Ignition.Start();
// Create cache with given name, if it does not exist.
var cache = ignite.GetOrCreateCache<int, string>("myNewCache");
IgniteConfiguration cfg;
cfg.springCfgPath = "/path/to/configuration.xml";
Ignite ignite = Ignition::Start(cfg);
// Create a cache with the given name, if it does not exist.
Cache<int32_t, std::string> cache = ignite.GetOrCreateCache<int32_t, std::string>("myNewCache");
The methods that create a cache throw an org.apache.ignite.IgniteCheckedException
exception when called while the baseline topology is being changed.
javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException: Failed to start/stop cache, cluster state change is in progress.
at org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1323)
at org.apache.ignite.internal.IgniteKernal.createCache(IgniteKernal.java:3001)
at org.apache.ignite.internal.processors.platform.client.cache.ClientCacheCreateWithNameRequest.process(ClientCacheCreateWithNameRequest.java:48)
at org.apache.ignite.internal.processors.platform.client.ClientRequestHandler.handle(ClientRequestHandler.java:51)
at org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:173)
at org.apache.ignite.internal.processors.odbc.ClientListenerNioListener.onMessage(ClientListenerNioListener.java:47)
at org.apache.ignite.internal.util.nio.GridNioFilterChain$TailFilter.onMessageReceived(GridNioFilterChain.java:278)
at org.apache.ignite.internal.util.nio.GridNioFilterAdapter.proceedMessageReceived(GridNioFilterAdapter.java:108)
at org.apache.ignite.internal.util.nio.GridNioAsyncNotifyFilter$3.body(GridNioAsyncNotifyFilter.java:96)
at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:119)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:834)
You may want to retry the operation if you catch this exception.
Destroying Caches
To delete a cache from all cluster nodes, call the destroy()
method.
Ignite ignite = Ignition.ignite();
IgniteCache<Long, String> cache = ignite.cache("myCache");
cache.destroy();
This API is not presently available for C#/.NET.
This API is not presently available for C++.
Atomic Operations
Once you get the instance of a cache, you can start performing get/put operations on it.
IgniteCache<Integer, String> cache = ignite.cache("myCache");
// Store keys in the cache (the values will end up on different cache nodes).
for (int i = 0; i < 10; i++)
cache.put(i, Integer.toString(i));
for (int i = 0; i < 10; i++)
System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');
using (var ignite = Ignition.Start("examples/config/example-cache.xml"))
{
var cache = ignite.GetCache<int, string>("cache_name");
for (var i = 0; i < 10; i++)
{
cache.Put(i, i.ToString());
}
for (var i = 0; i < 10; i++)
{
Console.Write("Got [key=" + i + ", val=" + cache.Get(i) + ']');
}
}
IgniteConfiguration cfg;
cfg.springCfgPath = "/path/to/configuration.xml";
try
{
Ignite ignite = Ignition::Start(cfg);
Cache<int32_t, std::string> cache = ignite.GetOrCreateCache<int32_t, std::string>(CACHE_NAME);
// Store keys in the cache (the values will end up on different cache nodes).
for (int32_t i = 0; i < 10; i++)
{
cache.Put(i, std::to_string(i));
}
for (int i = 0; i < 10; i++)
{
std::cout << "Got [key=" << i << ", val=" + cache.Get(i) << "]" << std::endl;
}
}
catch (IgniteError& err)
{
std::cout << "An error occurred: " << err.GetText() << std::endl;
return err.GetCode();
}
Note
|
Bulk operations such as To update a collection of entries within a single operation, consider using transactions. |
Below are more examples of basic atomic operations:
// Put-if-absent which returns previous value.
String oldVal = cache.getAndPutIfAbsent(11, "Hello");
// Put-if-absent which returns boolean success flag.
boolean success = cache.putIfAbsent(22, "World");
// Replace-if-exists operation (opposite of getAndPutIfAbsent), returns previous
// value.
oldVal = cache.getAndReplace(11, "New value");
// Replace-if-exists operation (opposite of putIfAbsent), returns boolean
// success flag.
success = cache.replace(22, "Other new value");
// Replace-if-matches operation.
success = cache.replace(22, "Other new value", "Yet-another-new-value");
// Remove-if-matches operation.
success = cache.remove(11, "Hello");
using (var ignite = Ignition.Start("examples/config/example-cache.xml"))
{
var cache = ignite.GetCache<string, int>("cache_name");
// Put-if-absent which returns previous value.
var oldVal = cache.GetAndPutIfAbsent("Hello", 11);
// Put-if-absent which returns boolean success flag.
var success = cache.PutIfAbsent("World", 22);
// Replace-if-exists operation (opposite of getAndPutIfAbsent), returns previous value.
oldVal = cache.GetAndReplace("Hello", 11);
// Replace-if-exists operation (opposite of putIfAbsent), returns boolean success flag.
success = cache.Replace("World", 22);
// Replace-if-matches operation.
success = cache.Replace("World", 2, 22);
// Remove-if-matches operation.
success = cache.Remove("Hello", 1);
}
IgniteConfiguration cfg;
cfg.springCfgPath = "/path/to/configuration.xml";
Ignite ignite = Ignition::Start(cfg);
Cache<std::string, int32_t> cache = ignite.GetOrCreateCache<std::string, int32_t>("myNewCache");
// Put-if-absent which returns previous value.
int32_t oldVal = cache.GetAndPutIfAbsent("Hello", 11);
// Put-if-absent which returns boolean success flag.
boolean success = cache.PutIfAbsent("World", 22);
// Replace-if-exists operation (opposite of getAndPutIfAbsent), returns previous value.
oldVal = cache.GetAndReplace("Hello", 11);
// Replace-if-exists operation (opposite of putIfAbsent), returns boolean success flag.
success = cache.Replace("World", 22);
// Replace-if-matches operation.
success = cache.Replace("World", 2, 22);
// Remove-if-matches operation.
success = cache.Remove("Hello", 1);
Asynchronous Execution
Most of the cache operations have asynchronous counterparts that have the "Async" suffix in their names.
// a synchronous get
V get(K key);
// an asynchronous get
IgniteFuture<V> getAsync(K key);
// a synchronous get
TV Get(TK key);
// an asynchronous get
Task<TV> GetAsync(TK key);
// a synchronous get
V Get(K key);
// an asynchronous get
Future<V> GetAsync(K key);
The asynchronous operations return an object that represents the result of the operation. You can wait for the completion of the operation in either blocking or non-blocking manner.
To wait for the results in a non-blocking fashion, register a callback using the IgniteFuture.listen()
or IgniteFuture.chain()
method. The callback is called when the operation is completed.
IgniteCompute compute = ignite.compute();
// Execute a closure asynchronously.
IgniteFuture<String> fut = compute.callAsync(() -> "Hello World");
// Listen for completion and print out the result.
fut.listen(f -> System.out.println("Job result: " + f.get()));
class HelloworldFunc : IComputeFunc<string>
{
public string Invoke()
{
return "Hello World";
}
}
public static void AsynchronousExecution()
{
var ignite = Ignition.Start();
var compute = ignite.GetCompute();
//Execute a closure asynchronously
var fut = compute.CallAsync(new HelloworldFunc());
// Listen for completion and print out the result
fut.ContinueWith(Console.Write);
}
/*
* Function class.
*/
class HelloWorld : public compute::ComputeFunc<void>
{
friend struct ignite::binary::BinaryType<HelloWorld>;
public:
/*
* Default constructor.
*/
HelloWorld()
{
// No-op.
}
/**
* Callback.
*/
virtual void Call()
{
std::cout << "Job Result: Hello World" << std::endl;
}
};
/**
* Binary type structure. Defines a set of functions required for type to be serialized and deserialized.
*/
namespace ignite
{
namespace binary
{
template<>
struct BinaryType<HelloWorld>
{
static int32_t GetTypeId()
{
return GetBinaryStringHashCode("HelloWorld");
}
static void GetTypeName(std::string& dst)
{
dst = "HelloWorld";
}
static int32_t GetFieldId(const char* name)
{
return GetBinaryStringHashCode(name);
}
static int32_t GetHashCode(const HelloWorld& obj)
{
return 0;
}
static bool IsNull(const HelloWorld& obj)
{
return false;
}
static void GetNull(HelloWorld& dst)
{
dst = HelloWorld();
}
static void Write(BinaryWriter& writer, const HelloWorld& obj)
{
// No-op.
}
static void Read(BinaryReader& reader, HelloWorld& dst)
{
// No-op.
}
};
}
}
int main()
{
IgniteConfiguration cfg;
cfg.springCfgPath = "/path/to/configuration.xml";
Ignite ignite = Ignition::Start(cfg);
// Get binding instance.
IgniteBinding binding = ignite.GetBinding();
// Registering our class as a compute function.
binding.RegisterComputeFunc<HelloWorld>();
// Get compute instance.
compute::Compute compute = ignite.GetCompute();
// Declaring function instance.
HelloWorld helloWorld;
// Making asynchronous call.
compute.RunAsync(helloWorld);
}
Note
|
Callbacks Execution and Thread PoolsIf an asynchronous operation is completed by the time the callback is passed to either the Callbacks for asynchronous compute operations are invoked by threads from the Ignite public pool. Calling synchronous cache and compute operations from inside the callback may lead to a deadlock due to pools starvation. To achieve nested execution of asynchronous compute operations, you can take advantage of custom thread pools. Callbacks for asynchronous cache operations are invoked by using
|
Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are either registered trademarks or trademarks of The Apache Software Foundation.