上一页 1 2 3 4 5 6 ··· 16 下一页
摘要: 历经三个多月开发,终于完成了这三个库的编码工作。用到的开发语言主要有使用了C++(含部分Object-c),JAVA,C#。经过检测,目前已正式投入到生产环境中。为了实现三种语言一种命名方式,我采用了相同的类名,接口,namespace(package)。可以说只要熟悉了其中一个平台的代码,就可以很顺利的写出另外两个平台的滤镜代码(当然我后续还会加入更多的滤镜效果)。该库基于LGPL协议,也就是说大家可以将其免费用于自己公司的项目及产品中(包括商业项目)。当然如果大家用后觉得还可以的话,可以私下洽谈合作事宜(包括商业方面的),呵呵! 下面是使用这三个滤镜类库所实现的滤镜效果。 阅读全文
posted @ 2012-05-15 13:54 代震军 阅读(17519) 评论(34) 推荐(31) 编辑
摘要: 今天在分析leveldb(google的bigtable的核心组件之一)代码时看到了如下的一段代码:leveldb\util\coding.cc char*EncodeVarint32(char*dst,uint32_tv){//Operateoncharactersasunsignedsunsignedchar*ptr=reinterpret_cast<unsignedchar*>(dst);staticconstintB=128;if(v<(1<<7)){*(ptr++)=v;}elseif(v<(1<<14)){*(ptr++)=v|B;* 阅读全文
posted @ 2012-04-28 14:57 代震军 阅读(1548) 评论(2) 推荐(1) 编辑
摘要: 在开发LLServer的同时,我一直在跟进测试企业版的相应LLServer客户端,目前这部分代码已测试完毕并提交的Discuz!NT产品中,会跟随最新的源码包一并发布。本文主要是介绍一下产品中引入LLServer的架构思路。在Discuz!NT的企业版产品中,使用了Memcached,Redis这两个软件来提供分布式缓存服务(两者任选其一)。现有又有了LLServer,它不仅提供了KEY/VALUE缓存,还包括持久化存储部分。这样,用户可以有更多大的选择余地。下面是Discuz!NT的企业版分布式缓存中一个架构图: 阅读全文
posted @ 2011-08-26 11:13 代震军 阅读(8679) 评论(17) 推荐(6) 编辑
摘要: LLServer是本人基于libevent和leveldb这两个开源软件,开发的轻量级数据存储服务器软件,借助libevent高效网络接口实现对leveldb的访问封装。项目网址:http://code.google.com/p/llserver/. 使用环境:Linux. 作者:代震军. 目前发布版本:1.0 阅读全文
posted @ 2011-08-23 13:20 代震军 阅读(7654) 评论(17) 推荐(11) 编辑
摘要: 在之前的文章中,介绍了关于master-slave模式下的主从端代码的执行流程,因为当时篇幅所限,未对oplog的数据结构以及mongodb的 local数据库作过多阐述,而这可能会让不知道其内容的朋友看代码时云里雾里找不到头绪,今天我专门用一篇文章来大致解释一下(这些内容可能会在后面章节中有所涉及)。首先了解一个local数据库: 在mongod中,出于特殊目的(复制机制),保留性使用了local数据库。当使用认证机制时,对local数据库等同于认证admin数据库。 阅读全文
posted @ 2011-06-27 11:50 代震军 阅读(10360) 评论(3) 推荐(4) 编辑
摘要: 在上文中介绍了主从(master-slave)模式下的一些基本概念及master的执行流程。今天接着介绍一下从(slave)结点是如何发起请求,并通过请求获取的oplog信息来构造本地数据的。 不过开始今天的正文前,需要介绍一下mongodb在slave结点上进行数据同步时的一个大致流程: 阅读全文
posted @ 2011-06-20 08:32 代震军 阅读(7202) 评论(5) 推荐(5) 编辑
摘要: 很久没写口水文了,因为一直没有像样的话题。另外作为一个技术从业者,写那类东东实在没什么意思。但昨天与公司销售一起去一家客户那做技术交流的过程中发现了技术之外的话题,我想很多公司可能也正在上演以这类话题所引发的冲突,所以就一并以流水帐的方式呈现出来了。因为这次是客户那边的CTO 对我们产品有疑问,所以之前我们早早准备了一些资料和相关测试说明文档,希望能全方位的介绍一下我们产品特别是企业版的细节和应用场景。这里要说明的是因为这家公司在过去不到一年的时间里因为技术和商务那边内耗过重,经历了两轮大的人事变动,基本上技术部门人员流失怠尽,而早期与我们接触的技术人员已全部离任。 阅读全文
posted @ 2011-06-17 11:27 代震军 阅读(15200) 评论(107) 推荐(18) 编辑
摘要: mongodb中提供了复制(Replication)机制,通过该机制可以帮助我们很容易实现读写分离方案,并支持灾难恢复(服务器断电)等意外情况下的数据安全。在老版本(1.6)中,Mongo提供了两种方式的复制:master-slave及replica pair模式(注:mongodb最新支持的replset复制集方式可看成是pair的升级版,它解决pair只能在两个结点间同步的限制,支持多个结点同步且支持主从宕机时的自动切换)。 阅读全文
posted @ 2011-06-13 12:47 代震军 阅读(8006) 评论(7) 推荐(5) 编辑
摘要: 在之前的一篇文章中,介绍了mongos的balaner的执行流程,其中在源码中的Balancer::run()方法里简单说明了为了连接到 configserver,balancer通过构造ScopedDbConnection实现来链接并执行相应操作,因为当时篇幅所限,只是该链接使用池化的方式一带而过,今天就专门介绍一下mongodb中使用池化方式来管理链接对象以提升链接效率的原理。 阅读全文
posted @ 2011-06-07 09:03 代震军 阅读(8359) 评论(2) 推荐(2) 编辑
摘要: 在之前的一篇文章中,介绍了balancer会声明使用分布式锁来协调分布式环境下的信息沟通并确保事务一致性,有关分布式锁的一些原理性信息可以参见这几篇文章:http://wenku.baidu.com/view/19ce3085b9d528ea81c77982.html http://wenku.baidu.com/view/d94ac11ffc4ffe473368ab27.html 阅读全文
posted @ 2011-05-30 09:52 代震军 阅读(8609) 评论(2) 推荐(4) 编辑
摘要: 在之前的一篇文章中,介绍了mongos的启动流程,在那篇文章的结尾,介绍了mongos使用balancer来进行均衡,今天就继续讲其实现方式。首先我们看一下Balancer及相关实现策略的类图: 阅读全文
posted @ 2011-05-23 10:53 代震军 阅读(11597) 评论(10) 推荐(4) 编辑
摘要: MongoDB提供了auto-sharding 功能。因为其是auto-sharding,即mongodb通过mongos(一个自动分片模块,用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器)自动建立一个水平扩展的数据库集群系统,将数据库分表存储在sharding的各个节点上。 阅读全文
posted @ 2011-05-16 10:16 代震军 阅读(13099) 评论(5) 推荐(3) 编辑
摘要: 在这个系列的开头几篇文章中,曾经介绍了Mongodb的查询流程,因为篇幅所限,并未介绍对cursor进行遍历查询时,如何将查询记录装填进结果集中。今天就针对诸如"select top n"这类返回一定数量记录的查询操作,来分析mongodb是如何将查询结果装填到结果集中的。这里要说明的是之前文章中的大部分程序流程,在select top 这类操作也都是要执行的,所以这里接着之前文章所说的内容,继续向底层挖掘相应的功能逻辑: 阅读全文
posted @ 2011-05-05 18:00 代震军 阅读(5173) 评论(6) 推荐(2) 编辑
摘要: Command在Mongodb中是一类特殊操作,它提供了强大的管理及各项操作(比如建库,索引,删除集合等)。可以说通过Command可以完成几乎所有想做的事情。同时Mongodb开发者在Command上又做了非常清晰体系架构和设计,便于管理和高效执行各种类型的Command。 今天就专门用一篇篇幅来着重介绍一下其Command的体系架构,并用例子来介绍mongod是如何将Command引入其中的。 阅读全文
posted @ 2011-04-29 11:55 代震军 阅读(6144) 评论(3) 推荐(4) 编辑
摘要: 在Mongodb中,其使用了操作系统底层提供的内存映射机制,即MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了。同时操作系统会将数据刷新保存到磁盘上。如下图: 阅读全文
posted @ 2011-04-25 08:36 代震军 阅读(12102) 评论(6) 推荐(7) 编辑
摘要: 在Mongodb中,其提供了类似关系型数据中cursor对象来遍历数据集合,同时mongodb并要根据不同的场景生成不同的游标对象(cursor),比如顺序遍历游标(basicCursor),反向游标(reverseCursor), B树索引游标(btreeCursor)等。 下面是其游标体系架构类图,cursor.cpp, cursor.h, clientcursor.cpp, clientcursor.h 阅读全文
posted @ 2011-04-15 11:29 代震军 阅读(10015) 评论(6) 推荐(2) 编辑
摘要: 在之前的一篇文章中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下: 可以看到dbUpdate = 2001 为更新操作枚举值,下面我们看一下assembleResponse在确定是更新操作时调用的方法,如下: 阅读全文
posted @ 2011-04-11 09:49 代震军 阅读(6262) 评论(6) 推荐(2) 编辑
摘要: 在之前的一篇文章中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下...可以看到dbDelete = 2002 为删除操作枚举值。当客户端将要删除的记录(或条件的document)发到服务端之后,mongodb通过消息封装方式将数据包中的字节流解析转成 message类型,并进一步转换成dbmessage之后,mongodb就会根据消息类型进行判断,以决定接下来执行的操作),下面我们看一下 assembleResponse在确定是删除操作时调用的方法,如下: 阅读全文
posted @ 2011-04-06 14:11 代震军 阅读(7777) 评论(2) 推荐(3) 编辑
摘要: 在Mongodb中,客户端和服务端进行通信是基于mongodb wire protocol。说白了,该协议是一个简单的基于socket,请求/响应方式的协议,客户端使用常规的TCP/IP套接字(socket)进行通信。客户端与服务端使用约定的消息(格式)进行通信,其消息头结构与C语言中的struct类似。具体的代码(位于message.cpp): 阅读全文
posted @ 2011-04-02 14:45 代震军 阅读(5399) 评论(3) 推荐(5) 编辑
摘要: 在之前的mongodb查询流程中,介绍了assembleResponse函数(位于instance.cpp第224行),它会根据op操作枚举类型来调用相应的crud操作,枚举类型定义如下: enum Operations { opReply = 1, /* reply. responseTo is set. */ dbMsg = 1000, /* generic msg command followed by a string */ dbUpdate = 2001, /* update object */ 阅读全文
posted @ 2011-03-30 13:23 代震军 阅读(9150) 评论(11) 推荐(4) 编辑
上一页 1 2 3 4 5 6 ··· 16 下一页