IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MongoDB---管理,备份恢复,应用场景 -> 正文阅读

[大数据]MongoDB---管理,备份恢复,应用场景

1.用户管理

????????MMongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全, 需创建数据库用户。

? ? ? ? 权限说明:

read
允许用户读取指定数据库? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
readWrite
允许用户读写指定数据库
dbAdmin
允许用户在指定数据库中执行管理函数,如索引创建、删除,查看,统计或访问system.profile.
userAdmin
允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户.
clusterAdmin
只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase
只在 admin 数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase
只在 admin 数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase
只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
dbAdminAnyDatabase
只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限
root
只在 admin 数据库中可用。超级账号,超级权限

创建用户:

{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
语法说明
user 字段:用户的名字 ;
pwd 字段:用户的密码 ;
cusomData 字段:为任意内容,例如可以为用户全名介绍 ;
roles 字段:指定用户的角色,可以用一个空数组给新用户设定空角色;
roles 字段:可以指定内置角色和用户定义的角色

创建管理员用户:

进入管理数据库
> use admin
创建管理用户, root 权限
db.createUser(
{
????????user: "root",
????????pwd: "root",
????????roles: [ { role: "root", db: "admin" } ]
????????}

?)

注意:
创建管理员角色用户的时候,必须到 admin 下创建。
删除的时候也要到相应的库下操作。
查看创建完用户后的 collections
????????> show tables;
查看创建的管理员用户
????????> show users
验证用户是否能用
????????> db.auth("root","root")
用户创建完成后在配置文件中开启用户验证
????????cat >>/etc/mongod.conf<<-'EOF'
????????security:
????????authorization: enabled
????????EOF
重启服务
????????systemctl restart mongod
登陆测试,注意登陆时选择 admin 数据库
注意:用户在哪个数据库下创建的,最后加上什么库。
方法一:命令行中进行登陆
????????[mongod@MongoDB ~]$ mongo -uroot -proot admin
方法二:在数据库中进行登陆验证:
????????> use admin
????????switched to db admin
????????> db.auth("root","root")
按生产需求创建用户:
?
创建对某库的只读用户 ,在test 库创建只读用户 test
myRS:PRIMARY> db.createUser(
... {user: "test",pwd: "test",roles: [{ role: "read", db: "test"}]})
Successfully added user: {
	"user" : "test",
	"roles" : [
		{
			"role" : "read",
			"db" : "test"
		}
	]
}
myRS:PRIMARY> db.auth("test","test")
1
myRS:PRIMARY> show users;
{
	"_id" : "test.test",
	"userId" : UUID("bdd7783e-9cfc-43b5-9e38-3497cfeb71fa"),
	"user" : "test",
	"db" : "test",
	"roles" : [
		{
			"role" : "read",
			"db" : "test"
		}
	],
	"mechanisms" : [
		"SCRAM-SHA-1",
		"SCRAM-SHA-256"
	]
}
myRS:PRIMARY>
登录 test 用户,并测试是否只读
????????show collections;
????????db.createCollection('b')
创建某库的读写用户:
创建 test1 用户,权限为读写
db.createUser(
????????{
????????user: "test1",
????????pwd: "test1",
????????roles: [ { role: "readWrite", db: "test" } ]
????????}
)
查看并测试用户
????????show users;
????????db.auth("test1","test1")
创建对多库不同权限的用户
创建对app为读写权限,对test库为只读权限的用户
use app
db.createUser(
????????{
????????user: "app",
????????pwd: "app",
????????roles: [ { role: "readWrite", db: "app" },
????????{ role: "read", db: "test" } ]
????????}
)
查看并测试用户
????????show users
????????db.auth("app","app")
删除用户:
删除app用户:先登录到admin数据库
????????mongo -uroot –proot 127.0.0.1/admin
进入app库删除app用户
????????use app
????????db.dropUser("app")

自定义数据库:

创建app数据库的管理员:先登录到admin数据库
use app
db.createUser(
????????{
????????user: "admin",
????????pwd: "admin",
????????roles: [ { role: "dbAdmin", db: "app" } ]
????????}
)
创建app数据库读写权限的用户并具有clusterAdmin权限:
use app
db.createUser(
????????{
????????user: "app04",
????????pwd: "app04",
????????roles: [ { role: "readWrite", db: "app" },
????????{ role: "clusterAdmin", db: "admin" } ]
????????}
)

2.数据导出

?mongoexport:

? ? ? ? -d:指定要导出的数据库;

? ? ? ? -c:指定要导出的表;

? ? ? ? -o:指定导出后的文件名;

[root@master ~]# mongoexport -d db1 -c student -o stu,dat
2022-09-15T13:40:47.577+0800	connected to: mongodb://localhost/
2022-09-15T13:40:47.593+0800	exported 7 records
[root@master ~]# cat stu.dat 
{"_id":{"$oid":"6329da7c5e81be318ba81363"},"id":1.0,"name":"张三","sex":"男","age":18.0}
{"_id":{"$oid":"6329dae25e81be318ba81364"},"id":2.0,"name":"李四","sex":"女","age":19.0}
{"_id":{"$oid":"6329dd545e81be318ba81365"},"id":3.0,"name":"王五","sex":"男","age":19.0}
{"_id":{"$oid":"6329dee05e81be318ba81366"},"id":4.0,"name":"赵六","sex":"男","age":21.0}
{"_id":{"$oid":"6329e2445e81be318ba81367"},"id":6.0,"name":"孙八","sex":"男","age":21.0,"address":{"province":"Hebei","city":"tangshan"}}
{"_id":{"$oid":"6329e2445e81be318ba81368"},"id":7.0,"name":"侯九","sex":"男","age":20.0,"address":{"province":"beijing","city":"gugong"}}
{"_id":{"$oid":"6329e2445e81be318ba81369"},"id":8.0,"name":"熊十","sex":"女","age":21.0,"address":{"province":"xian","city":"changan"}}
[root@master ~]#

#:也可以导出部分列:csv格式,不指定type默认是json格式;-f 表示的是字段;

[root@master ~]# mongoexport -d db1 -c student --type=csv -f id,name,age -o student.dat
2022-09-15T13:50:49.461+0800	connected to: mongodb://localhost/
2022-09-15T13:50:49.468+0800	exported 7 records
[root@master ~]# cat student.dat 
id,name,age
1,张三,18
2,李四,19
3,王五,19
4,赵六,21
6,孙八,21
7,侯九,20
8,熊十,21
[root@master ~]#

#:更详细的用法可以 mongoexport --help来查看;

3.数据导入

mongoimport:
导入 JSON 数据:
myRS:PRIMARY> db.student.find({},{_id:0})
{ "id" : 1, "name" : "张三", "sex" : "男", "age" : 18 }
{ "id" : 2, "name" : "李四", "sex" : "女", "age" : 19 }
{ "id" : 3, "name" : "王五", "sex" : "男", "age" : 19 }
{ "id" : 4, "name" : "赵六", "sex" : "男", "age" : 21 }
{ "id" : 6, "name" : "孙八", "sex" : "男", "age" : 21, "address" : { "province" : "Hebei", "city" : "tangshan" } }
{ "id" : 7, "name" : "侯九", "sex" : "男", "age" : 20, "address" : { "province" : "beijing", "city" : "gugong" } }
{ "id" : 8, "name" : "熊十", "sex" : "女", "age" : 21, "address" : { "province" : "xian", "city" : "changan" } }
myRS:PRIMARY> db.student.drop();
true
myRS:PRIMARY> db.student.find({},{_id:0})
myRS:PRIMARY> 

[root@master ~]# mongoimport -d db1 -c student stu.dat 
2022-09-15T14:00:35.655+0800	connected to: mongodb://localhost/
2022-09-15T14:00:35.680+0800	7 document(s) imported successfully. 0 document(s) failed to import.
[root@master ~]#

myRS:PRIMARY> use db1
switched to db db1
myRS:PRIMARY> 
myRS:PRIMARY> db.student.find({},{_id:0})
{ "id" : 1, "name" : "张三", "sex" : "男", "age" : 18 }
{ "id" : 2, "name" : "李四", "sex" : "女", "age" : 19 }
{ "id" : 3, "name" : "王五", "sex" : "男", "age" : 19 }
{ "id" : 4, "name" : "赵六", "sex" : "男", "age" : 21 }
{ "id" : 6, "name" : "孙八", "sex" : "男", "age" : 21, "address" : { "province" : "Hebei", "city" : "tangshan" } }
{ "id" : 7, "name" : "侯九", "sex" : "男", "age" : 20, "address" : { "province" : "beijing", "city" : "gugong" } }
{ "id" : 8, "name" : "熊十", "sex" : "女", "age" : 21, "address" : { "province" : "xian", "city" : "changan" } }
myRS:PRIMARY> 

导入csv格式数据:?只能导入部分数据;

????????-type 指明要导入的文件格式
????????-headerline 批明不导入第一行,因为第一行是列名
????????-file 指明要导入的文件路径
myRS:PRIMARY> db.student.drop();
true
myRS:PRIMARY> exit
bye
[root@master ~]# mongoimport -d db1 -c student --type=csv --headerline --file student.dat 
2022-09-15T14:05:20.853+0800	connected to: mongodb://localhost/
2022-09-15T14:05:20.867+0800	7 document(s) imported successfully. 0 document(s) failed to import.
[root@master ~]# mongo
myRS:PRIMARY> db.student.find({},{_id:0})
{ "id" : 1, "name" : "张三", "age" : 18 }
{ "id" : 2, "name" : "李四", "age" : 19 }
{ "id" : 3, "name" : "王五", "age" : 19 }
{ "id" : 4, "name" : "赵六", "age" : 21 }
{ "id" : 6, "name" : "孙八", "age" : 21 }
{ "id" : 7, "name" : "侯九", "age" : 20 }
{ "id" : 8, "name" : "熊十", "age" : 21 }
myRS:PRIMARY>

?4.数据备份

逻辑备份 mongodump:
????????可以用 mongodump 来做 MongoDB 的库或表级别的备份,例如 备份db1 数据库;
[root@master ~]# mongodump -d db1
2022-09-15T14:14:49.682+0800	writing db1.student to dump/db1/student.bson
2022-09-15T14:14:49.693+0800	writing db1.score to dump/db1/score.bson
2022-09-15T14:14:49.697+0800	done dumping db1.score (0 documents)
2022-09-15T14:14:49.697+0800	done dumping db1.student (7 documents)

// 此时会在当前目录下创建一个 dump 目录,用于存放备份出来的文件
[root@master ~]# ls
anaconda-ks.cfg  mha4mysql-node-0.58-0.el7.centos.noarch.rpm  redis-6.2.7.tar.gz  student.dat
dump             mysql80-community-release-el7-5.noarch.rpm   stu.dat
[root@master ~]# cd dump/
[root@master dump]# ls
db1
[root@master dump]# cd db1/
[root@master db1]# ls
score.bson  score.metadata.json  student.bson  student.metadata.json
[root@master db1]# cat student.
student.bson           student.metadata.json  
[root@master db1]# 
其他参数:
????????-h: MongoDB 所在服务器地址,如 127.0.0.1; 也可以指定端口号: 127.0.0.1:27017
????????--port:端口号。
????????-d: 需要备份的数据库实例,例如, test
????????-c: 需要备份的集合 。
????????-o: 备份数据的存放位置 。
????????-u: 用户名 。
????????-P: 密码。
????????--gzip: 压缩 。
????????--oplog: point in time 恢复用,只支持全库备份 。
????????--authenticationDatabase: 认证库 。
????????--dumpDbUsersAndRoles dump 用户和角色 ,只有在单库备份时才需要这么做。
????????--archive=dbname.gz: 3.2 版本新增,不能和 -o 同时使用 。
归档备份为 l 个文件,但不能和 -o 同时使用。
备份表:
[root@master ~]# mongodump -d db1 -c student  -o mon_dump
2022-09-15T14:20:23.379+0800	writing db1.student to mon_dump/db1/student.bson
2022-09-15T14:20:23.379+0800	done dumping db1.student (7 documents)
[root@master ~]# ls
anaconda-ks.cfg                              mon_dump                                    redis-6.2.7.tar.gz  student.dat
mha4mysql-node-0.58-0.el7.centos.noarch.rpm  mysql80-community-release-el7-5.noarch.rpm  stu.dat
[root@master ~]# cd mon_dump/
[root@master mon_dump]# ls
db1
[root@master mon_dump]# cd db1/
[root@master db1]# ls
student.bson  student.metadata.json
[root@master db1]#
全库备份:
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -o /home/mongod/backup/full

备份test库
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/

备份test库下的vast集合
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/

压缩备份库
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/ --gzip

压缩备份单表
mongodump -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/ --gzip

5.数据恢复

mongorestore mongoimport 参数类似:
全库备份中恢复单库(基于之前的全库备份)
mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/full/test/

恢复test库
mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test /home/mongod/backup/test/

恢复test库下的vast集合
mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast /home/mongod/backup/test/vast.bson

--drop参数实践恢复
# 恢复单库 mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/test/ 
# 恢复单表 mongorestore -h 192.168.150.15:27017 -uroot -proot --authenticationDatabase admin -d test -c vast --drop /home/mongod/backup/test/vast.bson
mongoexport/mongoimport mongodump/mongorestore 的对比:
1. mongoexport/mongoimport导入/导出的是JSON格式,而mongodump/mongorestore导入/导
出的是BSON格式。
2. JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。
3. 在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用
mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行
跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。跨版本的mongodump/mongorestore并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分
时候是的)。
4. JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信
息。使用时应该注意。

6.MongoDB监控

为什么要监控?
????????监控及时获得应用的运行状态信息,在问题出现时及时发现。
监控什么?
????????CPU、内存、磁盘 I/O 、应用程序( MongoDB )、进程监控( ps -aux )、错误日志监控;
(1):MongoDB集群监控方式:
db.serverStatus()

查看实例运行状态(内存使用、锁、用户连接等信息)
通过比对前后快照进行性能分析

"connections" # 当前连接到本机处于活动状态的连接数 
"activeClients" # 连接到当前实例处于活动状态的客户端数量 
"locks" # 锁相关参数 
"opcounters" # 启动之后的参数 
"opcountersRepl" # 复制想关 
"storageEngine" # 查看数据库的存储引擎 
"mem" # 内存相关

(2):状态

db.stats()
"db" : "test" ,表示当前是针对"test"这个数据库的描述。想要查看其他数据库,可以先运行$ use databasename(e.g $use admiin). 
"collections" : 3,表示当前数据库有多少个collections.可以通过运行show collections查看 当前数据库具体有哪些collection. 
"objects" : 13,表示当前数据库所有collection总共有多少行数据。显示的数据是一个估计值,并不 是非常精确。 
"avgObjSize" : 36,表示每行数据是大小,也是估计值,单位是bytes 
"dataSize" : 468,表示当前数据库所有数据的总大小,不是指占有磁盘大小。单位是bytes 
"storageSize" : 13312,表示当前数据库占有磁盘大小,单位是bytes,因为mongodb有预分配空间机 制,为了防止当有大量数据插入时对磁盘的压力,因此会事先多分配磁盘空间。 
"numExtents" : 3,似乎没有什么真实意义。我弄明白之后再详细补充说明。 
"indexes" : 1 ,表示system.indexes表数据行数。 
"indexSize" : 8192,表示索引占有磁盘大小。单位是bytes 
"fileSize" : 201326592,表示当前数据库预分配的文件大小,例如test.0,test.1,不包括 test.ns。

(3):mongostat:

????????实时数据库状态,读写、加锁、索引命中、缺页中断、读写等待队列等情况。 ?
????????每秒刷新一次状态值,并能提供良好的可读性,通过这些参数可以观察到MongoDB 系统整体性能情况。
[root@master ~]# mongostat -h 192.168.188.128 --port 27017
insert query update delete getmore command dirty used flushes vsize   res qrw arw net_in net_out conn  set repl                time
    *0    *0     *0     *0       2     8|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0  7.06k   56.6k   17 myRS  PRI Sep 15 14:50:53.361
    *0    *0     *0     *0       0     0|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0   262b   49.9k   17 myRS  PRI Sep 15 14:50:54.364
    *0    *0     *0     *0       0     3|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0   867b   51.5k   17 myRS  PRI Sep 15 14:50:55.363
    *0    *0     *0     *0       0     3|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0   717b   51.9k   17 myRS  PRI Sep 15 14:50:56.365
    *0    *0     *0     *0       0     2|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0   855b   50.7k   17 myRS  PRI Sep 15 14:50:57.378
    *0    *0     *0     *0       1     4|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0  2.66k   52.3k   17 myRS  PRI Sep 15 14:50:58.369
    *0    *0     *0     *0       0     3|0  0.3% 0.4%       0 1.81G 87.0M 0|0 1|0   870b   51.6k   17 myRS  PRI Sep 15 14:50:59.365
^C2022-09-15T14:51:00.146+0800	signal 'interrupt' received; forcefully terminating
[root@master ~]#

insert 每秒插入量
query 每秒查询量
update 每秒更新量
delete 每秒删除量
conn 当前连接数
qr|qw 客户端查询排队长度(读|写)最好为0,如果有堆积,数据库处理慢。
ar|aw 活跃客户端数量(读|写)
time 当前时间

(4):mongotop命令:

[root@master ~]# mongotop -h 192.168.188.128
2022-09-15T15:03:44.458+0800	connected to: mongodb://192.168.188.128/

                     ns    total    read    write    2022-09-15T15:03:45+08:00
   admin.$cmd.aggregate      0ms     0ms      0ms                             
      admin.system.keys      0ms     0ms      0ms                             
     admin.system.roles      0ms     0ms      0ms                             
     admin.system.users      0ms     0ms      0ms                             
   admin.system.version      0ms     0ms      0ms                             
config.image_collection      0ms     0ms      0ms                             
        config.settings      0ms     0ms      0ms                             
 config.system.sessions      0ms     0ms      0ms                             
    config.transactions      0ms     0ms      0ms                             
              db1.score      0ms     0ms      0ms                             

                     ns    total    read    write    2022-09-15T15:03:46+08:00
   admin.$cmd.aggregate      0ms     0ms      0ms                             
      admin.system.keys      0ms     0ms      0ms                             
     admin.system.roles      0ms     0ms      0ms                             
     admin.system.users      0ms     0ms      0ms                             
   admin.system.version      0ms     0ms      0ms                             
config.image_collection      0ms     0ms      0ms                             
        config.settings      0ms     0ms      0ms                             
 config.system.sessions      0ms     0ms      0ms                             
    config.transactions      0ms     0ms      0ms                             
              db1.score      0ms     0ms      0ms                             

^C2022-09-15T15:03:47.148+0800	signal 'interrupt' received; forcefully terminating
[root@master ~]#

ns:数据库命名空间,后者结合了数据库名称和集合。 
total:mongod在这个命令空间上花费的总时间。 
read:在这个命令空间上mongod执行读操作花费的时间。 
write:在这个命名空间上mongod进行写操作花费的时间。

(5):db级别的命令

db.currentOp()
查看数据库当前执行什么操作。
用于查看长时间运行进程。
通过(执行时长、操作、锁、等待锁时长)等条件过滤。
如果发现一个操作太长,把数据库卡死的话,可以用这个命令杀死他:> db.killOp(608605)

db.setProfilingLevel()
设置server级别慢日志
打开profiling:
0:不保存
1:保存慢查询日志
2:保存所有查询日志
注意:级别是对应当前的数据库,而阈值是全局的。
查看profiling状态
查看慢查询:system.profile
关闭profiling

7.MongoDB应用场景

网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。

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。
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:03:44  更:2022-09-24 21:06:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:37:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码