0

你好有以下界面:

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) {
    }
}

如何实现客户端以与给定接口交互?我想用客户端-服务器架构来做到这一点。

我想要的另一件事是知道数据存储在哪里的“名称服务器”(基本上它具有到“存储服务器”的键映射),以及其他几个实际保存数据的服务器。

4

3 回答 3

1

最基本的实现是使用 internal Map,但这有点傻,为什么不首先使用 aMap呢?

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();
    }
}

所以我不确定这就是你想要的。你想要一个客户端-服务器架构吗?如果是这样,请在您的问题中清楚地提及它,并附上您想要的规格。

于 2011-12-14T17:26:39.250 回答
1

这是一个相当开放的问题。我会试一试。

我认为您需要牢记三个不同的概念:

接口实现客户端

让我们来看看每一个。您已经有了界面,所以这部分一切都很好。

您所称的客户端,我相信是实现,意思是:它是实现接口中定义的方法行为的实际代码。

客户端(在我的解释中)将是您系统中的另一个部分,它通过您将编写的实现与您的接口进行交互。

解决您的问题:第一步是弄清楚如何持久化通过 put 和 putAll 引入的数据。如果你只是想在内存中保留一些东西,那么 Map 可能就足够了。如果预计条目的数量会增加很多,那么您可能希望实现与数据库(或其他形式的持久性)交互。

这是否为您的问题增添了一些亮点?添加更多细节,如果可以的话,我会提供更多见解。

希望能帮助到你。

编辑:

分布式存储系统有很多变量。

您是否有一个集中的端点,然后以某种方式(循环或一些更复杂的算法)选择数据的存储位置?

客户将如何与您的系统交互?它是基于 Web 的系统、RMI 还是其他?

我认为在考虑实际实现之前,您需要关注基本架构,因为像这样的系统的主要问题是健壮性和处理缺陷。

一种可能性是拥有一个知道数据存储位置的“名称服务器”(基本上它具有到“存储服务器”的键映射),以及其他几个实际保存数据的服务器。您需要选择它们之间的通信方式,或者每个服务器是否既是“名称服务器”又是“存储服务器”......这里真的有很多可能性!

于 2011-12-14T17:28:05.017 回答
0

不确定您在这里问的是什么,但我假设您希望客户端实现一个接口并将调用远程调用到也实现该接口的服务器。以下是我的想法:

  1. 您需要选择一种远程技术。 RMI是一个简单的选择。某种 HTTP 客户端/服务器是另一种可能性。这是一个简单的 UDP 客户端/服务器。这里还有一些想法

  2. 在服务器上,您将不得不对数据做一些事情。一个明显的就是只有一个本地的 in-memory HashMap。使用像H2这样的 SQL 数据库将是一种持久化它的简单方法。 伯克利 DB JE是另一个。

  3. 问题中最困难的部分是弄清楚你将如何以某种方式分发请求。您可以在客户端获取hashCode()值并在服务器之间划分散列空间。例如,您可以取hashCode()整数并按服务器数量对其进行修改。该值将是将其发送到的服务器。如果服务器数量发生变化,那么不幸的是,您需要重新修改所有内容。您可以将put请求发送到随机服务器,然后将所有get请求发送到所有服务器并等待所有响应。但是,除非您连续执行此操作,否则这需要一些线程。

于 2011-12-14T21:41:55.857 回答