建立个service类,demo为了方便,写在一起
完整代码:
连续访问两次8080服务的/cache接口 第一次控制台输出日志:
2017-10-23 14:10:02.201 INFO 13069 --- [nio-8081-exec-1] com.hazelcast.DemoService: 缓存内没有取到key=hello 2017-10-23 14:10:02.202 INFO 13069 --- [nio-8081-exec-1] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=world!第二次控制台输出日志:
2017-10-23 14:11:51.966 INFO 13069 --- [nio-8081-exec-3] com.hazelcast.StartUp: 从分布式缓存获取到 key=hello,value=world!
第二次比第一次相比少了执行service方法体内容,证明第二次是通过了缓存获取。
在Hazelcast官网上,有使用Hazelcast集群和Redis集群做缓存的对比
单只性能上来说,写入速度Hazelcast比Redis快44%,读取速度Hazelcast比Redis快56%
详情移步底下参考资料中链接
下面,我们再来一个尝试,既然有分布式缓存了,我们可以把我们的8080和8081服务做成一个web集群,web服务集群主要标志是前端负载均衡和session共享,我们来实现8080和8081的session共享。
Spring Session已经支持使用Hazelcast作为会话缓存后端,首先引入Spring Session jar包
dependencies { compile 'com.hazelcast:hazelcast' compile 'org.springframework.boot:spring-boot-starter-web' compile 'org.springframework.session:spring-session' }要启用Hazelcast作为集群会话缓存后端,有两种方式
第一种Spring Boot配置文件里面配置spring.session.*属性:
spring.session.store-type=hazelcast
第二种使用java注解开启:
@EnableHazelcastHttpSession
这里选择第二种方式,要证明集群会话共享,我们定一个简单接口打印一下sessionId,通过同一浏览器访问8080和8081服务的该接口,看看不同服务请求的时候sessionId是否一致,完整代码如下:
@EnableCaching @RestController @EnableHazelcastHttpSession @SpringBootApplication public class StartUp { private Logger LOGGER = LoggerFactory.getLogger(StartUp.class); public static void main(String[] args) { SpringApplication.run(StartUp.class, args); } @Bean public Config hazelCastConfig() { //如果有集群管理中心,可以配置 ManagementCenterConfig centerConfig = new ManagementCenterConfig(); centerConfig.setUrl("http://127.0.0.1:8200/mancenter"); centerConfig.setEnabled(true); return new Config() .setInstanceName("hazelcast-instance") .setManagementCenterConfig(centerConfig) .addMapConfig( new MapConfig() .setName("instruments") .setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE)) .setEvictionPolicy(EvictionPolicy.LRU) .setTimeToLiveSeconds(20000)); } @GetMapping("/greet") public Object greet() { Object value = Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("instruments").get("hello"); if (Objects.isNull(value)) { Hazelcast.getHazelcastInstanceByName("hazelcast-instance").getMap("instruments").put("hello", "world!"); } LOGGER.info("从分布式缓存获取到 key=hello,value={}", value); return value; } @Autowired private DemoService demoService; @GetMapping("/cache") public Object cache() { String value = demoService.greet("hello"); LOGGER.info("从分布式缓存获取到 key=hello,value={}", value); return value; } @GetMapping("/session") public Object session(HttpSession session) { String sessionId = session.getId(); LOGGER.info("当前请求的sessionId={}", sessionId); return sessionId; } } @Service @CacheConfig(cacheNames = "instruments") class DemoService { private Logger LOGGER = LoggerFactory.getLogger(DemoService.class); @Cacheable(key = "#key") public String greet(String key) { LOGGER.info("缓存内没有取到key={}", key); return "world!"; } }