1.你可不可以通过一个KEY,VALUE为FORMIP,TOIP组装成一个字串
遍历memcached中所有的 key 是行的,看看下面这个方法
// memcache中的KEY遍历(当前slab)
// 一个SLAB中包含 多个dump
public static void keySet() {
Set<String> keys = new HashSet<String>();
Map<String, Integer> dumps = new HashMap<String, Integer>();
// 获取所有的slab(由服务器地址:端口号组成KEY,dump信息组成value)
Map slabs = getMemCachedClient().statsItems();
Iterator itemsItr = slabs.keySet().iterator();
// 用来收集所有slab的dump号
while (itemsItr.hasNext()) {
String server = itemsItr.next().toString();
Map itemNames = (Map) slabs.get(server);
System.out.println(itemNames);
Iterator itemNameItr = itemNames.keySet().iterator();
while (itemNameItr.hasNext()) {
String itemName = itemNameItr.next().toString();
String[] itemAtt = itemName.split(":");
// 如果是itemName中是:number来表示,那么证明是一个存储数据的dump,还有一些是age的部分
if (itemAtt[2].startsWith("number")) {
System.out.println(itemAtt[1] + " " + Integer.parseInt(itemAtt[1]));
// put dump区号
dumps.put(itemAtt[1], Integer.parseInt(itemAtt[1]));
}
}
}
// 根据收集到的dump来获取keys
if (!dumps.values().isEmpty()) {
Iterator<Integer> dumpIter = dumps.values().iterator();
while (dumpIter.hasNext()) {
int dump = dumpIter.next();
// statsCacheDump支持三个参数String[],int,int,第一个参数可以省略,默认填入null,表示从那些slab中获取dump号为第二个参数的keys,如果是null就从当前所有的slab中获取。
// 第二个参数表示dump号,第三个参数表示返回最多多少个结果。
// {127.0.0.1:11211={DD=[2 b; 1223911432 s], AA=[2 b; 1223911432 s], BB=[2 b; 1223911432 s]}}
Map cacheDump = getMemCachedClient().statsCacheDump(dump, 10);
System.out.println(cacheDump);
Iterator entryIter = cacheDump.values().iterator();
while (entryIter.hasNext()) {
Map items = (Map) entryIter.next();
Iterator ks = items.keySet().iterator();
while (ks.hasNext()) {
String k = (String) ks.next();
try {
// 这里为什么要作decode,因为其实在我使用的这个java客户端存储的时候,默认会把key都作encoding一次,所以必须要做,不然会出现问题。
k = URLDecoder.decode(k, "UTF-8");
// key 对应的VALUE是这个值的长度,过期时间
System.out.println(k);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
}