设置不能正常增加值

问题描述:

我工作的一个开源Redis的样内存缓存API:http://bit.ly/XVfpRX设置<Tuple>不能正常增加值

谁能帮我分析一下,为什么这个代码是为String fieldString 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的(这是G​​AE内存缓存键值包装方法放)是错误的。

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"; 
} 

你写Tuple类?

我的第一个想法是,你没有正确覆盖equalshashCode。 Joshua Bloch的Effective Java告诉你如何。

+0

不,我刚刚从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

+0

你确定他们正确地覆盖了这些方法吗? – duffymo 2013-04-24 23:14:40

+0

我能找回一个集哈希序列化到我的hget/memget方法中的Memcache ...所以我真的觉得这个混淆 – xybrek 2013-04-24 23:17:29