NoSQL数据库MongoDB和Redis详解.docx

上传人:b****8 文档编号:10152101 上传时间:2023-02-08 格式:DOCX 页数:44 大小:329.44KB
下载 相关 举报
NoSQL数据库MongoDB和Redis详解.docx_第1页
第1页 / 共44页
NoSQL数据库MongoDB和Redis详解.docx_第2页
第2页 / 共44页
NoSQL数据库MongoDB和Redis详解.docx_第3页
第3页 / 共44页
NoSQL数据库MongoDB和Redis详解.docx_第4页
第4页 / 共44页
NoSQL数据库MongoDB和Redis详解.docx_第5页
第5页 / 共44页
点击查看更多>>
下载资源
资源描述

NoSQL数据库MongoDB和Redis详解.docx

《NoSQL数据库MongoDB和Redis详解.docx》由会员分享,可在线阅读,更多相关《NoSQL数据库MongoDB和Redis详解.docx(44页珍藏版)》请在冰豆网上搜索。

NoSQL数据库MongoDB和Redis详解.docx

NoSQL数据库MongoDB和Redis详解

 

NoSQL数据库—MongoDB和Redis详解

目录

1NoSQL简述4

2MongoDB简介4

3术语介绍5

4MongoDB资源消耗6

5交互式shell6

6一般功能7

6.1插入7

6.2查询7

6.3删除7

6.4索引8

6.5map/reduce8

7模式设计8

8嵌入与引用9

9GridFS11

9.1GridFS表示的对象信息11

9.2GridFS管理12

10Replication(复制)13

10.1master-slave模式13

10.2replicapairs模式13

10.3受限的master-master复制14

11Sharding(分片)14

11.1sharding介绍14

11.2sharding的配置和管理15

12JavaAPI简介16

13MongoDB实例分析17

13.1图片保存在文件系统中17

13.2图片保存在数据库中19

14MongoDB常用API总结23

15Redis简介27

15.1Redis特性27

16Redis数据类型28

16.1String类型28

16.2List类型28

16.3Set类型29

16.4ZSet类型29

16.5Hash类型29

17Alldatainmemory,butsavedondisk29

18Redis的Master-Slave模式30

19Redis虚拟内存管理31

20Redis实例分析31

21Redis命令总结32

21.1连接操作相关的命令32

21.2对value操作的命令32

21.3对String操作的命令33

21.4对List操作的命令33

21.5对Set操作的命令34

21.6对zset(sortedset)操作的命令35

21.7对Hash操作的命令35

21.8持久化36

21.9远程服务控制36

NoSQL数据库

—MongoDB和Redis

1NoSQL简述

CAP(Consistency,Availabiity,Partitiontolerance)理论告诉我们,一个分布式系统不可能满足一致性,可用性和分区容错性这三个需求,最多只能同时满足两个。

关系型数据库通过把更新操作写到事务型日志里实现了部分耐用性,但带来的是写性能的下降。

MongoDB等NoSQL数据库背后蕴涵的哲学是不同的平台应该使用不同类型的数据库,MongoDB通过降低一些特性来达到性能的提高,这在很多大型站点中是可行的。

因为MongoDB是非原子性的,所以如果如果应用需要事务,还是需要选择MySQL等关系数据库。

NoSQL数据库,顾名思义就是打破了传统关系型数据库的范式约束。

很多NoSQL数据库从数据存储的角度看也不是关系型数据库,而是key-value数据格式的hash数据库。

由于放弃了关系数据库强大的SQL查询语言和事务一致性以及范式约束,NoSQL数据库在很大程度上解决了传统关系型数据库面临的诸多挑战。

在社区中,NoSQL是指“notonlysql”,其特点是非关系型,分布式,开源,可水平扩展,模式自由,支持replication,简单的API,最终一致性(相对于即时一致性,最终一致性允许有一个“不一致性窗口”,但能保证最终的客户都能看到最新的值)。

2MongoDB简介

mongo取自“humongous”(海量的),是开源的文档数据库──nosql数据库的一种。

MongoDB是一种面向集合(collection)的,模式自由的文档(document)数据库。

面向集合是说数据被分成集合的形式,每个集合在数据库中有惟一的名称,集合可以包含不限数目的文档。

除了模式不是预先定义好的,集合与RDBMS中的表概念类似,虽然二者并不是完全对等。

数据库和集合的创建是“lazy”的,即只有在第一个document被插入时集合和数据库才真正创建——这时在磁盘的文件系统里才能看见。

模式自由是说数据库不需要知道存放在集合中的文档的结构,完全可以在同一个集合中存放不同结构的文档,支持嵌入子文档。

文档类似于RDBMS中的记录,以BSON的格式保存。

BSON是BinaryJSON的简称,是对JSON-like文档的二进制编码序列化。

像JSON(JavaScriptObjectNotation)一样,BSON支持在对象和数组内嵌入其它的对象和数组。

有些数据类型在JSON里不能表示,但可以在BSON里表示,如Date类型和BinData(二进制数据),Python原生的类型都可以表示。

与ProtocalBuffers(Google开发的用以处理对索引服务器请求/应答的协议)相比,BSON模式更自由,所以更灵活,但这样也使得每个文档都要保存字段名,所以空间压缩上不如ProtocolBuffers。

BSON第一眼看上去像BLOB,但MongoDB理解BSON的内部机制,所以MongoDB可以深入BSON对象的内部,即使是嵌套的对象,这样MongoDB就可以在顶层和嵌套的BSON对象上建立索引来应对各种查询了。

MongoDB可运行在Linux、Windows和OSX平台,支持32位和64位应用,默认端口为27017。

推荐运行在64位平台,因为MongoDB为了提高性能使用了内存映射文件进行数据管理,而在32位模式运行时支持的最大文件为2GB。

MongoDB查询速度比MySQL要快,因为它cache了尽可能多的数据到RAM中,即使是non-cached数据也非常快。

当前MongoDB官方支持的客户端API语言就多达8种(C|C++|Java|Javascript|Perl|PHP|Python|Ruby),社区开发的客户端API还有Erlang、Go、Haskell......

3术语介绍

数据库、集合、文档

每个MongoDB服务器可以有多个数据库,每个数据库都有可选的安全认证。

数据库包括一个或多个集合,集合以命名空间的形式组织在一起,用“.”隔开(类似于JAVA/Python里面的包),比如集合blog.posts和blog.authors都处于"blog"下,不会与bbs.authors有名称上的冲突。

集合里的数据由多个BSON格式的文档对象组成,document的命名有一些限定,如字段名不能以"$"开头,不能有".",名称"_id"被保留为主键。

如果插入的文档没有提供“_id”字段,数据库会为文档自动生成一个ObjectId对象作为“_id”的值插入到集合中。

字段“_id”的值可以是任意类型,只要能够保证惟一性。

BSONObjectID是一个12字节的值,包括4字节的时间戳,3字节的机器号,2字节的进程id以及3字节的自增计数。

建议用户还是使用有意义的“_id”值。

MongoDb相比于传统的SQL关系型数据库,最大的不同在于它们的模式设计(SchemaDesign)上的差别,正是由于这一层次的差别衍生出其它各方面的不同。

如果将关系数据库简单理解为由数据库、表(table)、记录(record)三个层次概念组成,而在构建一个关系型数据库的时候,工作重点和难点都在数据库表的划分与组织上。

一般而言,为了平衡提高存取效率与减少数据冗余之间的矛盾,设计的数据库表都会尽量满足所谓的第三范式。

相应的,可以认为MongoDb由数据库、集合(collection)、文档对象(Document-oriented、BSON)三个层次组成。

MongoDb里的collection可以理解为关系型数据库里的表,虽然二者并不完全对等。

当然,不要期望collection会满足所谓的第三范式,因为它们根本就不在同一个概念讨论范围之内。

类似于表由多条记录组成,集合也包含多个文档对象,虽然说一般情况下,同一个集合内的文档对象具有相同的格式定义,但这并不是必须的,即MongoDb的数据模式是自由的(schema-free、模式自由、无模式),collection中可以包含具有不同schema的文档记录,支持嵌入子文档。

4MongoDB资源消耗

考虑到性能的原因,mongo做了很多预分配,包括提前在文件系统中为每个数据库分配逐渐增长大小的文件集。

这样可以有效地避免潜在的文件系统碎片,使数据库操作更高效。

一个数据库的文件集从序号0开始分配,0,1...,大小依次是64M,128M,256M,512M,1G,2G,然后就是一直2G的创建下去(32位系统最大到512M)。

所以如果上一个文件是1G,而数据量刚好超过1G,则下一个文件(大小为2G)则可能有超过90%都是空的。

如果想使磁盘利用更有效率,下面是一些解决方法:

1.只建立一个数据库,这样最多只会浪费2G。

2.每个文档使用自建的“_id”值而不要使用默认的ObjectId对象。

3.由于每个document的每个字段名都会存放,所以如果字段名越长,document的数据占用就会越大,因此把字段名缩短会大大降低数据的占用量。

如把“timeAdded”改为“tA”。

Mongo使用内存映射文件来访问数据,在执行插入等操作时,观察mongod进程的内存占用时会发现量很大,当使用内存映射文件时是正常的。

并且映射数据的大小只出现在虚拟内存那一列,常驻内存量才反应出有多少数据cached在内存中。

【按照mongodb官方的说法,mongodb完全由系统内核进行内存管理,会尽可能的占用系统空闲内存,用free可以看到,大部分内存都是作为iocache被占用的,而这部分内存是可以释放出来给应用使用的。

5交互式shell

mongo类似于MySQL中的mysql进程,但功能远比mysql强大,它可以使用JavaScript语法的命令从交互式shell中直接操作数据库。

如查看数据库中的内容,使用游标循环查看查询结果,创建索引,更改及删除数据等数据库管理功能。

下面是一个在mongo中使用游标的例子:

>for(varcur=db.posts.find();cur.hasNext();){

...print(tojson(cur.next()));

...}

输出:

{

"_id":

ObjectId("4bb311164a4a1b0d84000000"),

"date":

"WedMar3117:

05:

232010",

"content":

"blablablabla",

"author":

"navygong",

"title":

"thefirstblog"

}

...其它的documents。

6一般功能

6.1插入

客户端把数据序列化为BSON格式传给DB后被存储在磁盘上,在读取时数据库几乎不做什么改动直接把对象返回给客户端,由client完成unserialized。

如:

>doc={'author':

'joe','created':

newDate('2010,6,21'),'title':

'Yetanotherblogpost','text':

'Hereisthetext...','tags':

['example','joe'],'comments':

[{'author':

'jim','comment':

'Idisgree'},{'author':

'navy','comment':

'Goodpost'}],'_id':

'test_id'}

>db.posts.insert(doc)

6.2查询

基本上你能想到的查询种类MongoDB都支持,如等值匹配,<,<=,>,>=,$ne,$in,$mod,$all,$size[1],$exists,$type[2],正则表达式匹配,全文搜索,......。

还有distinct(),sort(),count(),skip()[3],group()[4],......。

这里列表的查询中很多用法都和一般的RDBMS不同。

[1]匹配一个有size个元素的数组。

如db.things.find({a:

{$size:

1}})能够匹配文档{a:

["foo"]}。

[2]根据类型匹配。

db.things.find({a:

{$type:

16}})能够匹配所有a为int类型的文档。

BSON协议中规定了各种类型对应的枚举值。

[3]指定跳过多少个文档后开始返回结果,可以用在分页中。

如:

db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach(function(student){print(student.name+"

");})。

[4]在shardedMongoDB配置环境中应该应该使用map/reduce来代替group()。

6.3删除

可以像查询一样指定条件来删除特定的文档。

6.4索引

可以像在一般的RDBMS中一样使用索引。

提供了建立(一般、惟一、组合)索引、删除索引、重建索引等各种方法。

索引信息保存在集合“system.indexes”中。

6.5map/reduce

MongoDB提供了map/reduce方法来进行数据的批处理及聚集操作。

和Hadoop的使用类似,从集合中接收输入,结果输出到另一个集合。

如果你需要使用group,map/reduce会是个不错的选择。

但MongoDB中的索引和标准查询不是使用map/reduce,而是与MySQL相似。

7模式设计

Mongo式的模式设计

使用Mongo有很多种方式,你本能上可能会像使用关系型数据库一样去使用。

当然这样也可以工作得很好,但却没能发挥出Mongo的真正威力。

Monog是专门设计为富对象模型(richobjectmodel)使用的。

例如:

如果你建立了一个简单的在线商店并且把产品信息存储在关系型数据库中,那你可能会有两个像这样的表:

item

title

price

sku

item_features

sku

feature_name

feature_value

你进行了范式处理因为不同的物品有不同的特征,这样你不用建立一个包含所有特征的表了。

在Mongo中你也可以像上面那样建立两个集合,但像下面这样存储每种物品会更有效。

item:

{

"title":

,</p><p>"price":</p><p><price>,</p><p>"sku":</p><p><sku>,</p><p>"features":</p><p>{</p><p>"opticalzoom":</p><p><value>,</p><p>...</p><p>}</p><p>}</p><p>因为只要查询一个集合就能取得一件物品的所有信息,而这些信息都保存在磁盘上同一个地方,因此大大提高了查询的速度。</p><p>如果你想插入或更新一种特征,如db.items.update({sku:</p><p>123},{"$set":</p><p>{"features.zoom":</p><p>"5"}}),也不必在磁盘上移动整个对象,因为Mongo为每个对象在磁盘上预留了空间来适应对象的增长。</p><p>8嵌入与引用</p><p>以一实例来说,假设需要设计一个小型数据库来存储“学生、地址、科目、成绩”这些信息,那么关系型数据库的设计如图1所示,而key-value型数据库的设计则可能如图2所示。</p><p>图1关系型的数据库设计</p><p>图2key-value型的数据库设计</p><p>对比图1和图2,在关系型的数据库设计里划分出了4个表,而在key-value型的数据库设计里却只有两个集合。</p><p>如果说集合与表一一对应的话,那么图2中应该也有4个集合才对,把本应该是集合的address和scores直接合入了集合students中,原因在于在key-value型的数据库里,数据模式是自由的。</p><p>以scores来说,在关系型的数据库设计中将其单独成一个表是因为student与score是一对多的关系,如果将score合入student表,那么就必须预留最多可能的字段,这会存在浪费,并且当以后新增一门课程时扩展困难,因此一般都会将score表单独出来。</p><p>而对于key-value型的数据库就不同了,其scores字段就是一个BSON,该BSON可以只有一个for_course,也可以有任意多个for_course,其固有的模式自由特性使得它可以将score包含在内而无需另建一个score集合。</p><p>对于与student为一对一关系的address表也可以直接合入student,无需担心address的扩展性,当以后需要给address新增一个province字段,直接在数据插入时加上这个值即可。</p><p>当然,对于与student成多对多关系course表,为了减少数据冗余,可以将course建立为一个集合,同关系型的数据库设计中类似。</p><p>students文档中嵌入了address文档和scores文档,scores文档的“for_course”字段的值是指向courses集合的文档的引用。</p><p>如果是关系型数据库,需要把“scores”作为一个单独的表,然后在students表中建立一个指向“scores”的外键。</p><p>所以Mongo模式设计中的一个关键问题就是“是值得为这个对象新建一个集合呢,还是把这个对象嵌入到其它的集合中”。</p><p>在关系型数据库中为了范式的要求,每个子项都要建一个单独的表,但在Mongo中使用嵌入式对象更有效,所以你应该给出不使用嵌入式对象而单独建一个集合的理由。</p><p>为什么说引用要慢些呢,以上面的students集合为例,比如执行:</p><p>print(student.scores[0].for_course.name);</p><p>如果这是第一次访问scores[0],那些客户端必须执行:</p><p>student.scores[0].for_course=db.courses.findOne({_id:</p><p>_course_id_to_find_});//伪代码</p><p>所以每一次遍历引用都要对数据库进行一次这样的查询,即使所有的数据都在内存中。</p><p>再考虑到从客户端到服务器端的种种延迟,这个时间也不会低。</p><p>有一些规则可以决定该用嵌入还是引用:</p><p>1.第一个类对象,也就是处于顶层的,往往应该有自己的集合。</p><p>2.排列项详情对象应该用嵌入。</p><p>3.处于被包含关系的应该用嵌入。</p><p>4.多对多的关系通常应该用引用。</p><p>5.数据量小的集合可以放心地做成一个单独的集合,因为整个集合可以很快地cached。</p><p>6.要想获得嵌入式对象的系统级视图会更困难一些。</p><p>如上面的“Scores”如果不做成嵌入式对象可以更容易地查询出分数排名前100的学生。</p><p>7.如果嵌入的是大对象,需要留意到BSON对象的4M大小限定(后面会讲到)。</p><p>8.如果性能是关键就用嵌入。</p><p>下面是一些示例:</p><p>1.Customer/Order/OrderLine-Item</p><p>cutomers和orders应该做成一个集合,line-items应该以数组的形式嵌入在order中。</p><p>2.博客系统</p><p>posts应该是一个集合;author可以是一个单独的集合,如果只需记录作者的email地址也可以以字段的方式存在于posts中;comments应该做成嵌入的对象。</p><p>9GridFS</p><p>GridFS是MongoDB中用来存储大文件而定义的一种文件系统。</p><p>MongoDB默认是用BSON格式来对数据进行存储和网络传输。</p><p>但由于BSON文档对象在MongoDB中最大为4MB,无法存储大的对象。</p><p>即使没有大小限制,BSON也无法满足对大数据集的快速范围查询,所以MongoDB引进了GridFS。</p><p>9.1GridFS表示的对象信息</p><p>1.文件对象(类GridFSFile 的对象)的元数据信息。</p><p>结构如下</p><p>{</p><p>"_id":</p><p><unspecified>,//uniqueIDforthisfile</p><p>"filename":</p><p>data_string,//humannameforthefile</p><p>"contentType":</p><p>data_string,//validmimetypefortheobject</p><p>"length":</p><p>data_number,//sizeofthefileinbytes</p><p>"chunkSize":</p><p>data_number,//sizeofeachofthechunks.Defaultis256k</p><p>"uploadDate":</p><p>data_date,//datewhenobjectfirststored</p><p>"aliases":</p><p>data_arrayofdata_string,//optionalarrayofaliasstrings</p><p>"metadata":</p><p>data_object,//anythingtheuserwantstostore</p><p>"md5":</p><p>data_string//resultofrunning"filemd5"commandonthefile'schunks</p><p>}</p><p>如下是put进去的一个文件例子:</p><p>{</p><p>_id:</p><p>ObjId(4bbdf6200459d967be9d8e98),</p><p>filename:</p><p>"/home/hjgong/source_file/wnwb.svg",</p><p>length:</p><p>7429,</p><p>chunkSize:</p><p>262144,</p><p>uploadDate:</p><p>newDate(1270740513127),</p><p>md5:</p><p>"ccd93f05e5b9912c26e68e9955bbf8b9"</p><p>}</p><p>2.数据的二进制块以及一些统计信息。</p><p>结构如下:</p><p>{</p><p>"_id":</p><p><unspecified>,//objectidofthechunkinthe_chunkscollection</p><p>"files_id":</p><p><unspecified>,//_idvalueoftheowning{{files}}collectionentry</p><p>"n":</p><p>data_number,//"chunknumber"-startingwith0</p><p>"data":</p><p>data_binary(type0x02),//binarydataforchunk</p><p>}</p><p>因此使用GridFS可以储存富媒体文件,同时存入任意的附加信息,因为这些信息实际上也是一个普通的collection。</p><p>以前,如果要存储一个附件,通常的做法是,在主数据库中存放文件的属性同时记录文件的path,当查询某个文件时,需要首先查询数据库,获得该文件的path,然后从存储系统中获得相应的文件。</p><p>在使用GridFS时则非常简单,可以直接将这些信息直接存储到文件中。</p><p>比如下面的Java代码,将文件file(file可以是图片、音频、视频等文件)储存到db中:</p><p>其中该方法的第一个参数的类型还可以是InputStream,byte[],从而实现多个重载的方法。</p><p>9.2GridFS管理</p><p>MongoDB提供的工具mongofiles可以从命令行操作GridFS。</p><p>如:</p><p>./mongofiles-hostlocalhost:</p><p>1727-unavygong-p111put~/source_file/wnwb.svg</p><p>每种语言提供的MongoDB客户端API都提供了一套方法,可以像操作</p> </div> <div class="readmore" onclick="showmore()" style="background-color:transparent; height:auto; margin:0px 0px; padding:20px 0px 0px 0px;"><span class="btn-readmore" style="background-color:transparent;"><em style=" font-style:normal">展开</em>阅读全文<i></i></span></div> <script> function showmore() { $(".readmore").hide(); $(".detail-article").css({ "height":"auto", "overflow": "hidden" }); } $(document).ready(function() { var dh = $(".detail-article").height(); if(dh >100) { $(".detail-article").css({ "height":"100px", "overflow": "hidden" }); } else { $(".readmore").hide(); } }); </script> </div> <script> var defaultShowPage = parseInt("5"); var id = "10152101"; var total_page = "44"; var mfull = false; var mshow = false; function DownLoad() { window.location.href='https://m.bdocx.com/down/10152101.html'; } function relate() { var reltop = $('#relate').offset().top-50; $("html,body").animate({ scrollTop: reltop }, 500); } </script> <script> var pre = "https://file1.bdocx.com/fileroot1/2023-2/8/fb61e814-696f-4382-842b-eb6716ee9d3a/fb61e814-696f-4382-842b-eb6716ee9d3a"; var freepage = parseInt('20'); var total_c = parseInt('44'); var start = defaultShowPage; var adcount = 0; var adindex = 0; var adType_list = ";0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;"; var end = start; function ShowSvg() { end = start + defaultShowPage; if (end > freepage) end = freepage; for (var i = start; i < end; i++) { var imgurl = pre + (i + 1) + '.gif'; var html = "<img src='" + imgurl + "' onerror=\"this.src='/images/s.gif'\" alt=\"NoSQL数据库MongoDB和Redis详解.docx_第" + (i + 1) + "页\" width='100%'/>"; $("#page").append("<div class='page'>" + html + "</div>"); $("#page").append("<div class='pageSize'>第" + (i + 1) + "页 / 共" + total_c + "页</div>"); if(adcount > 0 && adType_list.indexOf(";"+(i+1)+";")>-1) { if(adindex > (adcount-1)) adindex = 0; $("#page").append("<div class='pagead' id='addiv"+(i + 1)+"'></div>"); document.getElementById("addiv"+(i + 1)+"").innerHTML =document.getElementById("adpre" + adindex).outerHTML; adindex += 1; } } start = end; if (start > (freepage - 1)) { if (start < total_c) { $("#pageMore").removeClass("btnmore"); $("#pageMore").html("亲,该文档总共" + total_c + "页,到这儿已超出免费预览范围,如果喜欢就下载吧!"); } else { $("#pageMore").removeClass("btnmore"); $("#pageMore").html("亲,该文档总共" + total_c + "页全部预览完了,如果喜欢就下载吧!"); } } } //$(document).ready(function () { // ShowSvg(); //}); </script> <div id="relate" class="container" style="padding:0px 0px 15px 0px; margin-top:20px; border:solid 1px #dceef8"> <div style=" font-size: 16px; background-color:#e5f0f7; margin-bottom:5px; font-weight: bold; text-indent:10px; line-height: 40px; height:40px; padding-bottom: 0px;">相关资源</div> <div id="relatelist" style="padding-left:5px;"> <ul> <li><em class="pptx"/></em><a target="_parent" href="https://m.bdocx.com/doc/30873039.html" title="区块链在金融领域的应用.pptx">区块链在金融领域的应用.pptx</a> </li><li><em class="doc"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872862.html" title="光伏发电项目光伏支架及组件安装施工方案.doc">光伏发电项目光伏支架及组件安装施工方案.doc</a> </li><li><em class="doc"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872802.html" title="煤矿调度员考试试卷.doc">煤矿调度员考试试卷.doc</a> </li><li><em class="pptx"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872683.html" title="施工方案编制.pptx">施工方案编制.pptx</a> </li><li><em class="ppt"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872582.html" title="地质灾害防治工程施工管理程序及用表(表格丰富).ppt">地质灾害防治工程施工管理程序及用表(表格丰富).ppt</a> </li><li><em class="docx"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872369.html" title="德育下半年工作计划(通用25篇).docx">德育下半年工作计划(通用25篇).docx</a> </li><li><em class="pptx"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872270.html" title="重读毛泽东《论持久战》PPT红色古朴经典品读课件下载.pptx">重读毛泽东《论持久战》PPT红色古朴经典品读课件下载.pptx</a> </li><li><em class="pptx"/></em><a target="_parent" href="https://m.bdocx.com/doc/30872050.html" title="机械制造工艺教案23节已排市公开课金奖市赛课一等奖课件.pptx">机械制造工艺教案23节已排市公开课金奖市赛课一等奖课件.pptx</a> </li><li><em class="pptx"/></em><a target="_parent" href="https://m.bdocx.com/doc/30871726.html" title="红色党建党纪律处分条例党纪学习教育课件ppt.pptx">红色党建党纪律处分条例党纪学习教育课件ppt.pptx</a> </li><li><em class="ppt"/></em><a target="_parent" href="https://m.bdocx.com/doc/30871591.html" title="现代地球科学测试技术全册配套完整教学课件.ppt">现代地球科学测试技术全册配套完整教学课件.ppt</a> </li> </ul> </div> </div> <div class="container" style="padding:0px 0px 15px 0px; margin-top:20px; border:solid 1px #dceef8"> <div style=" font-size: 16px; background-color:#e5f0f7; margin-bottom:5px; font-weight: bold; text-indent:10px; line-height: 40px; height:40px; padding-bottom: 0px;">猜你喜欢</div> <div id="relatelist" style="padding-left:5px;"> <ul> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25922.html" target="_parent" title="资料4中华民族近代以来最伟大的梦想.docx">资料4中华民族近代以来最伟大的梦想.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25923.html" target="_parent" title="天然高分子聚丁二酸丁二醇酯复合材料研究进展.docx">天然高分子聚丁二酸丁二醇酯复合材料研究进展.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25924.html" target="_parent" title="综合支吊架的负荷校验方法.docx">综合支吊架的负荷校验方法.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25925.html" target="_parent" title="国外金属材料标准常用英文词汇解析.docx">国外金属材料标准常用英文词汇解析.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25926.html" target="_parent" title="铁路线路两侧应当设立铁路线路安全保护区.docx">铁路线路两侧应当设立铁路线路安全保护区.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25927.html" target="_parent" title="资格考试临检基础分章节复习二十概要1讲解.docx">资格考试临检基础分章节复习二十概要1讲解.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25928.html" target="_parent" title="函授本科个人总结精选多篇.docx">函授本科个人总结精选多篇.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25929.html" target="_parent" title="统编版三年级下学期语文第八单元测试题I卷.docx">统编版三年级下学期语文第八单元测试题I卷.docx</a></li> <li><em class="docx"></em> <a href="https://m.bdocx.com/doc/25930.html" target="_parent" title="河北省安平中学学年高二下学期期末考试政治试题.docx">河北省安平中学学年高二下学期期末考试政治试题.docx</a></li> </ul> </div> </div> <div style=" font-size: 16px; background-color:#e5f0f7; margin-top:20px; font-weight: bold; text-indent:10px; line-height: 40px; height:40px; padding-bottom: 0px; margin-bottom:10px;"> 相关搜索</div> <div class="widget-box pt0" style="border: none; padding:0px 5px;"> <ul class="taglist--inline multi"> <li class="tagPopup"><a target="_parent" class="tag tagsearch" rel="nofollow" href="https://m.bdocx.com/search.html?q=NoSQL">NoSQL</a></li> <li class="tagPopup"><a target="_parent" class="tag tagsearch" rel="nofollow" href="https://m.bdocx.com/search.html?q=%e6%95%b0%e6%8d%ae%e5%ba%93">数据库</a></li> <li class="tagPopup"><a target="_parent" class="tag tagsearch" rel="nofollow" href="https://m.bdocx.com/search.html?q=MongoDB">MongoDB</a></li> <li class="tagPopup"><a target="_parent" class="tag tagsearch" rel="nofollow" href="https://m.bdocx.com/search.html?q=Redis">Redis</a></li> <li class="tagPopup"><a target="_parent" class="tag tagsearch" rel="nofollow" href="https://m.bdocx.com/search.html?q=%e8%af%a6%e8%a7%a3">详解</a></li> </ul> </div> <br /> <div > 当前位置:<a target="_parent" href="https://m.bdocx.com/">首页</a> > <a href="https://m.bdocx.com/booklist-00020.html">高等教育</a><span> > </span><a href="https://m.bdocx.com/booklist-0002000006.html">理学</a> </div> <br /> <div class="cssnone"> <iframe title="来源" src="https://m.bdocx.com/BookRead.aspx?id=81%7c5Oicfhn1KIdQrDMBXXQ%3d%3d&parto=GcMpEd7V73OtIos1pSkgU3hKFTnSyGh7Pg7G7Y%2fWPVOSLwi77EKRon9S5I%2fIBXXKnfsN3u8y01Vwl2kNicHVFJoKEofNAp9UTUdqa23q8o%2bFZ9U8ZI16UBGjQCtR%2bqK1DpjMkettfeD2k1%2fWATc8%2bYClltaH%2bzVjPT6qQn3ZdTytRqXAtXMMfA6L6T7fwDakY%2fX1bC7NdLoo9EBAHCbww7MTHifFOGeV" frameborder="0" style="width: 0px; height: 0px"> </iframe> </div> <span id="LabelScript"></span> <script src="https://mstatic.bdocx.com/JS/bootstrap-collapse.js"></script> </form> <div class="siteInner_bg" style="margin-top: 40px; border: solid 0px red; margin-left: 0px; margin-right: 0px;"> <div class="siteInner"> <p style="text-align: center;">copyright@ 2008-2022 冰豆网网站版权所有</p><p style="text-align: center;">经营许可证编号:<a href="http://beian.miit.gov.cn/" target="_blank">鄂ICP备2022015515号-1</a></p><script>var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2e77bd3f6fe91b0e21d3f22267249ee3"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();</script><script>(function(){ var el = document.createElement("script"); el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?81476e42bf626128cf29544ee216a8ed7deb9487dce7ed62313212129c4244a219d1c501ebd3301f5e2290626f5b53d078c8250527fa0dfd9783a026ff3cf719"; el.id = "ttzz"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(el, s); })(window)</script> </div> </div> <div class="trnav clearfix" id="navcontent" style="display: none; background-color:#3a71b1; "> <div class="trlogoside" id="navlogo" style="display: none;"> <a href="https://m.bdocx.com/" title="冰豆网"><img src="https://www.bdocx.com/images/logo_bd.png" alt="冰豆网"></a> <div class="trnavclose" id="navclose"> <span></span> </div> </div> <div class="navcontainer"> <div class="row"> <ul class="nav navbar-nav trnavul headercontent" id="navigation" style="margin:20px 0 0px;"> <li><a target="_parent"href="https://m.bdocx.com/login.aspx">登录</a></li> <li><a target="_parent"href="https://m.bdocx.com/">首页 </a></li> <li><a target="_parent"href="https://m.bdocx.com/booklist-0.html">资源分类 </a></li> <li><a target="_parent"href="https://m.bdocx.com/UserManage/Recharge.aspx?f=0"><img src="https://m.bdocx.com/images/s.gif" alt="new" class="hottip1">升级会员 <img src="https://www.bdocx.com/FileUpload/Images/48520fea-bc98-41ae-b183-84689c7075c9.gif" alt="new" class="hottip"></a></li> <li><a target="_parent"href="https://m.bdocx.com/newslist.html">通知公告 </a></li> <li><a target="_parent"href="https://m.bdocx.com/h-0.html">帮助中心 </a></li> </ul> </div> </div> </div> <script type="text/javascript"> function stopPropagation(e) { var ev = e || window.event; if (ev.stopPropagation) { ev.stopPropagation(); } else if (window.event) { window.event.cancelBubble = true;//兼容IE } } $("#navmore").click(function (e) { $("#navcontent").show(); $("#navlogo").show(); stopPropagation(e); var navcontentwidth = $("#navcontent").width(); $('#navcontent').css({ 'right': '-' + navcontentwidth + 'px' }); $("#navcontent").show().animate({ "right": 0 }, 300); }); $(document).bind('click', function () { var navcontentwidth = $("#navcontent").width(); $("#navcontent").animate({ 'right': '-' + navcontentwidth + 'px' }, 300, function () { $("#navcontent").hide(); }); $("#navlogo").fadeOut(300); }); $("#navcontent").click(function (e) { stopPropagation(e); }); $("#navclose").click(function (e) { var navcontentwidth = $("#navcontent").width(); $("#navcontent").animate({ 'right': '-' + navcontentwidth + 'px' }, 300, function () { $("#navcontent").hide(); }); $("#navlogo").fadeOut(300); }); </script> <script> function BaseShare(title, desc, imgUrl) { var link = "https://m.bdocx.com/doc/10152101.html"; if (wx) { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'wx4f717640abfd1120', // 必填,公众号的唯一标识 timestamp: '1726300386', // 必填,生成签名的时间戳 nonceStr: '11B921EF080F7736089C757404650E40', // 必填,生成签名的随机串 signature: '05875f8c3f71715f2ae3d464bf71bd67742b07ab',// 必填,签名,见附录1 jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline', 'updateAppMessageShareData', 'updateTimelineShareData', 'hideMenuItems'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 //openTagList: ["wx-open-launch-weapp"]//H5打开小程序 }); wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.hideMenuItems({// 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3 menuList: ['menuItem:share:qq', 'menuItem:favorite', 'menuItem:share:QZone', 'menuItem:share:email', 'menuItem:originPage', 'menuItem:readMode', 'menuItem:delete', 'menuItem:editTag', 'menuItem:share:facebook', 'menuItem:share:weiboApp', 'menuItem:share:brand'] }); var shareData = { title: title, // 分享标题 desc: desc,//这里请特别注意是要去除html link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl, // 分享图标 }; wx.updateAppMessageShareData(shareData);//1.4 分享到朋友 wx.updateTimelineShareData(shareData);//1.4分享到朋友圈 }); } } function BaseShare(title, desc, imgUrl, link) { if (link=="") link = "https://m.bdocx.com/doc/10152101.html"; if (wx) { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: 'wx4f717640abfd1120', // 必填,公众号的唯一标识 timestamp: '1726300386', // 必填,生成签名的时间戳 nonceStr: '11B921EF080F7736089C757404650E40', // 必填,生成签名的随机串 signature: '05875f8c3f71715f2ae3d464bf71bd67742b07ab',// 必填,签名,见附录1 jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline', 'updateAppMessageShareData', 'updateTimelineShareData', 'hideMenuItems'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 //openTagList: ["wx-open-launch-weapp"]//H5打开小程序 }); wx.ready(function () { //需在用户可能点击分享按钮前就先调用 wx.hideMenuItems({// 要隐藏的菜单项,只能隐藏“传播类”和“保护类”按钮,所有menu项见附录3 menuList: ['menuItem:share:qq', 'menuItem:favorite', 'menuItem:share:QZone', 'menuItem:share:email', 'menuItem:originPage', 'menuItem:readMode', 'menuItem:delete', 'menuItem:editTag', 'menuItem:share:facebook', 'menuItem:share:weiboApp', 'menuItem:share:brand'] }); var shareData = { title: title, // 分享标题 desc: desc,//这里请特别注意是要去除html link: link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 imgUrl: imgUrl, // 分享图标 }; wx.updateAppMessageShareData(shareData);//1.4 分享到朋友 wx.updateTimelineShareData(shareData);//1.4分享到朋友圈 }); } } </script> <script> $(document).ready(function () { var arr = $(".headercontent"); for (var i = 0; i < arr.length; i++) { (function (index) { var url = "https://m.bdocx.com/header.aspx"; $.get(url + "?t=" + (new Date()).valueOf(), function (d) { try { arr.eq(index).empty().html(d); } catch (e) { } try { arr.html(d); } catch (e) { } }); })(i); } }); </script> <script src="https://mstatic.bdocx.com/js/jquery.lazyload.js"></script> <script charset="utf-8"> $("img.lazys").lazyload({ threshold: 200, effect: "fadeIn" }); </script> </body> </html>