问题描述
我最近继承了这个 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 (将#修改为@)