Skip to content

一、概述

​ Apache的CouchDB是一个免费的开源的数据库.,CouchDB采用json格式数据做数据存储 官网

其主要特点:

	1.schema free  (不需要提前设计表)
	2.documented oriented , json structure data(面向文档)
	3.high concurrent  (高并发)
	4.RESTful HTTP API (restful 风格的http请求形式的API)
	5.Javascript powered MapReduce (基于javascript 实现的 MapReduce)
	6.N-Master Repilication (多节点同步复制)
	7.Robust Strorage ( 可靠的健壮的数据存储)

二、操作Demo

目前市面上主流的 用来 操作 CouchDB的 java客户端 类库

java-cloudant. (来自于 IBM 公司)

Ektorp (也是一个开源的 类库)

LightCouch (API 容易上手, 好用)

CouchRepository (spring data 仓库中提供的 操作CouchDB), 但是内部也还是使用 的 Ertorp或者 LightCouch。

使用LightCouch 示例:

依赖

xml
<dependency>
    <groupId>org.lightcouch</groupId>
    <artifactId>lightcouch</artifactId>
    <version>0.2.0</version>
</dependency>

配置

couchdb.properties

properties
couchdb.name=mydb2
couchdb.createdb.if-not-exist=true
couchdb.protocol=http
couchdb.host=127.0.0.1
couchdb.port=5984
couchdb.username=admin
couchdb.password=abc
# LightCouch


<NolebasePageProperties />




log4j.logger.org.lightcouch=info

保存

java
/**
 *   保存
 *
 */
@Test
public  void testSave(){
    System.out.println("testSave");
    CouchDbClient couchDbClient = new CouchDbClient();
    Student student = new Student("李喜",29);

        // 保存
    couchDbClient.save(student);

    couchDbClient.shutdown();


}

删除

java
/**
 *   删除操作
 *
 */

@Test
public  void testDelete(){

    System.out.println("testDelete  === 删除 ==");
    CouchDbClient couchDbClient = new CouchDbClient();

    Student student = new Student("李喜",29);

    //指定 _id的值
    student.set_id("b21fdc1ddd064eaabbaf21ea70018549");

    //指定 _re v的值
    student.set_rev("1-d73c4e01a084a19abff87a9381f29e4b");

    couchDbClient.remove(student);
    couchDbClient.shutdown();

}

更新

java
@Test
public void testUpdate(){

    CouchDbClient couchDbClient = new CouchDbClient();

    Student stu = couchDbClient.find(Student.class, "58d92992c44e40d5fe237bcce8007943");

    System.out.println("stu:"+ stu);

    stu.setAge(30);

    couchDbClient.update(stu);

}

查询

java
/**
 *    满足条件的查询
 *
 */
@Test
public  void testFindMatchedDocs(){

    System.out.println("testFindMatchedDocs");

    CouchDbClient couchDbClient = new CouchDbClient();

    String json = "{\"selector\":{\"city\":\"武汉\",\"age\":{\"$gt\": 19}}}"

    List<Student> docs = couchDbClient.findDocs(json, Student.class);

    for (Student student : docs) {
        System.out.println(student);
    }

    System.out.println(docs.size());


}

view查询

java
/**
 *    使用 view 做查询
 *
 */
@Test
public  void test41(){

    System.out.println("test41  === 条件 查询 满足条件的 , 使用 view 快速查询   ==");


    CouchDbClient couchDbClient = new CouchDbClient();


//        View view = couchDbClient.view("_design/myDesignDoc/view/prices");
    View view = couchDbClient
                .view("myDesignDoc/prices")
                .includeDocs(true)
                .limit(3).descending(true);

    List<Fruit> list = view.query(Fruit.class);
    
    ViewResult<JsonArray, String, Fruit> viewResult = view.queryView(JsonArray.class, String.class, Fruit.class);

        List<ViewResult<JsonArray, String, Fruit>.Rows> rows = viewResult.getRows();

        for (ViewResult<JsonArray, String, Fruit>.Rows row : rows) {

            JsonArray key = row.getKey();
            String value = row.getValue();
            Fruit doc = row.getDoc();
        }

        System.out.println(view);

    System.out.println(list.size()+"========");

    System.out.println(view);


}

三、命令操作

sh
// 如下表示发出一个 http都 PUT 请求,在couchDB中表示创建数据库
// 如下表示创建一个叫做 baseball 的数据库

Restful HTTP API 接口规范
  新增 : POST 请求
  修改 : PUT  请求
  删除 : DELETE 请求
  查找 : GET 请求  
  

// ===========创建数据库===================
curl -X PUT http://admin:abc@127.0.0.1:5984/baseball

//CouchDB如果返回 如下 json 数据,表示创建成功
{"ok":true}

// ===========查询已经创建的数据库===========
//再次使用 之前的命令 
curl -X GET http://admin:abc@127.0.0.1:5984/_all_dbs

// 可以看到 多了一个  数据库
["_replicator","_users""baseball"]

// ===========删除数据库====================
curl -X DELETE http://admin:abc@127.0.0.1:5984/baseball

四、CouchDb的赋值

CouchDB的强项是 做数据库的同步复制。 这使得开发者可以在多个数据中心之间进行数据的分发,但同时在数据同步到客户端方面也容易。

​ 复制就需要有源和目的地,它们可以说在同样的couchDB实例中,也可以在不同的数据库实例中。 复制最终目标是在整个结束后,所有 在源数据库中 会使用到的文档会在 目的地数据库存在,所有在源数据库中删除的的文件也会在目的地数据库中删除。

4.1 瞬时复制和持久化复制

​ 在couchDB中来做复制有两种不同的是方式。 第一种在couchDB中存在的 是瞬时复制,这中复制意味着不会有文档的备份,在数据库服务器 重启后,这种瞬时的复制将会消失。 后来 _replicator数据库被引入进来来了,这种数据库 中的文档能够保存复制的参数,这样的复制称之为持久化复制。瞬时复制是做了向后兼容的。

这两种复制也都有不同的 复制状态。

4.2 触发,停止以及监控复制

持久化的复制是通过 _replicator 数据库来控制的,每个文档描述 来一个复制进程,具体的可以参考 复制的设置 。 如果想建立一个瞬时的复制,那么可以在api的最后 通过 /__replicate 来实现。开启复制可以通过发送一个 json格式的数据, 给 _replicate 保存这 个json格式的数据到 _replicator数据库中。

​ 如果一个复制正在运行着,那么它的状态我们可以通过 active task api 来进行 监测。 这个部分可以参考

/_active_tasks , Replication Status 以及 /_scheduler/jobs 。

​ 基于文档的复制, /_scheduler/docs 能够获得非常全面的状态信息。 这个api是非常受欢迎的,因为 它能在复制文档的工作开始前就给我们展示复制文档的状态。

​ 对于瞬时的复制,是没有办法查询到这个复制工作是不是完成的。

​ 对于一个复制可以通过删除文档 , 或者更新 它的cancel 属性的值为true, 来停止复制工作。

五、View

在传统的关系型数据库中, 如果要去查询某些特定的文档的时候,可以使用 select 这样的关键字去做数据库的查询。 但是在 CouchDB中, 提供了一个 View 视图,可以做高效的查询,并且在查询的时候,可以指定好查询的规则。 CouchDB中的 View 视图与 关系型数据库中的 View 视图是完全不同的。

​ CouchDB中的 View 视图内部 是map -reduce 来实现高效的查询的,这个map-reduce 是通过 JavaScript来实现的。 map是映射的过程(也就是你指定规则), reduce是 计算,拿到结果。

5.1 View实现高效查询

在创建View的时候,会涉及到 map 和reduce 过程, map 的过程中,必须要指定一个 key ,以及一个value。 指定了key, CouchDB就会基于这里的key 建立 ==索引== ,这种 key 是 以B-tree这种数据结构来保存的,根据key 创建索引去做排序,B-tree支部会被创建一次,当查询过一个视图后,以后所有的查询都会去读取这个 B-tree(实际上是底层是B+tree), 而不会重复执行 map 函数。 当改变原来的文档, 或者增加来一个文档,或者删除了一个文档的时候, CouchDB会非常聪明的找到 由 对应的文档 产生的那一列,把对应的做标记,旧的不会再在视图中显示出来, 会显示新的数据。

​ 原始数据--- map- -传指定的 key 去建立索引--reduce

​ 国外的这样的一个网站来演示一下 B+tree数据结构。

https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

六、安装

6.1 常规安装

在官网下载安装后,需要进行如下配置:

首先启动 couchDB,打开浏览器访问http://127.0.0.1:5984/_utils/#setup

配置节点模式(单节点/集群)

创建用户。

图形化管理:

Fauxton是 CouchDB 中 自带的 图形化界面的 操作工具,它可以让你去完成 对CouchDB的各种操作,由于是图形化界面的,所以学习起来非常容易上手。

​ 如下路径可以访问到 Fauxton 。

http://127.0.0.1:5984/_utils/