【问题标题】:Do memcache clients of different languages hash the same way?不同语言的 memcache 客户端是否以相同的方式散列?
【发布时间】:2010-10-28 02:10:00
【问题描述】:

我们想在 Java 应用程序中进行一些处理,将结果存储在我们的 memcache 服务器池中,然后使用 PHP 中的 memcache 将其读回。

这很容易尝试,但我想问问有没有其他人这样做过。

只要 Java 和 PHP 客户端都连接到同一个内存缓存服务器池,这两个客户端是否会散列到同一个服务器位置,从而可以从 PHP 进行检索?

【问题讨论】:

  • 这样做对我来说似乎是个坏主意......
  • +1 很好的问题。馊主意?一点也不。拆分语言环境是一种非常常见的场景。
  • 您能详细说明一下吗?从概念上讲,您只是将数据从 2 种不同的语言写入内存中的某个位置......与从 2 种不同的语言写入同一个数据库没有什么不同。
  • @PAS:使用单个memcached服务器时应该没有任何问题;但是当您使用多台服务器时,通常的方法是首先对密钥进行简单的哈希来选择服务器。这使您无需在服务器上使用任何特殊代码即可分发数据和加载。但这也意味着不同的客户端实现可以为同一个密钥选择不同的服务器。
  • 哈维尔:这正是他问这个问题的原因:)

标签: java php memcached


【解决方案1】:

没有。并非所有客户端都以相同的方式散列。作为证据,您会看到一些客户端提供“一致哈希”,而另一些则不提供。

简而言之,memcached 客户端可以使用他们喜欢的任何散列算法。没有官方标准。

PHP 客户端支持a variety of hashing algorithms——因此可以将其配置为使用您的 Java 库使用的相同算法(看起来有几种算法——您使用的是哪一种?)。但显然,您需要进行大量测试。

【讨论】:

  • 嗯,很有趣 - 特别是 Java 和 PHP 呢?
【解决方案2】:

允许跨语言访问的另一种可能性是不依赖于语言序列化,而是以 JSON 格式存储对象,作为文本字符串。

就个人而言,我在 Java 中使用 Gson,在 PHP 中使用 json_encode、json_decode。

【讨论】:

  • 谢谢 - 是的,这是问题的另一部分,但首先您需要确保所有客户端都以相同的方式散列,以便您只存储一次数据。
  • 啊,是的,当然,关键.. 好吧,我还没有尝试 PHP memcached,但是使用 Java,当您将对象放入缓存中时,您会明确地给它一个名称,例如如果我说一个 ID 为 232 的 Person 类型的对象,我会称键为“Person-232”。如果您愿意,您可以在应用程序名称前添加“YourApp-Person-232”并使用 SHA1 或 MD5 对所有内容进行哈希处理。以下是如何生成与 PHP 相同的 Java SHA1:stackoverflow.com/questions/4769007/…
【解决方案3】:

pylibmc

import pylibmc

mc = pylibmc.Client(["127.0.0.1"], binary=True,
                   behaviors={"tcp_nodelay": True,
                               "ketama": True})

key="someKey"
i=0
while True:
    #mc.set(key, str(i))
    value = mc.get(key)
    print(value)
    sleep(1)
    i+=1

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2018-06-17
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2015-06-18
    • 2014-03-28
    相关资源
    最近更新 更多