用弹簧缓存和Redis涡轮增压
#java #spring #cache #redis

在最后一个,我们经历了微服务架构的巨大崛起,技术团队选择开发负责所有业务功能的大型系统。如今,主要解决方案是将业务领域划分为较小的范围徒劳,并创建与之满足的小型独立系统。微服务体系结构的优点范围从提供不同的团队到以某些功能的性能开发孤立节奏的软件。

为了寻找性能改进,所使用的工具之一是使我们能够提高经常访问数据的消耗速度。使用缓存的主要策略之一是将数据存储在本地服务器内存中,以避免数据库中的常规查询,外部API甚至昂贵的处理处理。

在处理微服务时,普遍认为,如果需要供应或绩效,则必须超过一个赋予群集生命的人。在群集化环境旁边,在本地缓存的实施中存在问题,每个实例都是一个独立的过程,并且不会共享成员,从而导致缓存在本能和另一个方面之间是不一致的。在这种情况下,本地缓存的位置还不够,因为现在通过实例将数据存储在缓存中时,另一个实例应该可以访问您的密切咨询。有必要使用分布式的缓存提供商,例如HazelcastRedis

redis是一个关系密钥结构(键)和值(值)数据库。它的主要功能是由于其在内存中的实现而导致的高速访问。它的主要用途之一是作为分布式缓存,因为可以具有多个并行连接。 When choosing to use Redis as a cache provider in an application, it is necessary to use its APIs on the basis of the way, generating a great dependent, already if it is at some point necessary to exchange From provider, there would be a high维护成本。这样解决的问题是采用抽象,无论您是由您构建的。在Spring Boot应用程序中,可以支持Spring Cache。

Spring Cache是一种弹簧启动扩展税,它可以在Note模型中通过其API插入,更新和从缓存中删除数据的方式。弹簧缓存支持对象缓存,因此使您更容易在不同的点共享相同的缓存。

春季缓存com redis

为了获得与redisters一起使用的redisters的好处,有必要是该工具的配置过程的迹象,我从pom.xml中的依赖性插入或您使用的任何其他依赖管理器中插入。在豆类和属性的定义上。但是不用担心!本文的目的是说明如何通过Spring Cache抽象配置和使用Redis作为分布式缓存。

最初有必要将弹簧数据税的依赖性添加到R​​EDIS,然后我们将配置应用程序以与CACH一起使用并将Redis定义为提供商。在连接配置和REDIS作为提供商的定义之后,必须定义负责清洁缓存的配置,并且在通信期间将使用哪个序列化器。

配置应用程序

我们将首先添加Spring Data Redis在项目中的依赖性,该依赖性将在应用程序中使用REDIS抽象,一些优点是客户端和预定义的连接器,自定义序列化器,用于网络上数据的巨大信息等。以下是使用Maven的示例。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

下一步是用redis定义连接工作人员,还将redis定义为应用程序中的缓存提供商。yaml文件。

spring:
    redis:
        host: ${HOST:localhost}
        port: ${PORT:6379}
        password: ${PASSWORD:password}
    cache:
        type: redis
        cache-names: user_payment_methods

apons需要将REDIS作为缓存提供商的定义,即我们配置了一些属性,例如缓存中对象的寿命,以及对象将被序列化的方式。使用Spring Data Redis上的模式,使用了使用本机JVM序列化的JdkSerializationRedisSerializer,并且该本机库以允许执行远程库而闻名,远程的执行,该遥控器未经验证它会导致不必要的执行。鉴于此,建议使用其他序列化器,例如Jackson Library JSON Serializer。

@EnableCaching
@Configuration
public class RedisConfig {

    @Bean
    public RedisCacheConfiguration defaultCacheConfiguration() {
        return RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(120))// 2 horas
                .disableCachingNullValues()
                .serializeValuesWith(fromSerializer(new GenericJackson2JsonRedisSerializer()));
    }
}

我们开始上述启动,使用类值得注意的注释,以使在Spring Boot中的应用程序中使用缓存。然后,使用@Configuration Note来定义课程将为Spring的背景提供商品。以及它将负责定义缓存默认值的bean。在整个defaultCacheConfiguration()期间,定义的是,对象将保留在©2小时的缓存中,并且还定义了null值不是卷曲的,最后,对象通过GenericJackson2JsonRedisSerializer在JSON中序列化。

cachendo结果

通过完成配置,我们准备在应用程序中提供缓存的使用。因此,为了更好地理解,请想象一个市场,用户可以通过建立方式获得不同形式的付款方式。该系统应提供一种咨询这种通常的付款方式的方法。因此,用户第一次咨询表单时,结果将存储在缓存中以备将来用途。请参阅以下课程中实现的示例:

@Service
public class PaymentMethodsUserService {
    @Autowired
    private UserRepository userRepository;

    @Cacheable(value = "user_payment_methods", key = "#userId")
    public List<PaymentMethod> getPaymentMethodsToUserById(UUID userId) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalArgumentException("User not exists"));

        if (user.getPaymentMethods().isEmpty()) {
            return defaultMethods();
        }

        return user.getPaymentMethods();
    }

    private List<PaymentMethod> defaultMethods() {
        return List.of(
                new PaymentMethod("Cash", "Money")
        );
    }
}

要在整个koud5中启用高速缓存,才能将值得注意的@Cacheble用于座右铭的数量,并且定义了参数值和键。价值参数负责确定将咨询哪些缓存。密钥参数负责定义如何创建缓存键。通过模式,第一个参数被使用,如有必要,可以通过春季表达语言(法术)创建更多精心设计的键。要了解有关如何生成钥匙的更多信息,请咨询documentação。由于与@Cacheable一起注明了一个整体,因此以下行为已合并,因此,如果缓存中有钥匙,则首先是预约,返回值,并执行座右铭的正文。否则,执行母亲的身体的身体,并将其结束的结果存储在缓存中以进行未来查询。

使缓存无效

我们的项目已经可以在缓存中存储新信息,并进行咨询,por©m,我们还需要确定必须使缓存无效的情况,以便更新信息更新。想象一下,该系统正在发展,并开始接受新的付款方式,现在用户将它们添加到其集合中。 Enter,每当用户添加新的付款方式时,您将删除缓存中表格的注册。请参阅下面课程中实现的示例。

@Service
public class PaymentMethodsUserService {
    @Autowired
    private UserRepository userRepository;

    @CacheEvict(value = "user_payment_methods", key = "#userId")
    public void addPaymentMethods(UUID userId, PaymentMethod paymentMethod) {
        User user = userRepository.findById(userId)
                .orElseThrow(() -> new IllegalArgumentException("User not exists"));

        user.add(paymentMethod);
        userRepository.save(user);
    }
}

如果我们在母亲中观察到©All addPaymentMethods(),则使用Koud9 Note与Koudde10 Notes10的参数相同。当整个过程中注意到@CacheEvict时,同样的情况就变成了缓存无效的触发因素,然后执行其执行而不会中断任何例外缓存无效。如果与缓存相反,则没有更改。

现在可以在系统中的各个点使用此缓存,只有母亲的笔记和合同都等于这些缓存。该应用程序可能在各种情况下运行并共享相同的缓存,从而保持数据的一致性。

包括£o

缓存的使用允许系统中的性能提高,因为具有高访问频率的数据可以更快地恢复,因为不需要处理。当仅执行服务实例时,在本地内存中使用缓存是一个有趣的策略,因为从环境开始聚集的那一刻起,缓存的高速缓存就可以共享,而数据不一致。这证明使用分布式高速缓存提供商合理。 REDIS是一个分布式的缓存提供商,可促进网络上的数据共享,并支持不同语言的使用。

可以通过Spring Cache在Spring Boot应用程序中使用缓存,该缓存允许使用Notes抽象使用缓存。 Spring Cache支持Redis作为提供商,并且可以通过配置快速将其用作分布式缓存。 @Cacheable Note允许母亲对缓存中的对象进行咨询,并且@CacheEvict允许您无效缓存。重要的是要插入,删除和更新缓存中的数据有多么重要的重要性是定义持续时间,以免被不必要的问题感到惊讶。

反思

  1. Spring Data Redis
  2. Spring Cache 3.2, aqui fornece mais detalhes que a versão atual
  3. Spring Cache atual
  4. Customizer TTL Redis Cache
  5. Spring Cache With Redis: Baeldung
  6. Principais Aprendizados Spring Cache Redis