您有以下界面:
public interface KeyValueStore {
public void put(String key, byte[] value);
public byte[] get(String key);
public void putAll(Map<String,byte[]> pairs);
public Map<String,byte[]> getAll(Collection<String> keys);
}
我有以下客户端实现上一个界面:
public class Client implements KeyValueStore{
@Override
public void put(String key, byte[] value) {
}
@Override
public byte[] get(String key) {
}
@Override
public void putAll(Map<String, byte[]> pairs) {
}
@Override
public Map<String, byte[]> getAll(Collection<String> keys) {
}
}
如何实现客户端以便与给定的接口进行交互?我想用客户端 - 服务器架构来做这件事。
我想要的另一件事是“名称服务器”,它知道数据的存储位置(基本上它具有到“存储服务器”的密钥映射),以及其他数据实际上持久存储的服务器。
答案 0 :(得分:1)
最基本的实现是使用内部Map
,但这有点傻,为什么不首先使用Map
?
public class Client implements KeyValueStore{
private final Map<String, byte[]> internalMap = new HashMap<String, byte[]>();
@Override
public void put(String key, byte[] value) {
this.internalMap.put(key, value);
}
@Override
public byte[] get(String key) {
return internalMap.get(key);
}
@Override
public void putAll(Map<String, byte[]> pairs) {
internalMap.putAll(pairs);
}
@Override
public Map<String, byte[]> getAll(Collection<String> keys) {
return internalMap.keySet();
}
}
所以我不确定那是你想要的。您想要一个客户端 - 服务器架构吗?如果是这样,请在您的问题中清楚地提及它,并提供您想要的规格。
答案 1 :(得分:1)
这是一个非常开放的问题。我会拍它。
我认为你需要记住三个不同的概念:
接口 履行 客户端
让我们看看每一个。 你已经拥有了界面,所以这一切都很好。
您所谓的客户端,我认为是实现,意思是:它是实现接口中定义的方法行为的实际代码。
客户(在我的解释中)将是您系统中的另一个部分,它通过您将要编写的实现与您的接口进行交互。
解决您的问题: 第一步是弄清楚如何通过put和putAll持久保存数据。如果你只想在内存中保留一些内容,那么Map可能就足够了。如果预计条目数会增长很多,那么您可能希望使实现与数据库(或其他形式的持久性)进行交互。
这是否会为您的问题增添一些亮点?添加更多细节,如果可以,我会提供更多见解。
希望它有所帮助。
修改强>
分布式存储系统提供了相当多的变量。
您是否有一个集中式端点,然后选择以某种方式存储数据的位置(循环法或更复杂的算法)?
客户如何与您的系统互动?它是一个基于网络的系统,RMI,还有什么?
我认为在考虑实际实现之前,您需要关注基础架构,因为像这样的系统的主要问题是鲁棒性和处理缺陷。
一种可能性是拥有一个“名称服务器”,它知道数据的存储位置(基本上它具有密钥到“存储服务器”的映射),以及其他数据实际持久存储的服务器。你需要选择它们之间的通信方式,或者每个服务器都是“名称服务器”和“存储服务器”......这里有很多可能性!
答案 2 :(得分:0)
不确定你在这里问的是什么,但我假设你希望客户端实现一个接口并远程调用一个也实现接口的服务器。以下是我的想法:
您需要选择远程技术。 RMI是一个简单的选择。某种HTTP客户端/服务器是另一种可能性。这是一个simple UDP client/server。以下是some more ideas。
在服务器上,您必须对数据执行某些操作。一个显而易见的方法就是拥有一个本地内存HashMap
。使用像H2之类的SQL数据库将是一种简单的方法来保持它。 Berkeley DB JE是另一个。
问题中最困难的部分是弄清楚你将如何以某种方式分发请求。您可以在客户端上获取hashCode()
值并在服务器之间划分哈希空间。例如,您可以使用hashCode()
整数并根据服务器数量对其进行修改。该值将是发送给它的服务器。如果服务器数量发生变化,那么您将需要重新修改所有内容。您可以将put
请求发送到随机服务器,然后将所有get
请求发送到所有服务器并等待所有响应。这需要一些线程,除非你按顺序进行。