Getting Started With Hazelcast 读书笔记(第二章、第三章)
第二章 起步
本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用.
1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行.
2.增加了MultiMap(google的guava也有),允许一个key可以有多个value.
3.增加了Predicate做数据筛选,可以用默认的sqlpredicates也可自定义,甚至可以自定义分页查询.
client单独出一个jar包了.书里的法子不行.只能自己写.
首先在pom里面加入依赖
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-client</artifactId>
</dependency>
新建一个client程序来执行:
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
public class SimpleClient {
public static void main(String[] args) {
ClientConfig clientConfig = new ClientConfig();
clientConfig.addAddress("127.0.0.1:5701");
HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
IMap map = client.getMap("manualCities");
System.out.println("Map Size:" + map.size());
}
}
或者使用ConsoleApp,这个好像更接近原来的例子..
吐槽一下,才100多页的书还贴代码,印刷体看的很不舒服,建议还是下载到IDE里面看吧..
第三章 并发
除了提供分布式的集合类,Hazelcast也提供了更为底层的并发控制能力,以确保我们的应用程序可以并发执行.
一.先搞了两个例子,map,queue的多个副本都是公用的,就是说一边改了,到处都变化.这就有可能造成使用上的问题.所以需要引入锁机制
1.Hazelcast可以调用getLock获取到一个同步锁,在这个基础上就可以避免被多个修改造成问题.
2.可以对某一个数据项目进行Lock.例如调用map.tryLock()
二.Hazelcast还支持并发事务回滚
事务机制为,先锁住相关的数据,在事务中仅仅修改缓存的本地数据,当事务提交时候,一起进行修改.并释放锁.如果事务失败,只要释放锁,并清除本地修改缓存即可.
三.生成唯一ID
可以获取getIdGenerator来生成,这个是有缓存的,第二个就从10000开始的,而不是书里面的1百万.
四.事件分发(MessageListener)--of就是用这个
Hazelcast也实现了分布式的消息事件(订阅.广播),做消息分发.
注意:监听Listener是单线程的,这样能确保消息收到的顺序和接收到的顺序是一致的.所以我们必须保证处理消息的进程不能干太多事,否则有可能造成消息堵塞
例如在TopicListener的onMessage中加上
Thread.sleep(5000);
这样就会变成消息处理的时间越来越晚于生成时间,无法及时处理(堵住了)...
Received message: Tue Dec 01 17:26:16 GMT+08:00 2015 - Member [40.192.191.140]:5701 this says hello:INT: 1548Process Date:Tue Dec 01 17:26:22 GMT+08:00 2015
Received message: Tue Dec 01 17:26:18 GMT+08:00 2015 - Member [40.192.191.140]:5701 this says hello:INT: 1840Process Date:Tue Dec 01 17:26:27 GMT+08:00 2015
Received message: Tue Dec 01 17:26:20 GMT+08:00 2015 - Member [40.192.191.140]:5701 this says hello:INT: 225Process Date:Tue Dec 01 17:26:32 GMT+08:00 2015
Received message: Tue Dec 01 17:26:21 GMT+08:00 2015 - Member [40.192.191.140]:5702 this says hello:INT: 261Process Date:Tue Dec 01 17:26:37 GMT+08:00 2015
Received message: Tue Dec 01 17:26:22 GMT+08:00 2015 - Member [40.192.191.140]:5701 this says hello:INT: 1876Process Date:Tue Dec 01 17:26:42 GMT+08:00 2015
Received message: Tue Dec 01 17:26:23 GMT+08:00 2015 - Member [40.192.191.140]:5702 this says hello:INT: 1308Process Date:Tue Dec 01 17:26:47 GMT+08:00 2015
解决办法也很简单,在listener里面使用ExecutorService对消息另外起一个线程处理.