扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
《Redis设计与实现》(黄健宏)电子书网盘下载免费在线阅读
创新互联建站"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!创新互联建站具备承接各种类型的成都网站设计、网站建设、外贸网站建设项目的能力。经过十载的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。
资源链接:
链接:
提取码:ecau
书名:Redis设计与实现
作者:黄健宏
豆瓣评分:8.6
出版社:机械工业出版社
出版年份:2014-6
页数:388
内容简介:
【编辑推荐】
系统而全面地描述了 Redis 内部运行机制
图示丰富,描述清晰,并给出大量参考信息,是NoSQL数据库开发人员案头必备
包括大部分Redis单机特征,以及所有多机特性
【读者评价】
这本书描述的知识点很丰富,覆盖很全,里面提到特性较多,有不少我们也没用过 :) 每个命令内部的机制的介绍很不错,很多估计也是首次有详细文档介绍。——杨卫华(@TimYang)新浪微博技术总监
近几年Redis以其高性能、高灵活性的优点,变得越来越流行。但很多人在使用Redis时,仅仅还是停留在比较表层的功能性认识,缺乏对内部机制原理的深入理解。本书是huangz同学长期对Redis源码的阅读心得结晶,书中对Redis的各个方面都进行了详细且深入的讲解,将复杂的原理用最简单的方式为大家解构和讲解,强烈推荐给每一位Redis的使用者阅读。—— iammutex,NoSQLFan站长,乐视网技术经理
Redis 是近些年来特别火爆的 NoSQL 之一。纵观中外各种书籍还没有一本能对 Redis 内部进行深入剖析,《Redis 设计与实现》可谓开此先河。常和作者在网上交流,知道作者为这本书付出了大量的心血。这本书行文流畅,思路清晰,详细地介绍了 Redis 源码的方方面面。无论是想学习 NoSQL、网络编程的初学者,还是源码控的进阶者,本书都会有很大的帮助。—— 阮若夷,支付宝高级专家
【内容简介】
本书全面而完整地讲解了Redis的内部机制与实现方式,对Redis的大多数单机功能以及所有多机功能的实现原理进行了介绍,展示了这些功能的核心数据结构以及关键的算法思想,图示丰富,描述清晰,并给出大量参考信息。通过阅读本书,读者可以快速、有效地了解Redis的内部构造以及运作机制,更好、更高效地使用Redis。
本书主要分为四大部分。第一部分“数据结构与对象”介绍了Redis中的各种对象及其数据结构,并说明这些数据结构如何影响对象的功能和性能。第二部分“单机数据库的实现”对Redis实现单机数据库的方法进行了介绍,包括数据库、RDB持久化、AOF持久化、事件等。第三部分“多机数据库的实现”对Redis的Sentinel、复制、集群三个多机功能进行了介绍。第四部分“独立功能的实现”对Redis中各个相对独立的功能模块进行了介绍,涉及发布与订阅、事务、Lua脚本、排序、二进制位数组、慢查询日志、监视器等。
作者简介:
黄健宏 软件开发者,他喜欢函数式编程,热爱开源软件。出于对数据库的强烈兴趣,他开始阅读和分析 Redis 源代码,并对 Redis 2.6 和 Redis 3.0 的源代码进行了详细注释。
MongoDB不多说,不是一个类型的东西,Redis相对Memcached来说功能和特性上的优势已经很明显了。而对于性能,Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。为什么这么说呢,理由就是Redis是单线程运行的。
因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。
因为是单线程运行,所以IO是串行化的,网络IO和内存IO,因此当单条数据太大时,由于需要等待一个命令的所有IO完成才能进行后续的命令,所以性能会受影响。
而就内存使用上来说,目前Redis结合了tcmalloc和jemalloc两个内存分配器,基本上和Memcached不相伯仲。如果是简单且有规律的key value存储,那么用Redis的hash结构来做,内存使用上会惊人的变小,优势是很明显的。
参考:
《Memcached真的过时了吗?》
《节约内存:Instagram的Redis实践》
查询:
MySQL:
SELECT * FROM user
Mongo:
db.user.find()
MySQL:
SELECT * FROM user WHERE name = 'starlee'
Mongo:
db.user.find({‘name' : 'starlee'})
插入:
MySQL:
INSERT INOT user (`name`, `age`) values ('starlee',25)
Mongo:
db.user.insert({‘name' : 'starlee', ‘age' : 25})
如果你想在MySQL里添加一个字段,你必须:
ALTER TABLE user….
但在MongoDB里你只需要:
db.user.insert({‘name' : 'starlee', ‘age' : 25, ‘email' : 'starlee@starlee.com'})
删除:
MySQL:
DELETE * FROM user
Mongo:
db.user.remove({})
MySQL:
DELETE FROM user WHERE age 30
Mongo:
db.user.remove({‘age' : {$lt : 30}})
$gt : ; $gte : = ; $lt : ; $lte : = ; $ne : !=
更新:
MySQL:
UPDATE user SET `age` = 36 WHERE `name` = 'starlee'
Mongo:
db.user.update({‘name' : 'starlee'}, {$set : {‘age' : 36}})
MySQL:
UPDATE user SET `age` = `age` + 3 WHERE `name` = 'starlee'
Mongo:
db.user.update({‘name' : 'starlee'}, {$inc : {‘age' : 3}})
MySQL:
SELECT COUNT(*) FROM user WHERE `name` = 'starlee'
Mongo:
db.user.find({‘name' : 'starlee'}).count()
MySQL:
SELECT * FROM user limit 10,20
Mongo:
db.user.find().skip(10).limit(20)
MySQL:
SELECT * FROM user WHERE `age` IN (25, 35,45)
Mongo:
db.user.find({‘age' : {$in : [25, 35, 45]}})
MySQL:
SELECT * FROM user ORDER BY age DESC
Mongo:
db.user.find().sort({‘age' : -1})
MySQL:
SELECT DISTINCT(name) FROM user WHERE age 20
Mongo:
db.user.distinct(‘name', {‘age': {$lt : 20}})
MySQL:
SELECT name, sum(marks) FROM user GROUP BY name
Mongo:
db.user.group({
key : {‘name' : true},
cond: {‘name' : ‘foo'},
reduce: function(obj,prev) { prev.msum += obj.marks; },
initial: {msum : 0}
});
MySQL:
SELECT name FROM user WHERE age 20
Mongo:
db.user.find(‘this.age 20′, {name : 1})
发现很多人在搜MongoDB循环插入数据,下面把MongoDB循环插入数据的方法添加在下面:
for(var i=0;i100;i++)db.test.insert({uid:i,uname:'nosqlfan'+i});
上面一次性插入一百条数据,大概结构如下:
{ “_id” : ObjectId(“4c876e519e86023a30dde6b8″), “uid” : 55, “uname” : “nosqlfan55″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6b9″), “uid” : 56, “uname” : “nosqlfan56″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6ba”), “uid” : 57, “uname” : “nosqlfan57″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6bb”), “uid” : 58, “uname” : “nosqlfan58″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6bc”), “uid” : 59, “uname” : “nosqlfan59″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6bd”), “uid” : 60, “uname” : “nosqlfan60″ }
简易对照表
SQL Statement Mongo Query Language Statement
CREATE TABLE USERS (a Number, b Number) implicit; can be done explicitly
INSERT INTO USERS VALUES(1,1) db.users.insert({a:1,b:1})
SELECT a,b FROM users db.users.find({}, {a:1,b:1})
SELECT * FROM users db.users.find()
SELECT * FROM users WHERE age=33 db.users.find({age:33})
SELECT a,b FROM users WHERE age=33 db.users.find({age:33}, {a:1,b:1})
SELECT * FROM users WHERE age=33 ORDER BY name db.users.find({age:33}).sort({name:1})
SELECT * FROM users WHERE age33 db.users.find({'age':{$gt:33}})})
SELECT * FROM users WHERE age33 db.users.find({'age':{$lt:33}})})
SELECT * FROM users WHERE name LIKE "%Joe%" db.users.find({name:/Joe/})
SELECT * FROM users WHERE name LIKE "Joe%" db.users.find({name:/^Joe/})
SELECT * FROM users WHERE age33 AND age=40 db.users.find({'age':{$gt:33,$lte:40}})})
SELECT * FROM users ORDER BY name DESC db.users.find().sort({name:-1})
CREATE INDEX myindexname ON users(name) db.users.ensureIndex({name:1})
CREATE INDEX myindexname ON users(name,ts DESC) db.users.ensureIndex({name:1,ts:-1})
SELECT * FROM users WHERE a=1 and b='q' db.users.find({a:1,b:'q'})
SELECT * FROM users LIMIT 10 SKIP 20 db.users.find().limit(10).skip(20)
SELECT * FROM users WHERE a=1 or b=2 db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } )
SELECT * FROM users LIMIT 1 db.users.findOne()
EXPLAIN SELECT * FROM users WHERE z=3 db.users.find({z:3}).explain()
SELECT DISTINCT last_name FROM users db.users.distinct('last_name')
SELECT COUNT(*y) FROM users db.users.count()
SELECT COUNT(*y) FROM users where AGE 30 db.users.find({age: {'$gt': 30}}).count()
SELECT COUNT(AGE) from users db.users.find({age: {'$exists': true}}).count()
UPDATE users SET a=1 WHERE b='q' db.users.update({b:'q'}, {$set:{a:1}}, false, true)
UPDATE users SET a=a+2 WHERE b='q' db.users.update({b:'q'}, {$inc:{a:2}}, false, true)
DELETE FROM users WHERE z="abc" db.users.remove({z:'abc'});
###################################################
一、操作符
操作符相信大家肯定都知道了,就是等于、大于、小于、不等于、大于等于、小于等于,但是在mongodb里不能直接使用这些操作符。在mongodb里的操作符是这样表示的:
(1) $gt (大于)
(2) $lt (小于)
(3) $gte= (大于等于)
(4) $lt= (小于等于)
(5) $ne!= (不等于)
(6) $inin (包含)
(7) $ninnot in (不包含)
(8) $existsexist (字段是否存在)
(9) $inc对一个数字字段field增加value
(10) $set就是相当于sql的set field = value
(11) $unset就是删除字段
(12) $push把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去
(13) $pushAll同$push,只是一次可以追加多个值到一个数组字段内
(14) $addToSet增加一个值到数组内,而且只有当这个值不在数组内才增加。
(15) $pop删除最后一个值:{ $pop : { field : 1 } }删除第一个值:{ $pop : { field : -1 } }注意,只能删除一个值,也就是说只能用1或-1,而不能用2或-2来删除两条。mongodb 1.1及以后的版本才可以用
(16) $pull从数组field内删除一个等于value值
(17) $pullAll同$pull,可以一次删除数组内的多个值
(18) $ 操作符是他自己的意思,代表按条件找出的数组里面某项他自己。这个比较坳口,就不说了。
二、CURD 增、改、读、删
增加
复制代码代码如下:
db.collection-insert({'name' = 'caleng', 'email' = 'admin#admin.com'});
是不是灰常简单呀,对就是这么简单,它没有字段的限制,你可以随意起名,并插入数据
复制代码代码如下:
db.collection.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } ); 只更新了第一条大于1记录
db.collection.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true ); 大于3的记录 全更新了
db.collection.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false ); 大于4的记录 只加进去了第一条
db.collection.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true ); 大于5的记录 全加进去
查询
复制代码代码如下:
db.collection.find(array('name' = 'bailing'), array('email'='email@qq.com'))
db.collection.findOne(array('name' = 'bailing'), array('email''email@qq.com'))
大家可以看到查询我用了两种不同的写法,这是为什么,其实这跟做菜是一样的,放不同的调料,炒出的菜是不同的味道。下面给大家说一下,这两种调料的不同作用。
findOne()只返回一个文档对象,find()返回一个集合列表。
也就是说比如,我们只想查某一条特定数据的详细信息的话,我们就可以用findOne();
如果想查询某一组信息,比如说一个新闻列表的时候,我们就可以作用find();
那么我想大家这时一定会想到我想对这一个列表排序呢,no problem mongodb会为您全心全意服务
复制代码代码如下:
db.collection.find().sort({age:1}); //按照age正序排列
db.collection.find().sort({age:-1}); //按照age倒序排列
db.collection.count(); //得到数据总数
db.collection.limit(1); //取数据的开始位置
db.collection.skip(10); //取数据的结束位置
//这样我们就实现了一个取10条数据,并排序的操作。
删除
删除有两个操作 remove()和drop()
复制代码代码如下:
db.collection.remove({"name",'jerry'}) //删除特定数据
db.collection.drop() //删除集合内的所有数据
distinct操作
复制代码代码如下:
db.user.distinct('name', {'age': {$lt : 20}})
2. 熟悉MongoDB的数据操作语句,类sql
数据库操作语法
mongo --path
db.AddUser(username,password) 添加用户
db.auth(usrename,password) 设置数据库连接验证
db.cloneDataBase(fromhost) 从目标服务器克隆一个数据库
db.commandHelp(name) returns the help for the command
db.copyDatabase(fromdb,todb,fromhost) 复制数据库fromdb---源数据库名称,todb---目标数据库名称,fromhost---源数据库服务器地址
db.createCollection(name,{size:3333,capped:333,max:88888}) 创建一个数据集,相当于一个表
db.currentOp() 取消当前库的当前操作
db.dropDataBase() 删除当前数据库
db.eval(func,args) run code server-side
db.getCollection(cname) 取得一个数据集合,同用法:db['cname'] or db.cname
db.getCollenctionNames() 取得所有数据集合的名称列表
db.getLastError() 返回最后一个错误的提示消息
db.getLastErrorObj() 返回最后一个错误的对象
db.getMongo() 取得当前服务器的连接对象get the server connection object
db.getMondo().setSlaveOk() allow this connection to read from then nonmaster membr of a replica pair
db.getName() 返回当操作数据库的名称
db.getPrevError() 返回上一个错误对象
db.getProfilingLevel() ?什么等级
db.getReplicationInfo() ?什么信息
db.getSisterDB(name) get the db at the same server as this onew
db.killOp() 停止(杀死)在当前库的当前操作
db.printCollectionStats() 返回当前库的数据集状态
db.printReplicationInfo()
db.printSlaveReplicationInfo()
db.printShardingStatus() 返回当前数据库是否为共享数据库
db.removeUser(username) 删除用户
db.repairDatabase() 修复当前数据库
db.resetError()
db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj:1}
db.setProfilingLevel(level) 0=off,1=slow,2=all
db.shutdownServer() 关闭当前服务程序
db.version() 返回当前程序的版本信息
数据集(表)操作语法
db.linlin.find({id:10}) 返回linlin数据集ID=10的数据集
db.linlin.find({id:10}).count() 返回linlin数据集ID=10的数据总数
db.linlin.find({id:10}).limit(2) 返回linlin数据集ID=10的数据集从第二条开始的数据集
db.linlin.find({id:10}).skip(8) 返回linlin数据集ID=10的数据集从0到第八条的数据集
db.linlin.find({id:10}).limit(2).skip(8) 返回linlin数据集ID=1=的数据集从第二条到第八条的数据
db.linlin.find({id:10}).sort() 返回linlin数据集ID=10的排序数据集
db.linlin.findOne([query]) 返回符合条件的一条数据
db.linlin.getDB() 返回此数据集所属的数据库名称
db.linlin.getIndexes() 返回些数据集的索引信息
db.linlin.group({key:...,initial:...,reduce:...[,cond:...]})
db.linlin.mapReduce(mayFunction,reduceFunction,optional params)
db.linlin.remove(query) 在数据集中删除一条数据
db.linlin.renameCollection(newName) 重命名些数据集名称
db.linlin.save(obj) 往数据集中插入一条数据
db.linlin.stats() 返回此数据集的状态
db.linlin.storageSize() 返回此数据集的存储大小
db.linlin.totalIndexSize() 返回此数据集的索引文件大小
db.linlin.totalSize() 返回些数据集的总大小
db.linlin.update(query,object[,upsert_bool]) 在此数据集中更新一条数据
db.linlin.validate() 验证此数据集
db.linlin.getShardVersion() 返回数据集共享版本号
医疗行业是一个生态系统,这个生态系统包含多个重要角色:作为医疗服务提供方的公私立医院、社区医院等医疗机构,作为医疗服务和产品的支付方的商业保险公司以及社会保险,还有作为医疗政策的制定和监管方的各级政府卫生部门,比如卫计委和地方各级卫生厅局,以及作为医药和医疗产品生产和销售方的各个相关企业,他们研发、生产或者销售各类药物以及医疗器械产品。除了以上传统角色,随着可穿戴技术的成熟和逐步市场化,目前医疗行业还出现很多面向消费者健康以及运动的产品和基于数据的服务。他们通过可穿戴设备记录和检测消费者的日常活动和生理指标,也成为医疗行业中不可或缺的一员,并逐步成长为大数据的拥有者。
医疗生态环境在其运转过程中产生了大量的数据。如何更加有效地整合和利用相关数据,为政府更好地履行政策制定和监管职能,是各级政府卫生部门所面临的重要问题之一。如何利用已有病人的数据提高未来临床治疗的效率和质量,并支撑专业的医疗研究是医疗服务方所面临的重要挑战。
存在的问题
随着国家深化医疗卫生体制改革,对医疗卫生信息化建设资金投入的不断增加,促使医疗卫生领域信息化建设取得了一定的成效,在全国医疗卫生信息统计、各级医疗卫生管理体系、基本公共卫生服务提供、医院信息化管理等方面提供了信息化辅助管理手段,提升工作效率和医疗卫生管理水平。 但医疗行业的大数据的收集、分析和应用仍然面临很多的挑战。
首先,医疗行业的大数据分属不同的行业角色。如何整合这些大数据是一个挑战。数据的分享和交换需要合理的政策并考虑各方合理的利益诉求。
其次,医疗行业数据的电子化和数字化仍处于早期阶段,很多数据尚未数字化。比如,医疗行业仍然要求医疗机构将病人档案纸质化,这加大了医疗机构工作人员的工作量,从某种程度上抑制了医疗信息化系统的使用。国内仍然有很多医院包括基层医院并未购买和使用完善的信息化系统来支撑相关数据的数字化。例如,很多基层医院尚未建立基本的医院信息系统(HIS)。电子病历系统(EMR/EHR)在国内医院也未普及。
再次,由于医疗信息系统的提供商非常多,不同医疗机构的需求千变万化,行业内部同类信息系统在数据结构和格式等解决方案上的同质性比较差,数据交换和分享在技术上存在阻力。尽管面临这么多的挑战,如果我们能够围绕医疗大数据制定合理的整合、分析和应用政策和策略,那么医疗大数据及其分析就能帮助提高整个医疗行业的运转效率乃至体验水平。
医疗大数据分析应用
请点击输入图片描述
大数据分析的发展为解决医疗行业所面临的问题提供了可能性。上图总结了大数据分析在医疗行业中潜在的应用场景以及主要用户。我们来看看几个典型应用:
1、临床医疗模式分析
临床过程模式分析功能是指利用大数据分析系统对过程数据进行分析并改进的能力。医疗行业数据分析在医院内部通过数据进行诊疗过程分析,以发现大量临床电子记录数据之间的关系,为今后的循证临床实践提供参考。临床数据分析系统为临床医疗过程全程大数据、实时诊疗数据以及病人电子病历可视化数据的全景分析提供了新途径,特别是对于区域医疗能够观察到病人以前在其他医院的入院情况,支持在医疗成本和效果之间的平衡,帮助医院进行医疗科研。
2、非结构化数据分析
对于存储于分布式数据库系统的数据,需要进行数据过滤、清晰、转换并集成整合,建立临床数据中心。存在于多个部门的非结构化数据,采用NOSQL 数据库进行数据存储,非结构化或半结构化的管理的核心是Apache Hadoop开发环境的实现,MapReduce 能够将大的工作任务分解为一组离散的任务,将分析后的数据集中存储,并提供可视化展现和医疗决策支持访问。
医疗大数据分析与传统数据分析系统的差别在于大数据分析具有非结构化数据的分析能力,这种非结构化数据是传统的医疗数据库不能处理的。临床电子病历中基于XML文档信息、临床影像、医生处方等,非结构化数据占临床数据总量的80%以上,对这一部分的数据进行处理分析,能够得到相关指证,比如,对医学影像分析,通过与相关疾病典型影像特征对比,得到病人疾病诊断,这对医院改进临床效率控制医疗成本有极大益处。
3、管理决策支持
管理决策支持功能强调日常医疗服务过程分析,以支撑管理决策并采取相关措施。一般来说,管理决策支持依赖于医院信息共享互联互通以及信息数据分析能力,对于重大疾病循证分析综合评判对临床医疗质量管理有重大价值,依据电子病历数据分析,开发个性化诊疗方案有助于提升医院精准医疗水平。
从机构组织层面对医院信息系统产生的大数据进行分析,对于跨部门操作流程进行改进具有重要意义,综合性数据分析能帮助管理者全面了解组织机构存在的薄弱环节并采取对应措施,从实践看,建立临床数据中心数据仓库并与实际生产系统实时交互,对于医疗质量水平提升和病人临床安全具有重要保障作用。
4、预测分析功能
通过医疗大数据使用统计分析工具建立评价模型,对疾病发展转归进行预测是医疗大数据应用的重要方面。大数据的预测功能强调对通过大量数据分析对未来趋势预测,医疗机构的数据分析平台需要与临床数据中心、预测分析算法(如:回归分析、机器学习、神经网络等)等相结合,向医护管工作者提供可视化界面,帮助管理和临床决策。临床大数据中心的建设能够通过过去历史数据对未来提供参考,有助于医院精细化管理和精准化医疗。
在医疗机构,对二次住院预测分析大大降低了病情的不确定性,重症中心ICU病人全程生理参数数据监控分析,进行关键指标的警示和交互干预,使医护工作更有效率,优化了相关操作,降低了医疗风险。同时,有利于形成医护患协同的病人全过程的疾病管理分析,产生最佳医疗实践的疾病诊治流程。
5、数据闭环追溯
医疗数据信息如:费用成本数据、临床数据、药学信息、病人行为数据、设备传感数据等均需实时采集或尽量实时采集。传统临床信息系统数据分散在各个应用系统中,数据不一致,产生冗余矛盾,而且不同部门的设备或不同临床信息应用内部信息数据孤立使临床过程工作流优化也存在困难。数据的闭环追溯有利于以病人为中心的临床需求和部门服务与设备应用的监控。大数据分析提供了全流程、全方位的解决能力,业务系统的数据可实时与数据中心进行数据交互,通过大数据算法进行深度评价分析,医护工作者可即时监控病人状态、追踪相关的警示信息并采取相应措施,对医疗安全和用药安全有重要价值。
总的来说,大数据分析在医疗行业具有广泛的应用前景。首先,医疗行业各个主要角色已经或者开始积累大量数据并为大数据分析创造了条件。不同数据集合的整合和分析面临政策和利益诉求的挑战,但是也带来了新的机遇。其次,医疗行业是一个生态系统并面临诸多问题,大数据分析为解决这些系统性问题提供了新工具。
亿信华辰作为数据分析软件领导厂商,紧跟医疗卫生领域发展趋势,面向国家卫健委及各级医疗卫生单位、机构,提供灵活、可适配的解决方案。
请点击输入图片描述
提供集数据采集、数据治理(含元数据、数据标准、数据质量、数据生命周期管理、数据安全)、数据分析与挖掘、可视化展示一体化的解决方案。
安装驱动pymongo!
输入命令:pip install pymongo
直接使用驱动
ORM框架——flask-mongoengine
输入命令:pip install flask-mongoengine
使用介绍:
创建连接
切换数据库
获取collection
db和collection都是延时创建的,在添加Document时才真正创建
文档添加,_id自动创建
批量插入
获取所有collection(相当于SQL的show tables)
加条件的查询
高级查询
查看查询语句的性能
缺点:
不是全盘取代传统数据库(NoSQLFan:是否能取代需要看应用场景)
不支持复杂事务(NoSQLFan:MongoDB只支持对单个文档的原子操作)
文档中的整个树,不易搜索,4MB限制?(NoSQLFan:1.8版本已经修改为16M)
特点(NoSQLFan:作者在这里列举的很多只是一些表层的特点):
文档型数据库,表结构可以内嵌
没有模式,避免空字段开销(Schema Free)
分布式支持
查询支持正则
动态扩展架构
32位的版本最多只能存储2.5GB的数据(NoSQLFan:最大文件尺寸为2G,生产环境推荐64位)
自身运转情况可在调用mongo自带的命令:
db.serverStatus()
rs.status()
现在有很多第三方监控方案,如munin等,详细你可以看一下参考资料
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流