0%

GridFS

https://docs.mongodb.com/manual/core/gridfs/index.html#use-gridfs

GridFS 用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等)。

GridFS 也是文件存储的一种方式,但是它是存储在MonoDB的集合中。

GridFS 可以更好的存储大于16M的文件。

GridFS 会将大文件对象分割成多个小的chunk(文件片段),一般为256k/个,每个chunk将作为MongoDB的一个文档(document)被存储在chunks集合中。

GridFS 用两个集合来存储一个文件:fs.files与fs.chunks。

每个文件的实际内容被存在chunks(二进制数据)中,和文件有关的meta数据(filename,content_type,还有用户自定义的属性)将会被存在files集合中。

阅读全文 »

聚合

聚合通常在mysql中是group by,例如统计sum等操作,MongoDB也为我们提供了聚合操作,但是实现却不一样。

group()

这次需要的数据会比较多,这次直接用js来准数据。

1
2
3
4
for(var i = 1; i < 30; ++i ) {
var count = i % 5;
db.mygroup.insert({name: 'name' + i, count : count});
}
阅读全文 »

查询

MongoDB为我们提供了很强大的查询功能,之前演示的都比较简单,接下来将展示一些进阶用法。

数据准备

1
2
3
4
db.personalinfo.remove({});
db.personalinfo.save({name:'zhangsan',age:10});
db.personalinfo.save({name:'lisi',age:11});
db.personalinfo.save({name:'wangsu',age:12});
阅读全文 »

Netty处理器

编解码器本质上也是ChannelHandler的特殊实现,Netty本身为我们提供了很多处理器。

Netty处理器重要概念:

  1. Netty的处理器可以分为两类:入站处理器与出站处理器。
  2. 入站处理器的顶层是ChannelInboundHandler,出站处理器的顶层是ChannelOutboundHandler。
  3. 数据处理时常用的各种编解码器本质上都是处理器。
  4. 编解码器:无论我们向网络中写入的数据是什么类型(int、char、String、二进制等),数据在网络中传递时,其都是以字节流的形式呈现的;将数据由原本的形式转换为字节流的操作称为编码(encode),将数据由字节转换为它原本的格式或是其他格式的操作称为解码(decode),编解码统一称为codec。
  5. 编码:本质上是一种出站处理器,因此,编码是一种ChannelOutboundHandler。
  6. 解码:本质上是一种入站处理器,因此,解码是一种ChannelInboundHandler。
  7. 在Netty中,编码器通常以XXXEncoder命名;解码器通常以XXXDecoder命名。
阅读全文 »

安装

https://www.mongodb.com/download-center

按照传统的方式,可以在这里下载mongo的安装包进行安装。

OSX

如果是mac系统,并且按照了brew,可以直接执行brew install mongodb进行安装。

docker

现在用docker快速的搭建软件环境已经非常方便了,所以我在这里将使用docker下载mongo的镜像来部署mongo,方便随后的测试。

https://hub.docker.com/_/mongo/

阅读全文 »

cherry-pick

cherry-pick可以将你对某个分支的修改信息应用到另外一个分支上。

应用场景

在现有一个文件在master分支上,但是却不小心在develop分支上做了修改并新增了两次提交,也就是提交错了分支。

传统方式是我们备份好已经修改的文件然后切换分支再复制过去,这样做太低效了,而且容易出错。

我们可以用cherry-pick来解决这个问题。

阅读全文 »

裸库

通常我们在本地初始化仓库的时候,都是用git init。如果我们不借助github,如何自己建立一个中心仓库呢,这个就是裸库的概念。

git init --bare <repo>

这个命令执行后,将在本地创建一个名为 repo 的文件夹, 里面包含着 Git 的基本目录, 我们一般会将这个文件夹命名为后面加 .git 的形式,如 repo.git (这也是为什么我们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的原因).使用 –bare 参数初始化的仓库,我们一般称之为裸仓库, 因为这样创建的仓库并不包含 工作区 , 也就是说,我们并不能在这个目录下执行我们一般使用的 Git 命令。

阅读全文 »

源码分析(三)

前面我们已经了解了Netty的启动流程,以及各个组件之间的关系,接下来要看看Netty的数据容器(ByteBuf)。

回顾Java NIO

先回顾一下Java NIO的Buffer使用方式。

使用NIO进行文件读取所涉及的步骤:

  1. 从FileInputStream对象获取到Channel对象。
  2. 创建Buffer.
  3. 将数据从Channel中读取到Buffer对象中。

0 <= mark <= postion <= limit <= capacity

flip()方法切换读和写的状态:

  1. 将limit值设为当前的position。
  2. 将position设为0.
阅读全文 »

refspec

Reference Specification简称refspec。
在执行push或fetch操作时,refspec用以给出本地Ref和远程Ref之间的映射关系,通常是本地分支或本地tag与远程库中的分支或tag之间的映射关系。

refspec格式:
+:
其中的+是可选的,表示强制更新
典型的push refspec为HEAD:refs/heads/master
典型的fetch refspec为refs/heads/:refs/remotes/origin/

阅读全文 »

Git远程仓库

Git本身是一个分布式的版本控制系统,每个用户的机器上都会有一个完整的版本库。之前我们的操作都是在本地机器上操作的,最终别人需要获取我们的修改,需要我们将本地的修改推送(push)**到远程机器上,然后别人再拉取(pull)**合并我们的代码。

说到远程仓库呢,就不得不提一下Github,全球最大的同性交友社区(😄开个玩笑)。

https://github.com/

Github是免费使用的条件就是你在上面创建的代码都是开源的,开源被查看的,如果要想创建私有的仓库,就是需要收费的。那么应运而生的产生了一个叫Gitlab的开源产品可以让我们在公司的服务器搭建私有的仓库,让我们可以享受到免费的,私有的,内网的服务。

阅读全文 »