caching - Storm 数据的最佳缓存提供商
问题描述
我们正面临 Storm 的负载问题。我们使用 Storm 状态持久性从内存中获取数据,以填充实时报告。但是在重负载环境下会有很长的 GC 停顿。因此,我们创建了另一个服务。Storm 将向该服务发送数据,该服务维护内存中的数据结构。尽管长时间的 GC 暂停已经减少,但我们仍然无法针对更重的负载环境进行扩展。我尝试在新服务中使用 REDIS 缓存。但是在重负载下写入 REDIS 非常慢。可能是由于其单线程模型。
有人可以建议一种有效的缓存机制吗?我检查了 Memcached,但它对每个键可以容纳的值的大小有限制。
以下是我尝试的代码更改:
**Pom.xml**
<!-- Spring boot Redis dependency -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
**Bean Configuration**
@Bean
RedisTemplate<String, List<Data>> redisTemplate() {
RedisTemplate<String, List<Data>> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(new JedisConnectionFactory()());
}
**RedisStore abstract class**
public abstract class RedisStore<T extends BaseEvent> implements EventStoreService<Integer, T>{
private ValueOperations<String, List<T>> valOperations;
final String type;
public RedisStore(String type, RedisTemplate<String, List<T>> redisTemplate) {
this.valOperations = redisTemplate.opsForValue();
this.type = type;
}
public void put(Integer id, T elem) {
List<T> existingElems = valOperations.get(getKey(id));
if (null == existingElems) {
existingElems = new ArrayList<>();
}
existingElems.add(elem);
valOperations.set(getKey(id), existingElems);
}
}
解决方案
推荐阅读
- python - Tensorflow NMT with Attention 教程——需要帮助理解损失函数
- java - 如何查询具有未定义深度的分层类别树实体
- ruby-on-rails - Heroku create 给出“Permission denied @ rb_sysopen”
- ios - 如何在外部模块中覆盖 public init(frame:) ?
- mysql - 如何比较两列以及如何获取所有行?
- node.js - 使用 chrome 的调试器如何无法在 VSCode 中绑定断点?
- javascript - 在 Web 浏览器中导入 ES6 模块不起作用
- javascript - 如何使用 JavaScript 获取客户的国家地址 IP 地址?
- android - 如何解决 Gradle 项目同步失败。基本功能(例如编辑、调试)将无法正常工作
- javascript - 搜索包含特定字符串的所有标签,然后将其更改为声明值