spring-boot整合hazelcast实现高频交易撮合引擎缓存部分入门级

简介: 领先的内存数据网格 Hazelcast IMDG 业界速度最快,可扩展性最高的内存数据网格,其中速度,可扩展性和连续处理是部署的核心要求。

简介:
官网:https://hazelcast.com/
一.可用性
Hazelcast的分布式架构为连续群集正常运行时间提供冗余,并始终提供可用数据,以满足最苛刻的应用需求。容量随着需求弹性增长,而不会影响性能或可用性。
二.速度
Hazelcast In-Memory解决方案可以更快地补充数据库和数量级。时间就是金钱; 为您的新应用提供推动业务发展所需的微秒响应时间。将数据保留保留在数据库中,并利用Hazelcast以数字速度进行数据处理。
三.用户体验
在数字时代,用户不会等待。无论是复杂的电子商务交易还是机器学习驱动的客户自助服务门户,速度都是一切。Hazelcast客户实际上利用我们的速度在其微小的处理窗口中创造更多时间,以便在更多更深层次的服务中分层,创造卓越的商业价值,同时提供业界最佳的用户体验。
四.风险缓解
有足够的速度和规模,有更多的时间来更彻底地过滤风险。运行更严格的欺诈检测,实时审查策略风险,运行机器学习算法,而不会影响用户体验。Hazelcast实现了无法想象的应用程序。
五.安全
可以说是您业务中最重要的一部分。获得安全错误,其他一切都受到影响。Hazelcast内存解决方案为安全支持带来了全新的功能,正如世界上一些最苛刻的客户环境所证明的那样。
1.导入依赖

<dependency>
            <groupId>com.hazelcast</groupId>
            <artifactId>hazelcast-all</artifactId>
            <version>3.9.4</version>
        </dependency>
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.3</version>
        </dependency>

2.创建Employee

public class Employee implements Serializable {
    private String name;
    private int age;
    private boolean active;
    private double salary;

    public Employee(String name, int age, boolean active, double salary) {
        this.name = name;
        this.age = age;
        this.active = active;
        this.salary = salary;
    }

    public Employee() {
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }

    public boolean isActive() {
        return active;
    }

}

3.服务端Demo
3.1 不包含事物

public static void demo() {
        Config cfg = new Config();
        HazelcastInstance instance = Hazelcast.newHazelcastInstance(cfg);
        IMap<String, Employee> mapCustomers = instance.getMap("employee");
        mapCustomers.put("active3", new Employee("zhang",20,true,1.0));
        mapCustomers.put("active4", new Employee("zhang4",20,true,1.0));
        mapCustomers.put("active1", new Employee("zhang1",30,true,1.0));
        mapCustomers.put("active2",  new Employee("zhang3",38,true,1.0));
    }

3.2 包含事物

public static void demo() {
        Config cfg = new Config();
        HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(cfg);
        TransactionOptions options = new TransactionOptions()
                .setTransactionType( TransactionOptions.TransactionType.ONE_PHASE );
        TransactionContext context = hazelcastInstance.newTransactionContext( options );
        context.beginTransaction();
        TransactionalMap<String, Employee> map = context.getMap( "employee" );
        try {
            map.put("active3", new Employee("zhang",20,true,1.0));
            map.put("active4", new Employee("zhang4",20,true,1.0));
            map.put("active1", new Employee("zhang1",30,true,1.0));
            map.put("active2",  new Employee("zhang3",38,true,1.0));
            context.commitTransaction();
        } catch ( Throwable t ) {
            context.rollbackTransaction();
        }
    }

4.客户端Demo

@Test
    public void demo() {
        ClientConfig clientConfig = new ClientConfig();
        //clientConfig.addAddress("127.0.0.1:5701");
        HazelcastInstance client = HazelcastClient.newHazelcastClient(clientConfig);
        IMap<String, Employee> map = client.getMap( "employee" );
        BidiMap<String, String> bidiMap=new DualTreeBidiMap<>();
        map.forEach((k,v)->bidiMap.put(k, JSON.toJSONString(v)));
        //对value的操作 value为对象
        //第一种方式
        Predicate namePredicate = Predicates.equal( "age", 20 );
        Collection<Employee> employees = map.values( namePredicate );
        for (Employee employee : employees) {
            System.out.println(employee.getName());
        }
        //第二种方式
        //active == 代表对象中的active是否启用
        Collection<Employee> employeess =  map.values( new SqlPredicate( "active AND age <= 30" ) );
        for (Employee employee : employeess) {
            String key=bidiMap.getKey(JSON.toJSONString(employee));
            System.out.println("key: "+key);
            map.remove(key);
            System.out.println(employee.getName());
        }
        //第三种方式
        //active == 代表对象中的active是否启用
        EntryObject e = new PredicateBuilder().getEntryObject();
        Predicate predicate = e.is( "active" ).and( e.get( "age" ).lessEqual( 30 ) );
        Collection<Employee> employeessss = map.values( predicate );
        for (Employee employee : employeessss) {
            System.out.println(employee.getName());
        }
        //对key的操作
        Predicate predicate1 = new SqlPredicate("__key like a%");
        Collection<Employee> employeesss = map.values(predicate1);
        for (Employee employee : employeesss) {
            System.out.println(employee.getName());
        }
    }

如果客户端和服务端在同一个服务中就不需要配置

clientConfig.addAddress("127.0.0.1:5701");

5.如果想要初步实现缓存撮合可以使用客户端端例子中的对value操作的第二和第三种方式
6.该例子目前只是入门级,博客中会逐渐深入解析hazelcast如何实现高频撮合系统中的缓存部分。

相关文章
|
10月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1759 5
|
10月前
|
存储 缓存 Java
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
缓存是提升应用性能的重要技术,Spring框架提供了丰富的缓存注解,如`@Cacheable`、`@CacheEvict`等,帮助开发者简化缓存管理。本文介绍了如何在Spring中配置缓存管理器,使用缓存注解优化数据访问,并探讨了缓存的最佳实践,以提升系统响应速度与可扩展性。
440 0
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
398 32
|
缓存 数据挖掘 BI
|
12月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
795 0
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
2366 24
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
缓存 Java 数据库连接
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
602 4
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
528 3
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
5397 2
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
610 1