Database
Hazelcast
Overview
Hazelcast is an open-source, in-memory data grid platform developed in Java. It provides an integrated solution for distributed caching, computing, and storage, supporting the development of high-performance, scalable applications.
Designed for real-time applications, Hazelcast enables high-volume data processing with low latency, distributed computing, and stream processing within a single unified platform.
Details
- Development: Developed and maintained by Hazelcast Inc.
- Architecture: P2P distributed architecture (no master/slave model)
- Data Distribution: Automatic sharding and replication
- High Availability: Automatic failover and data recovery
- Language Support: Java (native), .NET, C++, Python, Go, Node.js
- CP Subsystem: Support for distributed locks, semaphores, and atomic operations
- Stream Processing: High-performance stream processing via Hazelcast Jet integration
- Security: TLS/SSL, JAAS, Kerberos authentication support
- Cloud Ready: Support for AWS, Azure, GCP, and Kubernetes environments
- Management: Web-based management UI through Management Center
Advantages and Disadvantages
Advantages
- Automatic Distribution: Automatic distribution and replication of data and computing
- P2P Architecture: Peer-to-peer configuration with no single point of failure
- High Performance: Low-latency processing through memory-based operations
- Scalability: Linear scalability by adding nodes
- Rich Feature Set: Diverse data structures including Map, Queue, Topic, Lock
- Enterprise Ready: Commercial support and complete management tools
Disadvantages
- Memory Consumption: High memory requirements for large data storage
- Java Dependency: JVM-based limitations for integration with other languages
- Complexity: Complexity of configuration and operations inherent to distributed systems
- Persistence Cost: Additional configuration and overhead for data persistence
- Licensing: Commercial features require paid licenses
Key Links
Code Examples
Setup and Configuration
<!-- Maven dependency (pom.xml) -->
<dependencies>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast</artifactId>
<version>5.4.0</version>
</dependency>
</dependencies>
// Basic Hazelcast instance startup
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
public class HazelcastServer {
public static void main(String[] args) {
// Start Hazelcast instance with default configuration
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
System.out.println("Hazelcast instance started");
// On application shutdown
// hz.shutdown();
}
}
Basic Operations (CRUD)
// Basic operations with distributed map (IMap)
import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.map.IMap;
public class BasicMapOperations {
public static void main(String[] args) {
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
// Get distributed map
IMap<String, String> customerMap = hz.getMap("customers");
// Store data (PUT)
customerMap.put("user:1001", "John Doe");
customerMap.put("user:1002", "Jane Smith");
// Retrieve data (GET)
String customer = customerMap.get("user:1001");
System.out.println("Customer: " + customer);
// Update data
customerMap.put("user:1001", "John Smith");
// Delete data
customerMap.remove("user:1002");
// Total data size
System.out.println("Map size: " + customerMap.size());
hz.shutdown();
}
}
Client Connection Configuration
// Hazelcast client configuration
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
public class HazelcastClientExample {
public static void main(String[] args) {
// Client configuration
ClientConfig clientConfig = new ClientConfig();
clientConfig.setClusterName("my-cluster");
clientConfig.getNetworkConfig().addAddress("127.0.0.1:5701", "127.0.0.1:5702");
// Client connection
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
// Access distributed map
IMap<String, String> map = client.getMap("example-map");
map.put("key1", "value1");
System.out.println("Value: " + map.get("key1"));
client.shutdown();
}
}
Utilizing Distributed Data Structures
// Example using multiple data structures
import com.hazelcast.core.*;
import com.hazelcast.collection.IQueue;
import com.hazelcast.topic.ITopic;
import com.hazelcast.cp.IAtomicLong;
public class DistributedDataStructures {
public static void main(String[] args) {
HazelcastInstance hz = Hazelcast.newHazelcastInstance();
// Distributed queue
IQueue<String> queue = hz.getQueue("task-queue");
queue.put("task1");
queue.put("task2");
String task = queue.take(); // Blocking operation
// Distributed topic (Pub/Sub)
ITopic<String> topic = hz.getTopic("notifications");
topic.addMessageListener(message -> {
System.out.println("Received: " + message.getMessageObject());
});
topic.publish("New notification");
// Distributed atomic variable
IAtomicLong counter = hz.getCPSubsystem().getAtomicLong("global-counter");
long newValue = counter.incrementAndGet();
System.out.println("Counter: " + newValue);
// Distributed lock
FencedLock lock = hz.getCPSubsystem().getLock("shared-resource");
lock.lock();
try {
// Critical section
System.out.println("Exclusive access to resource");
} finally {
lock.unlock();
}
hz.shutdown();
}
}
Detailed Configuration with Configuration File
<!-- hazelcast.xml -->
<hazelcast xmlns="http://www.hazelcast.com/schema/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-5.4.xsd">
<cluster-name>production-cluster</cluster-name>
<network>
<port auto-increment="true" port-count="20">5701</port>
<join>
<multicast enabled="false"/>
<tcp-ip enabled="true">
<member>192.168.1.100</member>
<member>192.168.1.101</member>
<member>192.168.1.102</member>
</tcp-ip>
</join>
</network>
<map name="customer-cache">
<backup-count>1</backup-count>
<eviction eviction-policy="LRU" max-size-policy="PER_NODE" size="10000"/>
<time-to-live-seconds>300</time-to-live-seconds>
</map>
<cp-subsystem>
<cp-member-count>3</cp-member-count>
<group-size>3</group-size>
</cp-subsystem>
</hazelcast>
Practical Example (Cache Integration)
// Spring application cache integration example
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Cacheable(value = "users", key = "#userId")
public User getUserById(Long userId) {
// Retrieve user information from database (heavy operation)
return userRepository.findById(userId);
}
@CacheEvict(value = "users", key = "#user.id")
public void updateUser(User user) {
userRepository.save(user);
}
}
// Hazelcast configuration
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new HazelcastCacheManager(hazelcastInstance());
}
@Bean
public HazelcastInstance hazelcastInstance() {
Config config = new Config();
config.getMapConfig("users")
.setTimeToLiveSeconds(3600)
.setBackupCount(1);
return Hazelcast.newHazelcastInstance(config);
}
}
Best Practices
// Production configuration example
import com.hazelcast.config.*;
public class ProductionConfig {
public static Config createProductionConfig() {
Config config = new Config();
// Cluster name
config.setClusterName("production-cluster");
// Network configuration
NetworkConfig network = config.getNetworkConfig();
network.setPort(5701).setPortAutoIncrement(true);
// Security configuration
SecurityConfig security = config.getSecurityConfig();
security.setEnabled(true);
// Enable metrics
MetricsConfig metrics = config.getMetricsConfig();
metrics.setEnabled(true)
.setCollectionFrequencySeconds(5)
.setJmxConfig(new MetricsJmxConfig().setEnabled(true));
// Management center configuration
ManagementCenterConfig mcConfig = config.getManagementCenterConfig();
mcConfig.setConsoleEnabled(true)
.addTrustedInterface("192.168.1.*");
// Map configuration (TTL and backup)
MapConfig mapConfig = new MapConfig("session-cache");
mapConfig.setTimeToLiveSeconds(1800) // 30 min TTL
.setBackupCount(1)
.setAsyncBackupCount(1)
.setReadBackupData(true);
config.addMapConfig(mapConfig);
return config;
}
}
CLI Operations and Monitoring
# Using Hazelcast CLI tools
hz-cli
# Check cluster information
hz-cli cluster list
# Display map statistics
hz-cli map stats -n myMap
# Check cluster members
hz-cli member list
# Execute SQL queries
hz-cli sql "SELECT * FROM customers WHERE age > 25"
// JMX-based monitoring
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
public class HazelcastMonitoring {
public void printMapStatistics(String mapName) {
try {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName(
"com.hazelcast:instance=_hzInstance_1_dev,type=IMap,name=" + mapName
);
long size = (Long) server.getAttribute(objectName, "Size");
long hits = (Long) server.getAttribute(objectName, "Hits");
long misses = (Long) server.getAttribute(objectName, "Misses");
System.out.println("Map: " + mapName);
System.out.println("Size: " + size);
System.out.println("Hits: " + hits);
System.out.println("Misses: " + misses);
System.out.println("Hit Rate: " + (hits * 100.0 / (hits + misses)) + "%");
} catch (Exception e) {
e.printStackTrace();
}
}
}