0
我工作的一個開源Redis的樣內存緩存API:http://bit.ly/XVfpRX設置<Tuple>不能正常增加值
誰能幫我分析一下,爲什麼這個代碼是爲String field
和String value
變量得到一個錯誤的值:
public Long hset(String key, String field, String value) {
System.out.println("HSET key="+key+" field=" + field + " value="+value);
try {
boolean exist = exists(key);
if(exist){
Set<Tuple<String,String>> hash = (Set<Tuple<String,String>>) memget(key);
Iterator<Tuple<String, String>> it = hash.iterator();
while (it.hasNext()){
Tuple<String, String> t = it.next();
if (t.getFirst().equals(field)){
System.out.println("HSET Removing field=" + t.getFirst() + " value="+t.getSecond());
hash.remove(t);
hash.add(new Tuple<String, String>(field, value));
}
}
memset(key, hash);
return 0L;
} else {
Set<Tuple<String,String>> hash = new HashSet<Tuple<String,String>>();
System.out.println("Adding new tuple key="+key+" field=" + field + " value="+value);
hash.add(new Tuple<String, String>(field, value));
memset(key, hash);
return 1L;
}
} catch(Exception e) { // ClassCastException and NPE
// What to do when CCE is encountered?
Set<Tuple<String,String>> hash = new HashSet<Tuple<String,String>>();
hash.add(new Tuple<String, String>(field, value));
memset(key, hash);
}
return 1L;
}
下面是測試日誌:
Start hset tests
HSET key=null field=null value=null
Adding new tuple key=null field=null value=null
MEMSET key=null value=[Tuple [first=null, second=null]]
HSET key=foo field=foo value=bar
Adding new tuple key=foo field=foo value=bar
MEMSET key=foo value=[Tuple [first=foo, second=bar]]
HSET key=foo field=bar value=foobar
MEMSET key=foo value=[Tuple [first=foo, second=bar]]
HSET key=user:1 field=uname value=foo
Adding new tuple key=user:1 field=uname value=foo
MEMSET key=user:1 value=[Tuple [first=uname, second=foo]]
HSET key=user:1 field=fname value=Bar
MEMSET key=user:1 value=[Tuple [first=uname, second=foo]]
HSET key=user:1 field=uname value=bar
HSET Removing field=uname value=foo
MEMSET key=user:1 value=[Tuple [first=uname, second=bar]]
而且有實際的JUnit測試:
@Test
public void testHset() {
System.out.println("Start hset tests");
Long ret = lingo.hset(key, null, value);
assertEquals(1L, ret.longValue());
ret = lingo.hset("foo", "foo", "bar");
assertEquals(1L, ret.longValue());
ret = lingo.hset("foo", "bar", "foobar");
assertEquals(0L, ret.longValue());
ret = lingo.hset("user:1", "uname", "foo");
assertEquals(1L, ret.longValue());
ret = lingo.hset("user:1", "fname", "Bar");
assertEquals(0L, ret.longValue());
ret = lingo.hset("user:1", "uname", "bar");
assertEquals(0L, ret.longValue());
String username = lingo.hget("user:1", "uname");
String firstname = lingo.hget("user:1", "fname");
assertEquals("bar", username);
assertEquals("Bar", firstname);
System.out.println("End hset tests");
}
問題區域是這樣的:
HSET key=foo field=bar value=foobar
MEMSET key=foo value=[Tuple [first=foo, second=bar]]
和此:
HSET key=user:1 field=fname value=Bar
MEMSET key=user:1 value=[Tuple [first=uname, second=foo]]
的字段和值傳播到memset的(這是GAE內存緩存鍵值包裝方法放)是錯誤的。
The Tuple code can be found here。
更新(新增hget法):
public String hget(String key, String field) {
try {
boolean exist = exists(key);
if(exist){
Set<Tuple<String,String>> hash = (Set<Tuple<String,String>>) memget(key);
Iterator<Tuple<String, String>> it = hash.iterator();
while (it.hasNext()){
Tuple<String, String> t = it.next();
if (t.getFirst().equals(field)){
return t.getSecond();
}
}
}
} catch(Exception e) { // ClassCastException and NPE
// What to do when CCE is encountered?
}
return "nil";
}
不,我剛剛從Jasig門戶代碼中拿到了這個:http://grepcode.com/file_/repo1.maven.org/maven2/org.jasig.portal/uportal-war/4.0.9.1/org/jasig /portal/utils/Tuple.java/?v=source – xybrek 2013-04-24 23:12:29
你確定他們正確地覆蓋了這些方法嗎? – duffymo 2013-04-24 23:14:40
我能找回一個集哈希序列化到我的hget/memget方法中的Memcache ...所以我真的覺得這個混淆 –
xybrek
2013-04-24 23:17:29