系列文章
Hazelcast系列(二):hazelcast集成(嵌入式)
Hazelcast系列(三):hazelcast集成(服务器/客户端)
Hazelcast系列(五):Auto-Detection发现机制
Hazelcast系列(十一):Map(三)备份、过期驱逐与内存格式
目录
前言
Hazelcast 是一个开源内存数据网格 (IMDG)。它提供弹性可扩展的分布式内存计算,并被广泛认为是提高应用程序性能的最快且最具可扩展性的方法。更重要的是,Hazelcast 通过提供许多对开发人员友好的 Java 接口(例如 Map、Queue、ExecutorService、Lock 和 JCache)的分布式实现,使分布式查询、计算变得简单。
Hazelcast 具有高度可扩展性和可用性。分布式应用程序可以使用 Hazelcast 进行分布式缓存、同步、集群、处理、发布/订阅消息传递等。
当前,Hazelcast也提供商业版本,分为 Pro 和 Enterprise 。Enterprise 商业版提供了内存存储压缩、热重启持久化、安全套件等额外的功能。
Hazelcast服务模式分为 嵌入型 和 服务器/客户端 。
嵌入型仅需使用对应的 hazelcast.jar 即可开启本地缓存服务,缓存的数据通过序列化后放在 堆内存 中,同业务存储数据耦合。
服务器/客户端模式拆分独立的服务器开启缓存集群,客户端通过 ClientConfig 进行缓存访问。
特点
- Hazelcast简单,单用Java语言编写的,没有其他依赖,直接添加 hazelcast.jar 就可以使用
- Hazelcast可扩展性好,具有天然的集群优势,通过多种发现模式,自动发现成员并添加到集群
- Hazelcast速度快,数据存放在内存中,读取和更新非常迅速
- Hazelcast数据冗余,每个节点都有其他节点的分区数据,成员节点发生故障能快速从备份中恢复
- Hazelcast提供缓存一致性解决方案,write-through 和 read-through 等。
- Hazelcast提供分布式存储、查询和计算,能极大的利用集群中每个服务器CPU和内存空间。
优劣势
这里仅和同为key/value的存储数据库 Redis 对比。
Hazelcast | Redis | |
---|---|---|
开发语言 | JAVA | C |
线程 | 多线程,分为3种类型:接收请求、读取数据、写入数据 | 单线程 |
缓存一致性 | 缓存服务提供 write-through 等直写等策略 | 旁路策略,需要额外的线程处理 |
数据存储 | 序列化后存储在堆内存,数据太多会导致垃圾回收器 stop the world | jemalloc内存分配器,经过编码压缩在内 存中 |
备份 | 通过271个分区,每个节点都有自己的主数据,每个节点都有数据备份 | 主从sentinel |
查询 | 基础查询和支持复杂的查询,类SQL查询语言 | 基础查询和通过设计复杂key实现复杂的 查询 |
性能 | 多节点线程越多提升越快 | 单节点CRUD性能较强 |
分布式集群 | 自带的多种发现机制形成集群 | 自带redis-cluster |
脑裂 | 通过限制最小成员数量和合并策略,无法根本解决 | 从节点通信数和通信ACK时间来处理脑裂 ,无法根本解决 |
技术文档 | 文档较少,社区活跃度不高 | 文档非常多,社区非常活跃 |
语言支持 | 相对较少,主要是java | 更多 |
其他
- Hazelcast因为放在堆内存,所以当数据量很大,导致垃圾回收器长时间 Stop The World,会导致整个应用程序不可用
- Hazelcast Platfrom 是将 Hazelcast IMDG 和 Hazelcast Jet 进行整合合并的统一版本,从5.0 开始
- 使用 Hazelcast 可以仅使用 Hazalcast.jar 依赖,当然,如果配合 Spring Boot,可以添加hazelcast-spring 依赖,它默认扫描 hazelcast.yaml 并注入 HazelcastInstance 对象
- Hazelcast 自己提供 Management Center 用于监控和治理整个Hazelcast集群
- Hazelcast 每个版本 jar 里面都有当前版本所有的配置项文件 hazelcast-full-example.yaml 和 默认配置项 hazelcast-default.yaml,当然,也有客户端的,这对于使用配置项和了解当前版本情况非常有帮助
总结
如上所述,Hazelcast 更专注于内存数据管理、分布式计算和查询,而 Redis 是一种更通用的数据存储,具有高级功能和更广泛的语言支持。如果只是作为简单的内存数据库使用,Redis显然更加适合。