couchBase在java中使用的基本知识

  现如今nosql技术越来越流行,它的纯粹类似于map的key-value数据形式,是对关系数据库的一个很好的补充。它无法进行多表的关联查询,对数据的一致性维护也不好,但它能够高效的对数据库进行并发读写,更适合当今的web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站。

  而这里我研究的是couchbase,它是MemBase与couchDb的合并的产物,功能非常强大,而现在著名的draw something这个应用就是使用了couchbase来存储它少量的画图文件。couchbase的官网是 http://www.couchbase.com,它现在运行java、c#、php等多种常用语言,用户们可以在该网站下载server使用,里面还有官方文档。

   现在来说说java的使用

  连接couchbase:

  Java代码
  1. <span style="white-space: normal; background-color: #ffffff;">    List<URI> uris = new LinkedList<URI>();</span>  
  2.     // Connect to localhost or to the appropriate URI  
  3.     uris.add(URI.create("http://127.0.0.1:8091/pools"));  
  4.   
  5.     CouchbaseClient client = null;  
  6.     try {  
  7.       client = new CouchbaseClient(uris, "default""");  
  8.     } catch (Exception e) {  
  9.       System.err.println("Error connecting to Couchbase: "  
  10.         + e.getMessage());  
  11.       System.exit(0);  
  12.     }  

   这就连接了数据库,对数据的所有操作都使用client。

  其中 client = new CouchbaseClient(uris, "default", "");第一个参数是各个服用器的url(多服务器),default是默认的数据库名(当安装couchbase时会自动创建),第三个参数是该库的密码。default是数据库默认创建,没有密码。

  下面说下client的常用方法

  1. client.add(key, expiry, value) 添加一个key-value数据。expiry是该数据的失效时间,单位很秒,最大为30*24*60*60,即30天;如果为0,则表示该数据不会失效。
  2. client.get(key) 这就是通过key来查询value
  3. client.set(key, expiry, value) 相当于saveOrUpdate,如果该数据不存在,则添加;如果存在,则更新
  4. client.append(casunique, key, value) 为一个key,增加数据。当一个client添加了数据后,另一个client再调用append就可能会出现数据不一致的问题,所以要用casunique。casunique相当于版本,对一个key的value做任何修改都会改变这个key的casunique。所以要append时必须把版本加上来匹配。如果key当前的casunique为10,那么client.append(9, key, value)这种修改无效,必须是client.append(10, key, value)才可以。
  5. casunique可以用client.gets("e").getCas()来得到。
  6. client.cas(key, casunique, value) cas()方法相当于set方法,但使用了casunique,为了保持数据一致性。
  7. Java代码 
    1. CASResponse casr = client.cas("caskey", casvalue, "new string value");  
    2. if (casr.equals(CASResponse.OK)) {      
    3. System.out.println("Value was updated");  
    4. }  
    5. else if (casr.equals(CASResponse.NOT_FOUND)) {    System.out.println("Value is not found");}  
    6. else if (casr.equals(CASResponse.EXISTS)) {      
    7. System.out.println("Value exists, but CAS didn't match"  
    8. );  
     
  8. client.touch(key, expiry) 更新一个key的过期时间
  9. 如果key对应的value是数字,如果数字要相加,那么不能用append,因为append的相加是位运算,对数字来说是无法得到正常结果,所以可以使用client.incr(key, offset),offset是相加的值。
  10. client.incr(key, offset, default) 在上一个方法中,如果没有相应的key,value也没有值。而在这个方法中,如果没有相应的key,则他创建该key,value为default(注意,第一个调用这个方法创建key是,value并不会加上offset)。
  11. client还有一个decr方法用来对value为数字的key做递减,但我发现incr方法中如果offset为负数也能做递减,而decr在使用中却出了问题,并不能真正的对数字递减,这个功能先保留,以后再好好看。

posted on 2013-07-24 17:19  yueqy  阅读(1523)  评论(0)    收藏  举报

导航