我遇到 memcache 取不出来的情况了。
memcache mc=
我在一个模块里面放入mc.put(key,value,timeout),
在另外一个模块里面从mc里面取。这个两个都是单独的java程序,可以用bat命令启动的。
写入程序放进去了。但是读取程序取不出来。
而在同一个应用模块,能够存取。
高手们有没有遇到过?
以下是mc的源码。在两个程序块中,都用的同一个
package com.alisoft.sme.memcached;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemCachedManager {
// 创建全局的唯一实例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCachedManager memCachedManager = new MemCachedManager();
// 设置与缓存服务器的连接池
static {
// 服务器列表和其权重
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
// 获取socke连接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers(servers);
pool.setWeights(weights);
// 设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6);
// 设置主线程的睡眠时间
pool.setMaintSleep(30);
// 设置TCP的参数,连接超时等
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setSocketConnectTO(0);
// 初始化连接池
pool.initialize();
// 压缩设置,超过指定大小(单位为K)的数据都会被压缩
mcc.setCompressEnable(true);
mcc.setCompressThreshold(64 * 1024);
}
/**
* 保护型构造方法,不允许实例化!
*
*/
protected MemCachedManager() {
}
/**
* 获取唯一实例.
*
* @return
*/
public static MemCachedManager getInstance() {
return memCachedManager;
}
/**
* 添加一个指定的值到缓存中.
*
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value) {
return mcc.add(key, value);
}
public boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
public boolean replace(String key, Object value) {
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
}
/**
* 根据指定的关键字获取对象.
*
* @param key
* @return
*/
public Object get(String key) {
return mcc.get(key);
}
public static void main(String[] args) {
MemCachedManager cache = MemCachedManager.getInstance();
cache.add("hello", 234);
System.out.print("get value : " + cache.get("hello"));
}
}
下面的是value里面的对象。两个模块也是同一个
package com.alisoft.sme.memcached;
import java.io.Serializable;
public class TBean implements Serializable {
private static final long serialVersionUID = 1945562032261336919L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
浪费了很多时间以后,换成了redis。问题圆满解决。
没人回答,自己顶顶。
我在一个单独的java应用程序里面,写入对象到memcache。
读取的时候,是在tomcat底下的一个http接口里面。memcache采用spring注入的方式。
当有数据访问这个http接口时,需要从mc里面取数。
现在这个mc每次读取都是空的。
经查找后发现,memcache内的东西,如果在两个程序里面访问。它的内部存储地址是不同的。
因此,在取数时,需要循环所有的item。但是,虽然能循环出所有key了。却取不到value里面的对象。
MemCachedClient cache = new MemCachedClient();
Map items=cache.statsItems();
Iterator it=items.keySet().iterator();
while(it.hasNext())
{
String tmpserver=it.next().toString();
Map itemNames = (Map) items.get(tmpserver);
Iterator itemNameItr = itemNames.keySet().iterator();
while (itemNameItr.hasNext())
{
String itemName = itemNameItr.next().toString();//items:1:number
String[] itemAtt = itemName.split(":");
if (itemAtt[2].startsWith("number"))
{
Map chcheDump = cache.statsCacheDump(new String[]{tmpserver},Integer.parseInt(itemAtt[1]),0);//statsCacheDump(Integer.parseInt(itemAtt[1]));//stats cachedump 0;
Iterator itr = chcheDump.keySet().iterator();
while (itr.hasNext())
{
String serverInfo2 = itr.next().toString();
Map items2 = (Map) chcheDump.get(serverInfo2);
Iterator keyItr = items2.keySet().iterator();
while (keyItr.hasNext())
{
String key = keyItr.next().toString();
System.out.println("最终的key: "+key);
if(mckey.equals(key))
{
MemcachedItem abc= cache.gets(mckey);//这里其实是调用的cmd命令的gets key 命令
Object obj=abc.value;//这里现在取不出来
}
}
}
}
}
}