我想在我的Web应用程序中使用缓存,该缓存和分发也是如此.
我在小型Web应用程序中分别使用了EHCache和MemCache.
谷歌搜索并得到关于两者的混合评论,因此希望得到一些帮助和强大的功能,所以我可以决定哪个框架适合我的Web应用程序.
如果需要进一步的细节,请告诉我.
谢谢 !!
我添加了Java opts -Dnet.spy.log.LoggerImpl = net.spy.memcached.compat.log.SLF4JLogger来设置spymemcached以使用slf4j作为记录器.但我在tomcat6日志中收到以下警告,我对错误感到困惑
net.spy.memcached.compat.log.SLF4JLogger not found while initializing net.spy.compat.log.LoggerFactory java.lang.ClassNotFoundException: net.spy.memcached.compat.log.SLF4JLogger
Run Code Online (Sandbox Code Playgroud)
怎么可能找不到类SLF4JLogger.初始化LoggerFactory意味着net.spy包可用,更常见的是间谍memcache jar可用.那怎么可能找不到其他班级呢.
log4j: setFile ended log4j: Adding appender named [SecurityAuditAppender] to category [SecurityAuditLogger]. Warning: net.spy.memcached.compat.log.SLF4JLogger not found while initializing net.spy.compat.log.LoggerFactory java.lang.ClassNotFoundException: net.spy.memcached.compat.log.SLF4JLogger
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1680)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:191)
at net.spy.memcached.compat.log.LoggerFactory.getConstructor(LoggerFactory.java:131)
at net.spy.memcached.compat.log.LoggerFactory.getNewInstance(LoggerFactory.java:115)
at net.spy.memcached.compat.log.LoggerFactory.internalGetLogger(LoggerFactory.java:98)
at net.spy.memcached.compat.log.LoggerFactory.getLogger(LoggerFactory.java:87)
at net.spy.memcached.compat.log.LoggerFactory.getLogger(LoggerFactory.java:73)
at net.spy.memcached.compat.SpyThread.getLogger(SpyThread.java:60)
at net.spy.memcached.MemcachedConnection.createConnections(MemcachedConnection.java:152)
at net.spy.memcached.MemcachedConnection.<init>(MemcachedConnection.java:128)
at net.spy.memcached.DefaultConnectionFactory.createConnection(DefaultConnectionFactory.java:176)
at net.spy.memcached.MemcachedClient.<init>(MemcachedClient.java:193)
at net.spy.memcached.spring.MemcachedClientFactoryBean.getObject(MemcachedClientFactoryBean.java:72)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102)
at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) …Run Code Online (Sandbox Code Playgroud) 我正在使用的API,spymemcached,基本上给出了
MemcachedClient memc = new MemCachedClient(new InetSocketAddress("host", port));
Run Code Online (Sandbox Code Playgroud)
它并没有真正给我一个connect()或isConnected()功能.API提供了一个DefaultConnectionFactory但最初看一下它看起来不像管理连接池的代码.有没有人知道如何在spymemcached或另一个Java memcached库中执行此操作?
更一般地说 - 使我的应用程序能够容忍丢失连接的最"道德"方法是什么?
我一直在测试spymemcached和xmemcached客户端.我一直试图在项目文档中找到答案,但它很差.
我的问题是关于打开,关闭和重用连接.我在一份文件中找到了这个:
客户端可以在不再需要它的任何时刻关闭连接.但请注意,鼓励客户端缓存其连接,而不是每次需要存储或检索数据时重新打开它们.缓存连接将消除与建立TCP连接相关的开销".
Spymemcached不提供连接池,所以每次创建MemcachedClient实例时我都在创建一个新连接吗?然后什么时候应该关闭连接?我应该为我的应用程序中的所有线程提供相同的实例,还是每次都创建一个新的线程?
xmemcached确实有一个连接池.在这种情况下,我应该关闭从池中获得的连接吗?
我正在使用spymemcached.我设置了几个项目.然后我运行一个PHP脚本,然而我无法使用php memcached获取所有这些项目.PHP-Memcached只能部分检索这些项目.
我无法改变php的哈希算法或分发策略.在我们的系统中,我们使用默认散列(根据php.net文档,这是jenkin的一次一个).并且分发策略是php-memcached的模数.我已经读过spymemcached使用一致性散列.有什么方法可以在spymemcached中使用模数散列.
换句话说,如何使spymemcached的set操作或任何其他存储操作与php-memcached的get操作兼容?
如果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");
}
Run Code Online (Sandbox Code Playgroud)
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'));
Run Code Online (Sandbox Code Playgroud) 我无法在Amazon Cloud上找到关于Memcached的好教程,而且我对这整个缓存事件都很陌生.我试图通过亚马逊的ElastiCache服务和spymemcached客户端使用memcached来实际进行memcached调用.
这就是我现在用Java做的事情:
try {
ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder();
MemcachedClient memcachedClient = new MemcachedClient(
connectionFactoryBuilder.build(),
AddrUtil.getAddresses("<beginning of cache node end point grabbed from AWS Console>.cache.amazonaws.com:11211"));
memcachedClient.set("test", 12, new Integer(12));
System.out.println(memcachedClient.get("test"));
} catch (IOException ioException) {
ioException.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
我尝试这个时得到的错误是:
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:414)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:278)
at net.spy.memcached.MemcachedClient.run(MemcachedClient.java:1981)
2012-02-01 19:25:35.415 WARN net.spy.memcached.MemcachedConnection: Closing, and reopening {QA sa=<node endpoint>.cache.amazonaws.com/184.73.64.56:11211, #Rops=0, #Wops=2, #iq=0, topRop=null, topWop=net.spy.memcached.protocol.ascii.StoreOperationImpl@be8c3e, toWrite=0, interested=0}, attempt 1.
net.spy.memcached.OperationTimeoutException: Timeout waiting for value
at net.spy.memcached.MemcachedClient.get(MemcachedClient.java:1142)
at …Run Code Online (Sandbox Code Playgroud) memcached amazon-web-services spymemcached amazon-elasticache
我正在使用 couchbase 人员v2.8.0提供的 spymemcached客户端库。安装的 memcached 服务器是 version 1.4.13。
memcached 的配置非常基本 > -m 64 -p 11211 -u memcache -l 127.0.0.1。
我能够使用客户端库正确获取、设置、删除请求。但是通过我的日志,我注意到来自 spymemcached 库的警告消息,如下所示 -
WARN net.spy.memcached.MemcachedConnection: Could not redistribute to another node, retrying primary node for ...
Run Code Online (Sandbox Code Playgroud)
如果不存在,我不确定为什么要尝试重定向到集群中的另一个节点。
我正在使用以下代码连接到缓存客户端 -
String address = 127.0.0.1:11211;
new MemcachedClient(new ConnectionFactoryBuilder().setDaemon(true).build(), AddrUtil.getAddresses(address));
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。
我虽然Spymemcached确实尝试在此连接丢失时重新建立与服务器的连接.
但我看到了不同的东西; 想知道我误解了什么或者我做错了什么.以下是一些示例代码:
MemcachedClient c=new MemcachedClient(AddrUtil.getAddresses("server:11211"));
while(true)
try {
System.out.println(c.get("hatsts"));
Thread.sleep(10000);
} catch(Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
它最初运行没有问题.然后我拉网络插头.随后,客户端检测到网络故障并抛出以下异常:
net.spy.memcached.OperationTimeoutException: Timeout waiting for value
Run Code Online (Sandbox Code Playgroud)
但是,当我重新建立网络时,客户端无法恢复并继续抛出异常; 甚至在5分钟后.我试过SpyMemcached 2.10.6和2.9.0.
我错过了什么?
我在netty中编写服务器,我需要调用memcached.我正在使用spymemcached,可以轻松地进行同步memcached调用.我希望这个memcached调用是异步的.那可能吗?netty提供的示例似乎没有帮助.
我尝试使用回调:ExecutorService在我的处理程序中创建了一个池,并向该池提交了一个回调工作程序.像这样:
公共类MyHandler扩展ChannelInboundMessageHandlerAdapter <MyPOJO>实现CallbackInterface {
Run Code Online (Sandbox Code Playgroud)... private static ExecutorService pool = Executors.newFixedThreadPool(20); @Override public void messageReceived(ChannelHandlerContext ctx, MyPOJO pojo) { ... CallingbackWorker worker = new CallingbackWorker(key, this); pool.submit(worker); ... } public void myCallback() { //get response this.ctx.nextOutboundMessageBuf().add(response); }}
CallingbackWorker 好像:
public class CallingbackWorker实现Callable {
Run Code Online (Sandbox Code Playgroud)public CallingbackWorker(String key, CallbackInterface c) { this.c = c; this.key = key; } public Object call() { //get value from key c.myCallback(value); }
然而,当我这样做,this.ctx.nextOutboundMessageBuf()在myCallback卡住.
总的来说,我的问题是:如何在Netty中进行异步memcached调用?
我使用spymemcached&HashAlgorithm.KETAMA_HASH连接到5个节点的memcached池.
我的理解是当我们使用一致的哈希算法时,例如,当一个节点关闭时,我们不需要担心,因为密钥将被重新分配(具有最小影响)
如果下行节点要加入池,该怎么办?我需要做什么?
我应该确保需要删除陈旧数据吗?或者我的程序是否需要针对此案例进行特殊处理?
spymemcached ×10
memcached ×9
java ×6
connection ×1
ehcache ×1
log4j ×1
netty ×1
php ×1
spring ×1