java - 如何对 Set 进行分片?
问题描述
你能帮我做一件事吗?想象一下,我有一个简单的 RESTful 微服务器,其中一种GET
方法简单地响应随机String
.
我将所有字符串组合成一个ConcurrentHashSet<String>
包含所有答案的字符串。
下面有一个草率的实现,主要是它Set<String>
是故障安全的,可以同时修改。
@RestController
public class Controller {
private final StringService stringService;
private final CacheService cacheService;
public Controller(final StringService stringService, final CacheService cacheService) {
this.stringService = stringService;
this.cacheService = cacheService;
}
@GetMapping
public String get() {
final String str = stringService.random();
cacheService.add(str);
return str;
}
}
public class CacheService {
private final Set<String> set = ConcurrentHashMap.newKeySet();
public void add(final String str) {
set.add(str);
}
}
当您阅读此行时,我的 endpint 正在被 10 亿人使用。我想分片缓存。由于我的系统负载很重,我无法在一台服务器上保存所有字符串。我想拥有 256 个服务器/实例,并利用str.hashCode()%256
函数统一分配我的缓存,以确定每个服务器/实例上是否应该保留一个字符串。
你能告诉我下一步该怎么做吗?假设目前,我只在本地运行 Spring Boot 应用程序。
解决方案
您应该查看Hazelcast,它是开源的,并且在我想在我的应用程序的多个实例之间共享数据的情况下证明对我很有用。hazelcast 提供的内存数据网格可能正是您正在寻找的东西。
推荐阅读
- c# - 以编程方式滚动总是不起作用
- amazon-s3 - 如何将亚马逊的 xml 文件从 s3 复制到海王星
- jenkins - 跳过声明性管道中的阶段
- testing - VSCode 或 Delve 问题 - 根本无法测试
- c - 与 **characters** VS 与 **integers** 一起使用时,数组作为参数
- angular - 仅从 ng-bootstrap 安装 datepicker
- javascript - React-router:使用酶在“渲染”道具内部进行测试
- java - 将货币表从 USD 输出到 CNY
- html - Lotus Script 从 .htm 文件中获取 HTML 代码作为文本
- objective-c - 在 iOS + 目标 c 中跟随 CLLocation 目的地时向左、向右移动或继续行走