微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS ElasticCache Redis 的 Spring Data 随机变慢,用户负载较高

如何解决AWS ElasticCache Redis 的 Spring Data 随机变慢,用户负载较高

我最近继承了这个 Java Spring API,Java 不是我的强项,所以请耐心等待。

我们正在运行 org.springframework.boot:spring-boot-starter-data-redis:2.1.0.RELEASE 和 Lettuce 以连接 AWS 中的 Redis/ElastiCache。

此 API 受到其他 API 以及我们的前端的攻击。它是一个基本的 API,用于存储基本的用户状态 JSON 对象(~1.2kb)。

在前期,一切都很好,我们一次看到几十个人,没什么大不了的。

在 prod 中,我们有成千上万的用户,我们开始看到此端点上的延迟时间非常长。使用 DataDog,我们在火焰图中看到我们的调用 redisUserRepository.findUserByid() 可能需要几秒钟到几分钟才能运行!快速调用低于 70 毫秒。根据 DataDog 的说法,它将使用 HGETALL 进行成百上千次调用(据我所知,这就是它从 Redis 获取数据的方式?)。

在 AWS 中检查 Redis

配置:

  • 节点类型:cache.m5.large
  • 2 个节点
  • 1 个分片
  • 传输中加密:是
  • 静态加密:是
  • Redis 身份验证:是的

监控:

  • cpu 低于 5%
  • 引擎低于 5%
  • 缓存命中率为 100%
  • 大约 15,000,000 的网络字节
  • 字节出 ~100,000
  • 当前连接达到峰值约 15
  • 当前项目是 114,300(每小时增加约 600,这会导致一些问题吗?我感觉我们没有正确管理这些数据,我们没有 114k 用户,探索我们的代码一些)
  • 用于缓存的字节数为 99,700,000

既然我们使用 Spring Data 来连接 redis 和生菜,我在这里能做什么?有些谷歌搜索给出了一些较旧的文章,有些则说生菜不好。

如果您需要更多代码,请告诉我:

package com.domain.searchconfiguration.domain.user;

import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;

@RedisHash("user")
public class RedisUser {

    @Id
    private Long id;
    @Indexed
    private String userId;
    private String profile;
    @Indexed
    private String ruleId;

    public RedisUser(String userId,String profile,String ruleId) {
        this.userId = userId;
        this.profile = profile;
        this.ruleId = ruleId;
    }

    public RedisUser() {

    }

    public Long getId() {
        return id;
    }

    public String getUserId() {
        return userId;
    }

    public String getProfile() {
        return profile;
    }

    public String getRuleId() {
        return ruleId;
    }

    public void setProfile(String profile) {
        this.profile = profile;
    }
}


package com.domain.searchconfiguration.domain.user;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface RedisUserRepository extends CrudRepository<RedisUser,String> {

    public RedisUser findByUserId(String userId);

    public RedisUser findByRuleId(String ruleId);

    public List<RedisUser> findAllByRuleId(String ruleId);

}
package com.domain.searchconfiguration.config;

import io.lettuce.core.ReadFrom;
import org.slf4j.Logger;
import org.springframework.boot.autoconfigure.data.redis.LettuceClientConfigurationBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.Redistemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;

@Configuration
@EnableRedisRepositories(basePackages = {"com.domain.searchconfiguration.domain.user","com.domain.searchconfiguration.domain.rule"})
public class RedisConfig {

    private static final Logger log = org.slf4j.LoggerFactory.getLogger(RedisConfig.class);

    @Bean
    public LettuceClientConfigurationBuilderCustomizer lettuceClientConfigurationBuilderCustomizer() {
        return p -> p.readFrom(ReadFrom.NEAREST).useSsl().disablePeerVerification();

    }

    @Bean
    public Redistemplate<?,?> redistemplate(RedisConnectionFactory redisConnectionFactory) {
        Redistemplate<byte[],byte[]> template = new Redistemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。