In this tutorial, we will explore how to iterate over an Infinispan cache. We’ll cover the necessary steps to set up a cache manager, create a replicated synchronous cache, store data, and iterate over the cache entries.
Prerequisites
Before getting started, ensure that you have the following prerequisites:
- JDK (Java Development Kit) installed on your machine.
- Infinispan library added to your project dependencies.
Iterating over an Infinispan Replicated Cache
The following example shows how to add some random keys/values in a replicated cache and then Iterate over the Cache:
import org.infinispan.Cache; import org.infinispan.commons.api.CacheContainerAdmin; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.Configuration; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.configuration.global.GlobalConfigurationBuilder; import org.infinispan.context.Flag; import org.infinispan.manager.DefaultCacheManager; import java.util.UUID; public class InfinispanReplicated { public static void main(String[] args) throws Exception { GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder(); DefaultCacheManager cacheManager = new DefaultCacheManager(global.build()); // Create a replicated synchronous configuration ConfigurationBuilder builder = new ConfigurationBuilder(); builder.clustering().cacheMode(CacheMode.REPL_SYNC); Configuration cacheConfig = builder.build(); // Create a cache Cache<String, String> cache = cacheManager.administration() .withFlags(CacheContainerAdmin.AdminFlag.VOLATILE) .getOrCreateCache("cache", cacheConfig); // Store the current node address in some random keys for(int i=0; i < 10; i++) { cache.put(UUID.randomUUID().toString(), cacheManager.getNodeAddress()); } // Display the current cache contents for the whole cluster cache.entrySet().forEach(entry -> System.out.printf("%s = %s\n", entry.getKey(), entry.getValue())); // Display the current cache contents for this node cache.getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP) .entrySet().forEach(entry -> System.out.printf("%s = %s\n", entry.getKey(), entry.getValue())); // Stop the cache manager and release all resources cacheManager.stop(); } }
As you can see, we are doing two types of iterations:
- An iteration over the whole cluster with a plain cache.entrySet().forEach Loop
- An iteration over the Local Infinispan Node with a cache.getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP) .entrySet().forEach
Iterating over a Distributed Cache
The iteration over a Distributed Cache is slightly different from the Replicated one:
public class InfinispanDistributed { public static void main(String[] args) throws Exception { // Setup up a clustered cache manager GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder(); // Initialize the cache manager DefaultCacheManager cacheManager = new DefaultCacheManager(global.build()); //Create cache configuration ConfigurationBuilder builder = new ConfigurationBuilder(); builder.clustering().cacheMode(CacheMode.DIST_SYNC); // Obtain a cache Cache<String, String> cache = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE) .getOrCreateCache("cache", builder.build()); // Store the current node address in some random keys for (int i = 0; i < 10; i++) { cache.put(UUID.randomUUID().toString(), cacheManager.getNodeAddress()); } // Display the current cache contents for the whole cluster cache.entrySet().forEach(entry -> System.out.printf("%s = %s\n", entry.getKey(), entry.getValue())); // Display the current cache contents for this node // Note: By default numOwners=2, so in a cluster with 2 nodes, each node owns all the keys: // some of the keys as "primary owner" and some keys as "backup owner" cache.getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL).entrySet() .forEach(entry -> System.out.printf("%s = %s\n", entry.getKey(), entry.getValue())); // Stop the cache manager and release all resources cacheManager.stop(); } }
As you can see, looping over the whole cluster is identical with the replicated example. On the other hand, you can iterate over the Local Node Cache with cache.getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL).entrySet() .forEach
Conclusion
In this tutorial, we covered how to iterate over a replicated Infinispan cache. We learned how to set up a cache manager, create a replicated synchronous cache, store.
Source code: