1. 关系型数据库
1) ACID,是指在数据库管理系统(DBMS)中事务所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
在数据库系统中,一个事务是指由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。
原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。
目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
2) 范式
http://www.cnblogs.com/zhhh/archive/2011/04/21/2023355.html
2. 非关系型数据库
CAP法则
http://www.searchdatabase.com.cn/showcontent_44918.htm
http://sebug.net/paper/databases/nosql/Nosql.html
3. MongoDB
最终一致性(弱一致性)
高可用性
分区容忍性
提高一致性的办法:
在Mongodb中如果客服端想写数据到Mongodb集群中为了确保我们能把数据写到大部分服务器上我们必须做一下设置:
在Mongodb客服端命令行下运行:db.runCommand( { getlasterror : 1 , w : 2 } ),该命令表示我们在写数据到mongodb中时必须把数据复制到2台服务器上才会返回结果,getlasterror表示当在进行数据写入时返回的错误。db.runCommand( { getlasterror : 1 , w : "majority" } )majority用来表示数据要被写入到一半以上的服务器上才会返回结果.在java驱动api中我们使用下面的代码来设定和上面一样的操作:
Mongo mongo = new Mongo(address);
mongo.setWriteConcern(WriteConcern.REPLICAS_SAFE);//表示写入数据到一半以上的服务器上
在java驱动的api中的WriteConcern里还有很多的参数可以设置比如(写入数据超时时间等)
Mongo的查询环境是个类似node.js 或者 chrome V8的javascript 解析引擎,因此基本的javascript语句、语法都可以使用。
CRUD:
增
insert ssss ()values()
db.表名.insert({
name:"张三"
, age:20
});
批量增:
for(var i=0; i<10; i++){
db.p2.insert({
name:("张" + i)
, age:(i + 7)
, hobby:[1,2,3]
});
}
删
db.表名.remove() 删整张表
db.表名.remove({name:"张三"}) 删指定记录
改
整体改
var where = {name:"zhang2"};
var zhang3 = db.person.find(where );
zhang3.age=125;
db.person.update(where , zhang3);
指定字段改
var where = {name:"张三"};
var setData = {$set:{age:77}}; // 指定age为77 其他字段不动
db.表名.update(where , setData );
指定字段并自增
var where = {name:"张三"};
var setData = {$inc:{age:10}}; // 指定age在原有基础上增加10 其他字段不动
db.表名.update(where , setData );
upsert操作 mongodb特有操作
如果查询的对象存在,那么update,否则进行insert
var where = {name:"张5"};
var setData = {$inc:{age:32},$set:{name:"张武"}}; // 注意!更新数据中不能包含where条件的字段,否则不会insert,如果包含的话,字段必须是$set修饰
db.person.update(where , setData , true);
// 或者这样
var where = {name:"张5"};
var setData = {$inc:{age:32}};
db.person.update(where , setData , true);
批量更新
mongodb默认更新第一条,如果需要全表更新,那么update第四个参数设为true
查
db.表名.find(查询条件);
查询比较符:
SQL
MONGODB
EG
REMARK
=
无
{name:"张三"}
>
$gt
{age:{$gt:10}}
>=
$gte
{age:{$gte:10}}
<
$lt
{age:{$lt:10}}
<=
$lte
{age:{$lte:10}}
and
无
or
$or
{$or:[{age:{$lt:10}}, {age:{$gt:20}}]}
查询10岁以下或20岁以上
in
$in
{age:{$in:[10, 20, 31, 45]}}
not in
$nin
{age:{$nin:[10, 20, 31, 45]}}
如果需要再数组列上排序,需要给列加索引
如果排序是 {非数组列:1, 数组列:1} 这样那么要加联合索引
-------------------------------------------------------------------------------------
MongoDB 集群涉及的知识及实践
理论
1. 副本集(replSet),解决ha,可读写分离,单点当掉可自动切换到未当掉的节点(对应用来说是透明的),实现原理是paxos,可动态添加
2. 主从复制,解决ha,通过主库日志进行数据同步(官方已不推荐)
3. 数据分片,类似rdbms的分库分表策略,但对应用是透明的,需要设置合适的片键(分片依据),可解决大并发写操作
4. 部署策略可 replSet + sharding 水平扩展,大数据很给力
实践
建立集群:
1.创建configs服务器
mongod --dbpath "f:\mongodb\data\configs" --port 23017
2)创建mongos服务器 并指定依赖的配置服务器 (mongos依赖于配置服务器,mongos查询的分片信息都存储在configs中)
mongos --port 25017 --configdb 127.0.0.1:23017
3)创建多个分片服务器 (负责数据存储)(这里创建了两个服务器)
mongod --port 27017 --dbpath "f:\mongodb\data\dbs\shard27017"
mongod --port 27018 --dbpath "f:\mongodb\data\dbs\shard27018"
连接mongos 服务器 添加shard27017分片服务器到configs服务器中
>use admin
>db.runCommand({addshard:"127.0.0.1:27017",allowLocal:true}) //添加分片服务器,allowLocal 充许本地部署 默认情况不充许本地部署多个分片的
下面为分片服务器的test库foo集合设置分片以及分片shard key。
>db.runCommand({"enablesharding":"test"}) //对test库启用分片功能
注意:需要分片的集合 的shard key必须是索引键, (我们也可以在mongos为分片foo集合创建索引)
>db.runCommand({"shardcollection":"test.foo","key":{"name":1}}) //数字代表排序
至此自动分片就创建完成了,可以在mongos或configs服务器查询分片信息
查询分片信息:
1.在mongos中 use config
2.show collections
3.db.shards.find() 分片服务器信息
4.db.chunks.find() 分片信息
当需要移除分片时运行下面的命令,同时mongos路由会将此分片服务器上的信息移到其它分片上。
>db.runCommand({"removeshard":"127.0.0.1:27017"}
---------------------------------------------------------------------------------------
运维
官方的监控工具 MongoMMS
http://blog.nosqlfan.com/html/3171.html
---------------------------------------------------------------------------------------------
其他
两端提交模拟事务
http://cnodejs.org/topic/5070492b01d0b80148dc45f8
基于MongoDB的大规模高频金融交易数据处理
http://www.csdn.net/article/a/2011-11-26/308132
分享到:
相关推荐
本系统是本人初学MongoDb时所写,代码不是很完美,基本实现图书管理系统的增删改查等基本功能,目前尚有一处缺陷未解决——在查询后只能在控制台看到结果,没有反馈到界面上,有兴趣的朋友可以加以修改,相信这是一...
JAVA代码编写用于测试mongoDB数据库的简单程序,该程序实现对mongoDB数据库的增删改查功能,适用于初学mongoDB的童鞋学习使用,java程序连接mongoDB数据库所用到的jar包已在程序中包含,不需要另外下载,程序简单...
MongoDB8.0.1的安装与配置,对初学者而言可能会稍显复杂,但通过详细的安装教程和步骤指导,即使是数据库管理新手也能够顺利完成安装。安装教程中通常还会包括如何启动MongoDB服务、创建数据库、管理用户权限等基础...
总之,MongoDB和Compass是现代开发中非常重要的工具,无论你是初学者还是经验丰富的开发者,掌握它们的使用将极大地提升你在数据管理和开发上的效率。记得定期更新MongoDB以获取最新的安全修复和功能增强,同时保持...
Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一...对于初学者,这是一个很好的起点,可以快速上手MongoDB和Spring Data的使用。
MongoDB 是一种流行的开源NoSQL数据库,以其面向文档的数据模型、高性能、高可用性和高可扩展性而闻名...无论是初学者还是经验丰富的开发者,都需要掌握MongoDB的基础知识和操作技巧,以便在实际项目中充分利用其优势。
本书《mongodb入门》是一本旨在帮助初学者快速学习MongoDB基本用法的入门小书。它适合那些希望在短时间内掌握MongoDB核心概念和操作的读者。作者Karl Seguin是一位拥有丰富技术背景的开发者,其经历跨越多个领域和...
MongoDB是一种流行的开源、分布式、文档型数据库,它在处理大量数据时提供了高可用性和可扩展性。NoSQLBooster for MongoDB...无论是初学者还是经验丰富的开发者,都能从中受益,实现对MongoDB数据库的有效管理和优化。
总的来说,"MongoDB参考手册"是一份全面且深入的学习资源,无论你是初学者还是经验丰富的开发者,都能从中获益。通过学习这份手册,你将能够熟练掌握MongoDB的各项操作,更好地应对大数据时代的挑战。
对于初学者而言,虽然MongoDB的学习曲线相对陡峭,但是其社区活跃,文档详尽,以及各种第三方工具的支持,都大大降低了入门门槛。社区的活跃也意味着用户可以更容易地找到解决方案,获得帮助。 此外,MongoDB的生态...
10. **教学与学习资源**:对于初学者,这款工具还可能包含一些学习教程和帮助文档,有助于快速掌握MongoDB操作。 总之,NoSQL Manager for MongoDB中文版是MongoDB管理员和开发者的得力助手,它以用户友好的界面和...
总的来说,"C#\MongoDB应用开发实战"课程将带你逐步掌握使用C#与MongoDB进行交互的各项技能,无论你是初学者还是有经验的开发者,都能从中受益,提升你的MongoDB开发能力。通过实际项目练习和理论知识的结合,你将...
MongoDB是一种流行的开源、...对于初学者,建议从安装开始,逐步学习数据插入、查询、更新和删除,然后探索索引、聚合、事务等进阶主题。随着对MongoDB的熟练掌握,你将能够利用其强大功能构建高效、可扩展的应用程序。
"Mongodb入门教程、示例+Spring Boot完整示例+聚合" 本节课将完整地介绍 MongoDB 的入门教程、示例、Spring Boot 完整示例和聚合。 简介 NoSQL(Not Only SQL)是一种非关系型的数据库, MongoDB 是基于分布式...
无论你是初学者还是经验丰富的开发人员,这都将是一个非常有价值的资源。确保定期检查更新和补丁,以保持数据库的安全性和最佳性能。在使用Java和Spring构建应用程序时,利用提供的驱动和库可以极大地提高开发效率和...
这些资源可能是为了帮助初学者或有经验的开发者深入理解MongoDB的使用和功能。 描述中的“传智播客2015 php mogodb数据库讲解资料”表明这是一个针对PHP开发者的学习课程,内容可能涵盖了如何在PHP环境中使用...
MongoDB是一种流行的开源、分布式文档型数据库,以其灵活性、高性能和易用性而备受开发者青睐。...无论你是初学者还是经验丰富的开发者,这些资料都能帮助你更好地理解和利用MongoDB这一强大的数据库系统。
在这个“mongodb例子”中,我们很可能会找到一个简单的MongoDB数据库操作示例,这对于初学者来说是极好的学习资源。 MongoDB使用JSON格式的文档来存储数据,这种格式灵活且易于理解。数据库、集合和文档是MongoDB中...
在本项目中,我们主要探讨的是如何利用SpringBoot框架与MongoDB数据库进行集成,并通过Spring...这个测试项目虽然简单,但足以揭示了SpringBoot与MongoDB集成的基本原理和实践方式,对于初学者来说是一个很好的起点。
MongoDB 是一种流行的开源、分布式、面向文档的数据库系统,属于 NoSQL 数据库类型。...对于初学者,这个工具是学习 MongoDB 的理想起点,因为它降低了 NoSQL 学习的门槛,使得理解和操作 MongoDB 变得更加直观和简单。