码迷,mamicode.com
首页 > 数据库 > 详细

01 . MongoDB简介及部署配置

时间:2020-06-19 12:17:25      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:延迟   map函数   配置参数   int   算术运算   deb   hub   isod   append   

简介

什么是MongoDB?

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

主要特点
# MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
# 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sa
meer",Address="8 Gandhi Road")来实现更快的排序。
# 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
# 如果负载的增加(需要更多的存储空间和更强的处理能力)
,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
# Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。 
# MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
# Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
# Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
# Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
# GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
# MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
# MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
# MongoDB安装简单。
MongoDB工具

监控

MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。

Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。

基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。

GUI

# Fang of Mongo – 网页式,由Django和jQuery所构成。
# Futon4Mongo – 一个CouchDB Futon web的mongodb山寨版
# Mongo3 – Ruby写成。
# MongoHub – 适用于OSX的应用程序。
# Opricot – 一个基于浏览器的MongoDB控制台, 由PHP撰写而成。
# Database Master — Windows的mongodb管理工具
# RockMongo — 最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.

MongoDB应用案例

# Craiglist上使用MongoDB的存档数十亿条记录。
# FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
# Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
# bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
# spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
# Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
# sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
# etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
# 纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
# CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。

部署MongoDB

下载解压Mongo.tar包
# 下载地址
https://www.mongodb.com/download-center#community
  
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz 
tar xf mongodb-linux-x86_64-3.0.6.tgz -C /usr/local/
mv /usr/local/mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb

tail -1 /etc/bashrc 
export PATH=/usr/local/mongodb/bin:$PATH
source /etc/bashrc
创建数据库目录

MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

以下实例中我们将data目录创建于根目录下(/)。

注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。

mkdir -p /data/db
启动服务

你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。

注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。

mongod
2020-06-19T09:56:51.152+0800 I STORAGE  [initandlisten] 
2020-06-19T09:56:51.152+0800 I STORAGE  [initandlisten] ** WARNING: Readahead for /data/db is set to 4096KB
2020-06-19T09:56:51.152+0800 I STORAGE  [initandlisten] **          We suggest setting it to 256KB (512 sectors) or less
2020-06-19T09:56:51.152+0800 I STORAGE  [initandlisten] **          http://dochub.mongodb.org/core/readahead
MongoDB后台管理Shell

如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。

MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):

# 启动mongod服务后,再执行mongo就会进入下面命令行
mongo
MongoDB shell version: 3.0.6
connecting to: test
Welcome to the MongoDB shell.

# 新版本MongDB增加了安全性设计,推荐用户创建使用数据库时进行验证。如果用户想建立简单连接,则会提示警示信息
#创建管理员账号并设置密码:
>use admin
switched to db admin
> db.createUser( {user: "firstadmin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]});

Successfully added user: {
    "user" : "firstadmin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}


# 由于它是一个JavaScript shell,还可以运行一些简单的算术运算
> 1+1
2
> 10000+20000
30000

# 我们可以插入一些简单的数据,并对插入数据进行检索
> db.youmen.insert({x:10})
# 这个命令表示将数字10插入到youmen集合的x字段中
WriteResult({ "nInserted" : 1 })
> db.youmen.find()
{ "_id" : ObjectId("5eec1c706808f6fb8fbda718"), "x" : 10 }
MongoDB Web用户界面

MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。

mongod --dbpath=/data/db --rest

# MongoDB 的 Web 界面访问端口比服务的端口多1000。
# 如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017

技术图片

MongoDB概念解析

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

通过下图实例,我们也可以直观的了解Mongo中的一些概念

技术图片

数据库

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

"show dbs" 命令可以显示所有数据的列表。

> show dbs
local  0.078GB
test   0.078GB

# db显示当前数据库对象或集合
> db
test

# use命令,连接到一个指定的数据库
> use local
switched to db local
> db
local

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。

# 不能是空字符串("")。
# 不得含有‘ ‘(空格)、.、$、/、\和\0 (空字符)。
# 应全部小写。
# 最多64字节。

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。

admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的文档例子如下:

{"site":"www.youmen.com", "name":"幽梦"}

下表列出了RDBMS与MongoDB对应的术语

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )
数据库服务和客户端
Mysqld/Oracle mongod
mysql/sqlplus mongo

需要注意的是

# 1. 文档中的键/值对是有序的。
# 2. 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
# 3. MongoDB区分类型和大小写。
# 4. MongoDB的文档不能有重复的键。
# 5. 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

# 文档键命名规范:

# 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
# .和$有特别的意义,只有在特定环境下才能使用。
# 以下划线"_"开头的键是保留的(不是严格要求的)。
集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.youmen.com","name":"幽梦","num":5}

当第一个文档被插入时,集合就会被创建

合法的集合名

# 集合名不能是空字符串""。
# 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
# 集合名不能以"system."开头,这是为系统集合保留的前缀。
# 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
Capped Collections

Capped collections 就是固定大小的collection。

它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。

Capped collections 是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。collection 的数据存储空间值提前分配的。

Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。

由于 Capped collection 是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB 的操作日志文件 oplog.rs 就是利用 Capped Collection 来实现的。

要注意的是指定的存储大小包含了数据库的头信息。

db.createCollection("mycoll", {capped:true, size:100000})

在 capped collection 中,你能添加新的对象。

能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。

使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。

删除之后,你必须显式的重新创建这个 collection。

在32bit机器中,capped collection 最大存储为 1e9( 1X109)个字节。

元数据

数据库的信息是存储在集合中。它们使用了系统的命名空间:

dbname.system.*

在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:

集合命名空间 描述
dbname.system.namespaces 列出所有名字空间。
dbname.system.indexes 列出所有索引。
dbname.system.profile 包含数据库概要(profile)信息。
dbname.system.users 列出所有可访问数据库的用户。
dbname.local.sources 包含复制对端(slave)的服务器信息和状态。

对于修改系统集合中的对象有如下限制。

在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。

{{system.users}}是可修改的。 {{system.profile}}是可删除的。

MongoDB数据类型
数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。

下面说明几种重要的数据类型

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

# 前 4 个字节表示创建 **unix** 时间戳,格林尼治时间 **UTC** 时间,比北京时间晚了 8 个小时
# 接下来的 3 个字节是机器标识码
# 紧接的两个字节由进程 id 组成 PID
# 最后三个字节是随机

技术图片

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:

> var newObject = ObjectId()
> newObject.getTimestamp()
ISODate("2020-06-19T02:44:34Z")

Objectid转换为字符串

> newObject.str
5eec2692383608904cb30cb6
字符串

BSON 字符串都是 UTF-8 编码

时间戳

BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的 日期 类型不相关。 时间戳值是一个 64 位的值。其中:

# 前32位是一个 time_t 值(与Unix新纪元相差的秒数)
# 后32位是在某秒中操作的一个递增的`序数`

在单个 mongod 实例中,时间戳值通常是唯一的。

在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。

BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。

日期

表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。

> var mydate1 = new Date()
> mydate1
ISODate("2020-06-19T02:49:22.128Z")

        
> var mydate2 = ISODate()
> mydate2
ISODate("2020-06-19T02:47:44.664Z")        

# 这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。
# 返回一个时间类型的字符串:
> var mydate1str = mydate1.toString()
> mydate1str
Fri Jun 19 2020 10:49:22 GMT+0800 (CST)
> typeof mydate1str
string

OR

> Date()
Fri Jun 19 2020 10:53:15 GMT+0800 (CST)

MongoDB常用命令及配置文件参数详解

命令参数详解
--logpath    				# 日志文件路径
--master 						# 指定为主机器
--slave 						# 指定为从机器
--source 						# 指定主机器的IP地址
--pologSize 				# 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend 				# 日志文件末尾添加
--port 							# 启用端口号
--fork 							# 在后台运行
--only 							# 指定只复制哪一个数据库
--slavedelay 				# 指从复制检测的时间间隔
--auth 							# 是否需要验证权限登录(用户名和密码)

-h [ --help ]       #      show this usage information
--version            #     show version information
-f [ --config ] arg  #     configuration file specifying additional options
--port arg            #    specify port number
--bind_ip arg         #    local ip address to bind listener - all local ips
                           bound by default
-v [ --verbose ]       #   be more verbose (include multiple times for more
                           verbosity e.g. -vvvvv)
--dbpath arg (=/data/db/)   # directory for datafiles    指定数据存放目录
--quiet                  # quieter output   静默模式
--logpath arg            # file to send all output to instead of stdout   指定日志存放目录
--logappend              # appnd to logpath instead of over-writing 指定日志是以追加还是以覆盖的方式写入日志文件
--fork                   # fork server process   以创建子进程的方式运行
--cpu                    # periodically show cpu and iowait utilization 周期性的显示cpu和io的使用情况
--noauth                 # run without security 无认证模式运行
--auth                   # run with security 认证模式运行
--objcheck               # inspect client data for validity on receipt 检查客户端输入数据的有效性检查
--quota                  # enable db quota management   开始数据库配额的管理
--quotaFiles arg         # number of files allower per db, requires --quota 规定每个数据库允许的文件数
--appsrvpath arg         # root directory for the babble app server 
--nocursors              # diagnostic/debugging option 调试诊断选项
--nohints                # ignore query hints 忽略查询命中率
--nohttpinterface        # disable http interface 关闭http接口,默认是28017
--noscripting           #  disable scripting engine 关闭脚本引擎
--noprealloc             # disable data file preallocation 关闭数据库文件大小预分配
--smallfiles            #  use a smaller default file size 使用较小的默认文件大小
--nssize arg (=16)       # .ns file size (in MB) for new databases 新数据库ns文件的默认大小
--diaglog arg            # 0=off 1=W 2=R 3=both 7=W+some reads 提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式
--sysinfo                # print some diagnostic system information 打印系统诊断信息
--upgrade                # upgrade db if needed 如果需要就更新数据库
--repair                 # run repair on all dbs 修复所有的数据库
--notablescan            # do not allow table scans 不运行表扫描
--syncdelay arg (=60)    # seconds between disk syncs (0 for never) 系统同步刷新磁盘的时间,默认是60s
 
Replication options:
--master             # master mode 主复制模式
--slave              # slave mode 从复制模式
--source arg         # when slave: specify master as <server:port> 当为从时,指定主的地址和端口
--only arg           # when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库
--pairwith arg       # address of server to pair with
--arbiter arg        # address of arbiter server 仲裁服务器,在主主中和pair中用到
--autoresync         # automatically resync if slave data is stale 自动同步从的数据
--oplogSize arg      # size limit (in MB) for op log 指定操作日志的大小
--opIdMem arg        # size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存大小
 
Sharding options:
--configsvr          # declare this is a config db of a cluster 指定shard中的配置服务器
--shardsvr           # declare this is a shard db of a cluster 指定shard服务器

其他配置参数含义
--quiet	# 安静输出
--port arg	# 指定服务端口号,默认端口27017
--bind_ip arg	# 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
--logpath arg	# 指定MongoDB日志文件,注意是指定文件不是目录
--logappend	# 使用追加的方式写日志
--pidfilepath arg	# PID File 的完整路径,如果没有设置,则没有PID文件
--keyFile arg	# 集群的私钥的完整路径,只对于Replica Set 架构有效
--unixSocketPrefix arg	# UNIX域套接字替代目录,(默认为 /tmp)
--fork	# 以守护进程的方式运行MongoDB,创建服务器进程
--auth	# 启用验证
--cpu	# 定期显示CPU的CPU利用率和iowait
--dbpath arg	# 指定数据库路径
--diaglog arg	# diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb	# 设置每个数据库将被保存在一个单独的目录
--journal	# 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
--journalOptions arg	# 启用日志诊断选项
--ipv6	# 启用IPv6选项
--jsonp	# 允许JSONP形式通过HTTP访问(有安全影响)
--maxConns arg	# 最大同时连接数 默认2000
--noauth	# 不启用验证
--nohttpinterface	# 关闭http接口,默认关闭27018端口访问
--noprealloc	# 禁用数据文件预分配(往往影响性能)
--noscripting	# 禁用脚本引擎
--notablescan	# 不允许表扫描
--nounixsocket	# 禁用Unix套接字监听
--nssize arg (=16)	# 设置信数据库.ns文件大小(MB)
--objcheck	# 在收到客户数据,检查的有效性,
--profile arg	# 档案参数 0=off 1=slow, 2=all
--quota	# 限制每个数据库的文件数,设置默认为8
--quotaFiles arg	# number of files allower per db, requires --quota
--rest	# 开启简单的rest API
--repair	# 修复所有数据库run repair on all dbs
--repairpath arg	# 修复库生成的文件的目录,默认为目录名称dbpath
--slowms arg (=100)	# value of slow for profile and console log
--smallfiles	# 使用较小的默认文件
--syncdelay arg (=60)	# 数据写入磁盘的时间秒数(0=never,不推荐)
--sysinfo	# 打印一些诊断系统信息
--upgrade	# 如果需要升级数据库

#Replicaton 参数
--fastsync	# 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
--autoresync	# 如果从库与主库同步数据差得多,自动重新同步,
--oplogSize arg	# 设置oplog的大小(MB)

#主/从参数
--master	# 主库模式
--slave	# 从库模式
--source arg	# 从库 端口号
--only arg	# 指定单一的数据库复制
--slavedelay arg	# 设置从库同步主库的延迟时间

#Replica set(副本集)选项:
--replSet arg	# 设置副本集名称

#Sharding(分片)选项
--configsvr	# 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
--shardsvr	# 声明这是一个集群的分片,默认端口27018
--noMoveParanoia	# 关闭偏执为moveChunk数据保存
配置文件参数详解
# 简单示例
# 数据库数据存放目录
dbpath=/usr/local/mongodb/data
# 数据库日志存放目录
logpath=/usr/local/mongodb/logs/mongodb.log 
# 以追加的方式记录日志
logappend = true
# 端口号 默认为27017
port=27017 
# 以后台方式运行进程
fork=true 
# 开启用户认证
auth=true
# 关闭http接口,默认关闭http端口访问
#nohttpinterface=true
# mongodb所绑定的ip地址
#bind_ip = 127.0.0.1 
# 启用日志文件,默认启用
journal=true 
# 这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true

01 . MongoDB简介及部署配置

标签:延迟   map函数   配置参数   int   算术运算   deb   hub   isod   append   

原文地址:https://www.cnblogs.com/you-men/p/13162046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!