一、概述
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 示例:
依赖
<dependency>
<groupId>org.lightcouch</groupId>
<artifactId>lightcouch</artifactId>
<version>0.2.0</version>
</dependency>配置
couchdb.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保存
/**
* 保存
*
*/
@Test
public void testSave(){
System.out.println("testSave");
CouchDbClient couchDbClient = new CouchDbClient();
Student student = new Student("李喜",29);
// 保存
couchDbClient.save(student);
couchDbClient.shutdown();
}删除
/**
* 删除操作
*
*/
@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();
}更新
@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);
}查询
/**
* 满足条件的查询
*
*/
@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查询
/**
* 使用 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);
}三、命令操作
// 如下表示发出一个 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 。