Hazelcast是一个内存分布式计算平台,用于管理数据并并行执行执行应用程序。
1. 它是用Java编写的。
2. 与其他一些内存数据库(如redis)不同,Hazelcast是多线程的,这意味着可从所有可用的CPU内核中受益。
3. 与其他内存数据网格不同 - 它设计用于分布式环境。它支持每个群集无限数量的map和缓存。
根据基准测试,Hazelcast在获取数据方面比Redis快56%,在设置数据方面比Redis快44%。
Hazelcast是一个高度可扩展的数据分发和集群平台。特性包括:
提供java.util.{Queue, Set, List, Map}分布式实现。
提供java.util.concurrency.locks.Lock分布式实现。
提供java.util.concurrent.ExecutorService分布式实现。
提供用于一对多关系的分布式MultiMap。
提供用于发布/订阅的分布式Topic(主题)。
通过JCA与J2EE容器集成和事务支持。
提供用于安全集群的Socket层加密。
支持同步和异步持久化。
通过JMX监控和管理集群。
支持动态HTTP Session集群。
利用备份实现动态分割。
支持动态故障恢复。
我们来看一下如何使用Hazelcast
pom
com.hazelcasthazelcast-all3.10.1
在SpringBoot主程序开启缓存@EnableCaching
@EnableCaching@EnableFeignClients@EnableDiscoveryClient@EnableTransactionManagement@SpringBootApplicationpublic classProductproviderApplication {
public static voidmain(String[] args) {
ApplicationContext app = SpringApplication.run(ProductproviderApplication.class,args);SpringBootUtil.setApplicationContext(app);}
}
配置类
@Configurationpublic classHazelcastConfiguration {
@BeanpublicConfig hazelCastConfig(){
Config config = newConfig();config.setInstanceName("hazelcast-instance").addMapConfig(
newMapConfig().setName("configuration").setMaxSizeConfig(newMaxSizeConfig(200,MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE)).setEvictionPolicy(EvictionPolicy.LFU)
.setTimeToLiveSeconds(-1));returnconfig;}
}
还是以昨天的汽车配件分类实体类来说明,此处注意一定要实现序列化接口Serializable
@AllArgsConstructor@NoArgsConstructorpublic classProviderProductLevel implementsProvider,Serializable {
@Getter@SetterprivateLong id;@Getter@SetterprivateString code;@Getter@SetterprivateString name;@Getter@SetterprivateInteger sort;@Getter@SetterprivateInteger level;@Getter@SetterprivateProductType productType;@Getter@SetterprivateString pictureUrl;@Getter@SetterprivateList otherProperties;@GetterprivateList productListProviders= newCopyOnWriteArrayList<>();
publicProviderProductLevel(Long id,String code,String name,Integer sort,ProductType productType) {
this.id= id;this.code= code;this.name= name;this.sort= sort;this.level= 1;this.productType= productType;}
publicProviderProductLevel(Long id,String code,String name,Integer sort,String pictureUrl) {
this.id= id;this.code= code;this.name= name;this.sort= sort;this.level= 2;this.pictureUrl= pictureUrl;}
@Overridepublic booleanaddProvider(Provider provider) {
LevelDao levelDao = SpringBootUtil.getBean(LevelDao.class);if(provider instanceofProviderProductLevel) {
levelDao.addLevelToLevel(newParamLevel(this.id,((ProviderProductLevel)provider).getId()));}
return this.productListProviders.add(provider);}
}
写一个Controller,其中建立分布式缓存Map,不相关的内容不做解释,只说明分布式缓存内容
@Slf4j@RestControllerpublic classLevelController {
//创建分布式缓存节点privateHazelcastInstance instance= Hazelcast.newHazelcastInstance();@AutowiredprivateLevelDao levelDao;//一级分类缓存// private Map cachelevelMap1 = new ConcurrentHashMap<>();privateMap cachelevelMap1= instance.getMap("level1");
/*** 保存一级汽车配件分类*@paramlevel*@return*/@ProductAnnotation@SuppressWarnings("unchecked")
@Transactional@PostMapping("/productprovider-anon/savelevel1")
publicResult saveLevel1(@RequestBodyProviderProductLevel level) {
ProviderFactory.createProviderProductLevel1(level,true);if(!cachelevelMap1.containsKey(level.getId())) {
cachelevelMap1.put(level.getId(),level);}
returnResult.success("保存成功");}
/*** 保存二级汽车配件分类,并将二级产品分类添加到一级产品分类的子分类*@paramid*@paramlevel*@return*/@SuppressWarnings("unchecked")
@Transactional@PostMapping("/produ