gpt4 book ai didi

java - 无法使用 php memcached 获取使用 spymemcached 设置的项目

转载 作者:可可西里 更新时间:2023-11-01 12:31:22 25 4
gpt4 key购买 nike

我正在使用 spymemcached。我设置了几个项目。然后我运行一个 php 脚本,但是我无法使用 php memcached 获取所有这些项目。 PHP-Memcached 只能部分检索这些项目。

我无法更改 php 的散列算法或分发策略。在我们的系统中,我们使用默认散列(根据 php.net 文档,这是 jenkin 的一次一个)。分配策略是 php-memcached 的模数。我读过 spymemcached 使用一致的散列。有什么方法可以在 spymemcached 中使用模哈希。

换句话说,我怎样才能使 spymemcached 的设置操作或任何其他存储操作与 php-memcached 的获取操作兼容?

如果 spymemcached 无法做到这一点,java 中是否有任何其他 memcached 客户端允许我这样做?

帮助不仅会受到赞赏,还会得到赏金。

Java代码:

public static void main(String [] args) {
List<InetSocketAddress> addrs = new ArrayList<>();
addrs.add(new InetSocketAddress("10.90.12.87", 11211));
addrs.add(new InetSocketAddress("10.90.12.87", 11311));
try {
MemcachedClient memcache = new MemcachedClient(addrs);
memcache.add("foo", 0, "bar");
memcache.add("sample", 0, "key");
memcache.add("try", 0, "another");
memcache.add("ax-spadg-list", 0, "3045,6645");
} catch (IOException ex) {
Logger.getLogger(CategoryDataOperator.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Done");
}

PHP代码:

<?php
$mem = new Memcached();
$mem->addServer('10.90.12.87', 11211);
$mem->addServer('10.90.12.87', 11311);
var_dump $mem->get('foo');
var_dump($mem->get('try'));
var_dump($mem->get('sample'));
var_dump($mem->get('ax-spadg-list'));

最佳答案

问题是关于Hash的,默认的php-memcached hash是

(Jenkins one-at-a-time) item key hashing algorithm

而 spymemcached 哈希列表是:

  • NATIVE_HASH:只是 Native hash (String.hashCode()). 与默认的 php-memcached Memcached::HASH_DEFAULT 不匹配/li>
  • CRC_HASH => Memcached::HASH_CRC
  • FNV1_64_HASH => Memcached::HASH_FNV1_64
  • FNV1A_64_HASH => Memcached::HASH_FNV1A_64
  • FNV1_32_HASH => Memcached::HASH_FNV1_32
  • FNV1A_32_HASH => Memcached::HASH_FNV1A_32
  • KETAMA_HASH => “ketama 使用的基于 MD5 的哈希算法。”所以也许 Memcached::HASH_MD5 但无论如何都不是 Memcached::HASH_DEFAULT

因此,如果您不能更改 PHP 客户端配置或扩展 spymemcached 库,则两个库之间不会直接匹配。

解决方案 1:如果您查看 history (你可以有一个 php 客户端哈希修改的例子)。

解决方案 2:否则您可以创建一个 JenkinHash 类(我复制了 Xmemcached 代码:https://code.google.com/p/xmemcached/source/browse/trunk/src/main/java/net/rubyeye/xmemcached/HashAlgorithm.java?r=801#176 [但要考虑 Xmemcached 许可证并将作者/许可证保留在源代码中] )

import net.spy.memcached.HashAlgorithm;

import java.io.UnsupportedEncodingException;

public class JenkinsHash implements HashAlgorithm {
@Override
public long hash(String k) {
try {
int hash = 0;
for (byte bt : k.getBytes("utf-8")) {
hash += (bt & 0xFF);
hash += (hash << 10);
hash ^= (hash >>> 6);
}
hash += (hash << 3);
hash ^= (hash >>> 11);
hash += (hash << 15);
return hash;
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("Hash function error", e);
}
}
}

然后:

import net.spy.memcached.*;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

public static void main(String[] args) throws IOException {
List<InetSocketAddress> addrs = new ArrayList<InetSocketAddress>();
addrs.add(new InetSocketAddress("127.0.0.1", 11211));
addrs.add(new InetSocketAddress("172.28.29.22", 11211));
try {
ConnectionFactory connectionFactory = new ConnectionFactoryBuilder()
.setProtocol(ConnectionFactoryBuilder.Protocol.TEXT)
.setHashAlg(new JenkinsHash())
.setLocatorType(ConnectionFactoryBuilder.Locator.ARRAY_MOD).build();
MemcachedClient memcache = new MemcachedClient(connectionFactory, addrs);
memcache.add("foo", 0, "bar2");
memcache.add("sample", 0, "key");
memcache.add("try", 0, "another");
memcache.add("ax-spadg-list", 0, "3045,6645");
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("Done");
}
}

使用 php 脚本:

<?php

$memcached = new Memcached();
$memcached->addserver('127.0.0.1', 11211);
$memcached->addserver('172.28.29.22', 11211);
var_dump($memcached->get('foo'));
var_dump($memcached->get('try'));
var_dump($memcached->get('sample'));
var_dump($memcached->get('ax-spadg-list'));

测试:

$ echo "flush_all" | nc 172.28.29.22 11211 && echo "flush_all" | nc 127.0.0.1 11211
OK
OK
$ php mem.php
bool(false)
bool(false)
bool(false)
bool(false)

RUN JAVA

$ php mem.php
string(4) "bar2"
string(7) "another"
string(3) "key"
string(9) "3045,6645"

解决方案 3: 使用 https://code.google.com/p/xmemcached/使用 ONE_AT_A_TIME 哈希算法

import net.rubyeye.xmemcached.HashAlgorithm;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.impl.ArrayMemcachedSessionLocator;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;

public class Main {

public static void main(String[] args) throws IOException, InterruptedException, MemcachedException, TimeoutException {
List<InetSocketAddress> addrs = new ArrayList<InetSocketAddress>();
addrs.add(new InetSocketAddress("127.0.0.1", 11211));
addrs.add(new InetSocketAddress("172.28.29.22", 11211));
MemcachedClientBuilder builder = new XMemcachedClientBuilder(addrs);
builder.setSessionLocator(new ArrayMemcachedSessionLocator(HashAlgorithm.ONE_AT_A_TIME));
MemcachedClient memcachedClient = builder.build();
memcachedClient.set("foo", 0, "bar2");
memcachedClient.set("sample", 0, "key");
memcachedClient.set("try", 0, "another");
memcachedClient.set("ax-spadg-list", 0, "3045,6645");
memcachedClient.shutdown();
System.out.println("Done");
}
}

关于java - 无法使用 php memcached 获取使用 spymemcached 设置的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19008990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com