169it科技资讯
169it -->


当前位置:  数据库>nosql
本页文章导读:
    ▪关于twemproxy和redis分布式      为什么要使用twemproxy出于两点原因:1 redis是单线程实例,若要获得多核的好处,只能实现多个实例,实例之间不能共享数据,只能sharding2 若数据量太大,则必须分布式部署redis,使用sharding两......
    ▪NoSQL学习之路(四):创建、读取、更新、删除(CRUD)        本文地址:http://www.cnblogs.com/egger/archive/2013/05/01/3053239.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑!  本文介绍数据库的4个基本操作:创建、读取、更新和删除(CRUD)。  Mo......
    ▪NoSQL学习之路 (五):查询操作符(Query Operators).1st        本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059374.html   欢迎转载 ,请保留此链接๑•́ ₃•̀๑!    查询操作符(Query Operators)可以让我们写出复杂查询条件,让我......
      最新IT科技资讯推荐: -1

[1]关于twemproxy和redis分布式
    来源:    发布时间: 2013-10-18

为什么要使用twemproxy

出于两点原因:

1 redis是单线程实例,若要获得多核的好处,只能实现多个实例,实例之间不能共享数据,只能sharding

2 若数据量太大,则必须分布式部署redis,使用sharding

两个原因其实可以归为一个,如何分布式部署redis。 而redis本身并不支持分布式部署,只支持master-slave,若客户端直接操作redis的话,就必须在应用层编写sharding和节点监控的代码。

如果使用twemproxy作为代理,客户端不直接操作redis只是访问rwemproxy,sharding和节点监控以及其他一些麻烦的工作rwemproxy都帮我们做好了,只需要配置即可。

项目应用的时候,我们可能会把redis作为数据存储也可能会拿来做缓存,第一种情况我们需要在配置中做静态映射,第二种情况我们允许自动卸载失败节点,过一段时间重试,这时候数据可能会被写到另外一个节点,导致弱一致性。

注意的地方:1 twemproxy也是单线程实例,在生产环境可能需要启动多个实例以发挥多核的能力。

      2不支持除mget,del之外的redis批处理命令,如取多个集合交集等等

          3不支持脚本eval

      4twemproxy不能够拿从节点作为替代方案

 

本文链接


    
[2]NoSQL学习之路(四):创建、读取、更新、删除(CRUD)
    来源:    发布时间: 2013-10-18

  本文地址:http://www.cnblogs.com/egger/archive/2013/05/01/3053239.html  欢迎转载 ,请保留此链接๑•́ ₃•̀๑!


  本文介绍数据库的4个基本操作:创建、读取、更新和删除(CRUD)。


  MongoDB没有类似sqlserver 的manager studio、mysql的workbench等工具。接下来的数据库操作演示,我们只能使用MongoDB自带简洁但功能强大的JavaScript shell,MongoDB shell是一个独立的DB客户端(它也是功能完备的JavaScript解释器 可以运行任何JavaScript程序),MongoDB shell的使用介绍请阅读博文《NoSQL学习之路(三):MongoDB Shell的使用》。


CRUD
1.C 创建

  insert函数添加一个文档到集合里面。


  直接将文档作为参数:  


  >db.post.insert({"title":"Ex.1"})


  或者将文档赋值给变量,变量作为方法的参数。


  下面我们添加一篇文章。首先,创建一个局部变量post,JavaScript对象作为文档的内容的赋值给post。里面会有"title","author","content"和"date"等键值。 


  


  使用count()查询集合中文档条数:


  


当我们成功的插入一条文档到集合中后,我们会发现多了一个键"_id"和自动生成的ObjectId类型值。[详情:MongoDB的ObjectID]


当插入多个文档到一个集合的时候,请使用批量插入会快一些。批量插入能传递一个由文档构成的数组给数据库。这样避免了许多零碎的请求所带来的开销。


要是只是导入原始数据(例如,从MySQL中导入 ),可以使用命令行工具,如mongoimport,而不是使用批量插入。另一方面,可以用它在存入MongoDB之前对数据做一些小的修整(转换日期成为日期类型,或添加自定义的"_id"所以批量插入对导入数据来说也是有用的。  


当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库。数据库解析BSON,检验是否包含"_id"键并且文档不超过4MB。要查看doc文档转为BSON的大小(以字节为单位),在shell中运行 Object.bsonsize(doc)即可。
MongoDB在插入时并不执行代码,不做别的数据验证,就只是简单地将文档原样存入数据库中.虽然会导致插入无效的数据,但是它能让数据库更加安全,远离注入式攻击。


2.R读取

  find会返回集合里面所有的文档。findOne(注意大小写 findone 是无效的)查看一个文档。


  find和findOne可以接受査询文档形式的限定条件。这将通过査询限制匹配的文档。使用find时,shell自动显示最多20个匹配的文档,但可以获取更多文档。


  


 


3.U更新

  更新操作是原子的:若是两个更新同时发生,先到达服务器的先执行,接着执行另外的。  


  update接受(至少)两个参数:第一个是要更新文档的限定条件,第二个是新的文档。


  注意:若是集合中有多个文档匹配查询条件,更新时会查询条件匹配了,然后更新的时候由于第二个参数的存在就产生重复的"_id"值,数据库会报错。限定条件尽量只能筛选出一条文档记录来。


  假设决定给我们先前写的文章增加标签,则需要增加一个新的键,对应的值是存放标签的数组。
  第一步修改变量post,增加"tags"键:


  


  shell输入post回车,post变量中文档值已经包含了tags数组了。


  


  使用update方法更新文档后,文档中便有了"tags"键的内容。


4.D删除

  remove用来从数据库中永久性地删除文档,不能回复和撤销。


  在不使用参数进行调用的情况下,它会删除一个集合内的所有文档,不会删除集合本身,原有的索引也会保留。。


  >db.posts.remove()


  它也可以接受一个文档以指定限定条件作为参数。现在集合中只有一条文档记录,我们指定限定条件进行删除操作::



  
  集合现在又是空的了。


  如果要清除整个集合,直接删除集合(然后重建索引)会更快,使用drop_collection函数。


  >>db.drop_collection(collection_name)


 
Objectld

    官方wiki:http://docs.mongodb.org/manual/reference/object-id/


  当我们成功的插入一条文档到集合中后,我们会发现多了一个键"_id"和自动生成的ObjectId类型值。通常会在客户端由驱动程序完成。原因如下:



  • MongoDB的设计理念:能从服务器端转移到驱动程序来做的事,就尽量转移。扩展应用层也要比扩展数据库层容易得多。将事务交由客户端来处理,就减轻了数据库扩展的负担。

  • 在客户端生成Objectld,驱动程序能够提供更加丰富的API。















  集合中每个文档都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。Objectld是"_id"的默认类型,它是一种轻量型的,不同的机器都能用全局唯一的同种方法轻量的生成它。mongodb从开始设计就被定义为分布式数据库,处理多个节点是一个核心要求。若采用传统的自增主键策略,在多台服务器上同步自动增加主键既费力又费时。


  


 





0
1
2
3
4
5
6
7
8
9
10
11
















时间戳
机器名
PID
计数器













































 


 


  


  ObjectId占用12字节的存储空间,每个字节两位十六进制数字,是一个24位的字符串。由“时间戳” 、“机器名”、“PID号”和“计数器”组成。使用机器名的好处是在分布式环境中能够避免单点计数的性能瓶颈。使用PID号的好处是支持同一机器内运行多个mongod实例。最终采用时间戳和计数器的组合来保证唯一性。



  1.时间戳  4个字节。从标准纪元开始,单位为秒。



  • 时间戳,与随后的5个字节(机器名+PID)组合起来,提供了秒级别的唯一性。

  • 由于时间戳在前,这意味着Objectld大致会按照插入的顺序排列,这对于某些方面很有用,如将其作为索引提高效率,但是这个是没有保证的。

  • 这4个字节也隐含了文档创建的时间。绝大多数驱动都会公开一个方法从Objectld获取这个信息。
















  2.机器名  3个字节。所在主机的唯一标识符。通常是机器主机名的散列值,机器名通过Md5加密后取前三个字节。


  3.PID  2个字节。为了确保在同一台机器上并发的多个进程产生的Objectld是唯一的,所以加上进程

    
[3]NoSQL学习之路 (五):查询操作符(Query Operators).1st
    来源:    发布时间: 2013-10-18

  本文地址:http://www.cnblogs.com/egger/archive/2013/05/04/3059374.html   欢迎转载 ,请保留此链接๑•́ ₃•̀๑!  


  查询操作符(Query Operators)可以让我们写出复杂查询条件,让我们使用的过程更加灵活。


  官方文档中使用的“field”单词,RDBMS中是字段的意思,但是MongoDB作为文档数据库,使用的BSON格式作为数据存储格式。field对应key,我这里还是把他翻译成“字段”而不是“键”。若有不妥,请指出。


  演示数据:

  我们将实际操作下。先向集合inventory插入3条数据,文档内容如下:



  {"name":"t1","amount":16,"tags":[ "school", "book", "bag", "headphone", "appliances" ]}
  {"name":"t2","amount":50,"tags":[ "appliances", "school", "book" ]}
  {"name":"t3","amount":58,"tags":[ "bag", "school", "book" ]}












  


比较查询操作符 Comparison Query Operators 
  $all

语法: { field: { $all: [ <value> , <value1> ... ] }


  field:文档中键的名称(不使用双引号)。


  匹配那些指定键的键值中包含数组,而且该数组包含条件指定数组的所有元素的文档。



db.inventory.find( { tags: { $all: [ "appliances", "school", "book" ] } } )


  查询出在集合inventory中 tags键值包含数组,且该数组中包含appliances、school、 book元素的所有文档  ,因此该查询将匹配tags键值包含如下任意数组的所有文档。



[ "school", "book", "bag", "headphone", "appliances" ]
[ "appliances", "school", "book" ]


  执行上面的查询语句,


  




  文档中键值类型不是数组,也可以使用$all操作符进行查询操作,如下例所示:



//查询结果是相同的,匹配amount键值等于50的文档
db.inventory.find( { amount: {$all:[50]}} )
db.inventory.find( { amount: 50}} )


  

 


  $gt

语法:{field: {$gt: value} }


  匹配键值大于指定值的所有文档。


 


  $gte

语法:{field: {$gte: value} }


  匹配键值不小于指定值的所有文档。


 


  $lt

语法:{field: {$lt: value} }


  匹配键值小于指定值的所有文档。


 


  $lte

语法:{field: {$lte: value} }


  匹配键值不大于指定值的所有文档。



//下面将查询amount键值大于50的文档:
db.inventory.find( { amount: { $gt: 50 } } )
//下面将查询amount键值不小于(大于等于)50的文档:
db.inventory.find( { amount: { $gte: 50 } } )
//下面将查询amount键值小于50的文档:
db.inventory.find( { amount: { $lt: 50 } } )
//下面将查询amount键值不大于(小于等于)50的文档:
db.inventory.find( { amount: { $lte: 50 } } )


  


  


 




  $in

语法: { field: { $in: [<value1>, <value2>, ... <valueN> ] } }


  匹配键值等于指定数组中任意值的文档。类似sql中in.


 


  $nin

语法: { field: { $nin: [ <value1>, <value2> ... <valueN> ]} }


  匹配键不存在或者键值不等于指定数组的任意值的文档。


  查询出amount键值为16或者50的文档:



db.inventory.find( { amount: { $in: [ 16, 50 ] } } )


  



//查询出amount键值不为16或者50的文档
db.inventory.find( { amount: { $nin: [ 16, 50 ] } } )
//查询出qty键值不为16或50的文档,由于文档中都不存在键qty,所以返回所有文档
db.inventory.find( { qty: { $nin: [ 16, 50 ] } } )


  


 


  $ne

语法: {field: {$ne: value} }


  匹配键值不等于指定值的文档。


  查询出amount键值不等于58的文档:



db.inventory.find( { amount: { $ne: 58 } } )
//$nin查询结果相同
db.inventory.find( { amount: { $nin: [58] } } )


  


 


逻辑查询操作符 Logical Query Operators
  $and

语法: { $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }


  $and 指定一个至少包含两个表达式的数组,选择出满足该数组中所有表达式的文档。$and操作符使用短路操作,若第一个表达式的值为“false”,余下的表达式将不会执行。



//选择name为“t1”,amount值小于50的文档数据
db.inventory.find({ $and: [ { name: "t1" }, { amount: { $lt:50 } } ] } )


   


  对于下面使用逗号分隔符的表达式列表,MongoDB会提供一个隐式的$and操作:



//等同于{ $and: [ { name: "t1" }, { amount: { $lt:5      
    
最新技术文章:
▪30G 的redis 如何优化 - 沐訫    ▪[教程]MongoDB 从入门到进阶 (User系统) - magicD    ▪Redis使用总结之与Memcached异同 - ceecy
▪MongoDB学习 (六):查询 - 辞职回家卖烧饼    ▪在.net中使用aquiles访问Cassandra(一) - amwicfai    ▪在.net中使用aquiles访问Cassandra(二) - amwicfai
▪高性能队列Fqueue的设计和使用实践 - 蒋叶湖    ▪MongoDB开发学习 - 喵 喵    ▪MongoDB开发学习 - 喵 喵
▪Spring-MongoDB简单操作 - CN.programmer.Luxh    ▪MongoDB 聚合 - 蒋叶湖    ▪nosql数据库 - 蒋叶湖
▪Spring-MongoDB简单操作    ▪Redis源码研究--字典    ▪Redis源码研究--字典 - feiyunruyue
▪[译]Cassandra 架构简述    ▪[译]Cassandra 架构简述    ▪Spring-MongoDB简单操作
▪MongoDB 聚合    ▪NoSQL生态系统    ▪NoSQL生态系统
▪nosql数据库    ▪mongodb持久化    ▪MongoDB 聚合
▪CentOS 6上的redis搭建实战记录    ▪非关系型数据库的研究与实践    ▪高性能队列Fqueue的设计和使用实践
▪php中使用memcached的性能问题    ▪NoSQL架构实践(二)——以NoSQL为主    ▪NoSQL架构实践(三)——以NoSQL为缓存
▪在MongoDB中一起使用$or和sort()时,查询性能差    ▪[转]NoSQL生态系统    ▪NoSQL数据库探讨之一 - 为什么要用非关系数
▪初识Redis及Redis在Windows下的安装和使用    ▪MongoDB 开发学习    ▪Redis.conf
▪关于twemproxy和redis分布式    ▪NoSQL学习之路(四):创建、读取、更新、删除    ▪NoSQL学习之路 (五):查询操作符(Query Operators).1st
▪NoSQL学习之路(三):MongoDB Shell的使用    ▪NoSQL学习之路 (二):MongoDB 数据类型和基本    ▪NoSQL学习之路 (一):MongoDB 环境的搭建
▪NoSQL学习之路 (一):mongoDB 环境的搭建    ▪NoSQL学习之路 (一):mongoDB 环境的搭建和shel    ▪NoSQL学习之路 (二):mongoDB 数据类型和基本
▪那点所谓的分布式——redis    ▪mongodb查询嵌入式文档    ▪NoSQL历史简介
▪Mongo服务器集群配置学习三——分片    ▪MongoDB 导出和导入命令的使用    ▪HBase常用的数据库API操作
▪启动HBase后遇到的一个问题    ▪Mongo服务器集群配置学习一——主从复制    ▪Mongo服务器集群配置学习二——副本集
▪完全分布式安装HBase    ▪搞一些好玩的东西——redis    ▪Tair监控及统计技巧
▪MongoDB 之旅(四) 深入学习    ▪MongoDB 问题123    ▪MongoDB——安装部署以及简单的运用
▪MongoDB 之旅(一) 简介    ▪MongoDB 之旅(二) 基本操作(MongoDB Javascript Sh    ▪MongoDB 之旅(三) 基本管理(MongoDB Javascript Sh
▪mongoDB之windows下安装mongo数据库服务    ▪mongoDB之数据备份恢复工具    ▪CentOS通过yum安装CouchDB
▪MongoDB从入门到提高【第一集】---------MongdoDB配    ▪MongoDB从入门到提高【第二集】---------MongdoDB权    ▪[教程]MongoDB 从入门到进阶 (TextSearch)
▪mongodb数据文件格式    ▪在Window平台安装MongoDB    ▪mongodb journal文件格式
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2015,169IT.COM,站长邮箱:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号