分类: 云计算

云计算

数据库设计的 10 个*佳实践

以下为译文:

数据库是应用及计算机的核心元素,负责存储运行软件应用所需的一切重要数据。为了保障应用正常运行,总有一个甚至多个数据库在默默运作。我们可以把数据库视为信息仓库,以结构化的方式存储了大量的相关信息,并合理分类,方便搜索及使用。

因此,数据库设计成为软件开发中的重要一环,对于开发者来说,设计一个高效的数据库至关重要。那么,为什么数据库设计很重要,“好”的标准又是什么?本文将做以介绍。

%title插图%num

为什么数据库设计很重要?

用我们订购衬衫的在线商城网站举例。如今,从网站上订购衬衫的过程似乎很简单,但涉及了很多信息交换。例如:*次浏览网页时,系统会展示给你一系列信息,包含产品分类,所有可用商品、相应价格、可用尺码、颜色以及其他相关信息。网站会从存储数据的数据库中检索,当用户选中所需商品并继续操作购买时,网站会询问个人详细信息、送货地址、付款详细信息,并确认订单。目前在此过程中产生的新数据,如用户详细信息、订单详细信息、购买及付款都会在同一个数据库中添加及更新。

数据库设计很重要,因为对构建可伸缩且能够在高工作负载下运行的软件应用来说,它是至关重要的。设计数据库首先来说,选择数据库软件很关键。目前可用于构建应用的数据库软件有数百种可供选择,我们可以从一些*好的免费数据库软件中选择,之后便是设计符合要求的数据库了。下面列出了10个*优的数据库设计实践。

%title插图%num

数据库设计的10个*佳实践

将所有人的观点列入考量

要设计好的数据库,必须考虑所有相关利益者的观点。在构建数据库之前,先去收集信息,了解他们对数据库的期望以及对数据库的操作熟练度。这样就能得出数据库应当采用的技术水平,以及是否要就数据库的功能来训练用户。

选择符合需求的数据库类型

数据库有多种类型,选择正确类型则是数据库设计的关键。我们可以将数据库以两种方式分类。一是基于数据库用以定义和操作数据的查询语言。使用SQL的数据库是结构化数据*常用的类型。然而,由于NoSQL数据库的可伸缩性、灵活性和速度更优,它们更适合机器学习、网络分析以及物联网(IoT)使用。

第二种分类方式则是基于数据模型。这样分类会有四种类型:关系数据库、分层数据库、网络数据库以及面向对象的数据库。

研究数据库的不同类型,并针对应用需求作出选择,这是必要的初始步骤。

以一致的方式来定义与标记表和列

在定义数据项以及标记表与列时,遵从一致性原则非常重要,可以帮助我们更好地理解数据。命名表与列的*佳实践之一便是使用简单的名字来定义其包含的数据。比如:只需将包含用户名称的列标记为“CustomerName”(“用户名”)即可。

应当避免使用复数名(如CustomerNames)、缩写(如CN),并且名称中不得使用空格(如Customer Name)。如果坚持遵守这些规则,则将来的用户在使用数据库时会更容易。

规范化是关键

数据库的规范化指的是将数据库中的所有信息组织起来,避免数据重复和冗余。简单来说,规范化是将数据打散分配到多个较小的相关表中,而不是统统存在一个大表里。

将数据规范化是很好的数据库设计实践,有助于提高效率。但是请确保不要过度规范化,否则将会把数据分散到太多的小表中,反而造成混乱。

数据库设计的文档化很重要

事实上,文档化并非人见人爱,因为实在太烦了。但要记得,文档化对于良好的数据库设计至关重要,可以追踪所有的小细节。数据库设计应当附有指示说明、ER图、存储过程及所有其他相关的信息。文档还应当为编程者和终端用户提供足够信息量,确保他们能够理解并使用。

隐私是首要考量

很多时候,存储在数据库中的信息是加密信息,隐私就成了一个值得关注的问题。为了获得*大程度的安全性,我们应当对密码加密,使用身份验证来限制数据库的访问,并使用另一个服务器来存放数据库,而不是应用所在的服务器。这将确保你的数据不受攻击和隐私侵犯的威胁。

考虑长期需求

优秀的数据库设计应当具备可伸缩性,即:在使用量增加的情况下,仍然能承受较高的工作负载,并保障应用的运行。对工作量可能会有所改变的企业来说,在设计数据库时牢记此项至关重要。例如:如果一个电子商务网站预计当销售量增长时,访客会在一个月内急速增加,那么在设计数据库时应当将这一点列入考量,以便数据库可以响应迅速增长的访客,并保持在高工作负载的情况下运作。

代码以及使用预存程序

数据库设计中的常见错误之一,就是不使用预存程序。预存程序指的是,在操作数据时手边随时可用的提前预存代码串。例如,如果有个SQL查询是常用的操作指令,则将它提前写入预存程序,而不是在用的时候重新来写,就会让工作简单起来。一旦有了预存程序,就可以在需要时一步执行并载入这个SQL查询了。

编写大量预存程序是个吃力的工作,但如果花时间完成并用文档记录下来的话,对终端用户来说,使用数据库就更加轻松了。

在数据库建模和设计上投入时间

优秀数据库设计的专业技巧之一是在数据库建模和设计上投入时间和精力。开发者常见的错误就是忽略这一步以节省时间,将重点放在软件开发更重要的其他方面上。但是,数据库设计对于保障应用的功能来说非常关键。如果一味想节省时间,不仔细思考设计的话,未来就会需要花费更多时间来维护数据库,甚至重新设计。

测试设计

测试也是数据库设计很关键的步骤,而且经常会被疏忽对待,甚至完全跳过,只为了赶DDL。我们应当在发布项目前,花些时间来彻底测试数据库设计,以确保其满足了所有计划中的需求,且正常运行。

%title插图%num

结语

对于以数据为中心的项目来说,数据库设计*为重要,开发过程中我们也应当慎重对待。文中提到的数据库设计实践,如针对长期需求进行适当的计划,选择正确的数据库类型,使用一致性的名称与标签,数据规范化,数据库设计文档化,并提前测试,这些都是我们在设计优秀数据库时需要考虑的关键问题。

golang中多种方式设置时区

go语言的time.Now()返回的是当地时区时间

time.Now().Format(“2006-01-02 15:04:05”)
1
time设置自定义时区

var cstSh, _ = time.LoadLocation(“Asia/Shanghai”) //上海
fmt.Println(“SH : “, time.Now().In(cstSh).Format(“2006-01-02 15:04:05”))
1
2
LoadLocation 有个问题,它依赖于 IANA Time Zone Database (简称 tzdata 吧) 这个数据库,一般linux系统都带了,但是windows系统就没带。所以如果windows系统没有安装go环境,调用LoadLocation就会报错。

当前解决方法也有:

1、我们可以自己把tzdata文件放到自己的程序目录中,然后让 time 包能够从我们自己的程序目录中加载时区文件就可以了。

文件目录可以通过环境变量设置,在main方法中:

os.Setenv(“ZONEINFO”, ‘/home/tz/data.zip’)
1
然后再调用 LoadLocation 方法就可以了。

下载tzdata

2、使用时区方式 推荐方式

var cstZone = time.FixedZone(“CST”, 8*3600) // 东八区
fmt.Println(“SH : “, time.Now().In(cstZone).Format(“2006-01-02 15:04:05”))
1
2
全局设置
如果说要设置全局的time时区配置应该如何做?

main.go(主函数处)增加一个初始化方法

func initInMain() {
var cstZone = time.FixedZone(“CST”, 8*3600) // 东八
time.Local = cstZone
}
1
2
3
4
将定义的时区实例赋值给time.Local

推荐阅读

Redis工具收费后新的开源已出现

GitHub上Star*高的工程师技能图谱

中国程序员*容易发错的单词

推荐!!! Markdown图标索引网站

 

蓝桥杯算法之成绩分析

问题引入:
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
请计算这次考试的*高分、*低分和平均分。

输入格式:
输入的*行包含一个整数n,表示考试人数。
接下来n行,每行包含一个0至100的整数,表示一个学生的得分。

输出格式:
输出三行。
*行包含一个整数,表示*高分。
第二行包含一个整数,表示*低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分

样例输入:
7
80
92
56
74
88
99
10
样例输出:
99
10
71.29

解题思路:
首先当输入n个数字(代表成绩)的时候,那么就要求将这几个数字都提取到,此时可以使用List集合。(使用List集合的原因:因为List集合是有序可重复的集合,可重复指代当输入一个数字的时候,可以继续输入另一个相同的数,那么这和输入成绩的情况相似,因为输入成绩可能重复输入)。接着就可以将List集合排序,然后取到*个和*后一个数字代表*低和*高分了。

具体代码如下:
————————————————
%title插图%num

%title插图%num

Hadoop分布式和伪分布式下NameNode和DataNode的分布

今天布置了有关hadoop分布式与伪分布式的作业,经过资料的查询,了解了很多概念,以下为整理的相关信息。

概念的理解:
(1)分布式
利用分而治之的思想:
随着数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统(HDFS)。

(2)伪分布式
Hadoop的伪分布式:
伪分布式就是假分布式,假就假在只有一台机器而不是多台机器来完成一个任务,但是模拟了分布式的这个过程,所以伪分布式下Hadoop也就是虽然在一个机器上配置了hadoop的所有节点,但伪分布式完成了所有分布式所必须的事件。伪分布式Hadoop和单机版*大区别就在于需要配置HDFS。

Hadoop伪分布式模式是指在一台机器上同时启动NameNode,DataNode, JobTracker, TaskTracker等进程(一般都是1个),并没有真正分布到集群内的不同机器上,所以这种模式叫伪分布式模式。

NameNode的组成:
Namenode整个内存结构大致可以分成四大部分:Namespace、BlockManger、NerworkTopology及其他;Namespace是维护整个文件系统的目录树结构及目录树上的状态变化;BlockManger维护整个文件系统中与数据块相关的信息及数据块的状态变化;NetworkTopology维护机架拓扑及Datanode信息,机架感知的基础;其他部分包括用以实现读写互斥同步的LeaseManger、支持集中式缓存管理的CacheManager、用于数据备份,回滚的SnapshotManager、管理HDFS安全访问的DelegationTokenSecretManager等。

如图:即为NameNode的有关组成部分:
————————————————
%title插图%num

NameNode的介绍:
(1)是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
(2)文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存*近一次checkpoint的时间
(3)以上这些文件是保存在linux的文件系统中。

(4)、NameNode是主节点,存储文件的元数据,如文件名,文件目录结构,文件属性(生成事件,副本数,文件权限),以及每个文件的块列表和块所在的DataNode信息等等。

(5)、Namenode是一个中心服务器,单一节点,负责管理文件系统的名字空间,以及客户端对文件的访问。文件操作,NameNode负责文件元数据的操作,DataNode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过NameNode,只会询问它跟那个DataNode联系,否则NameNode会成为系统的瓶颈。副本存放在那些DataNode上由NameNode来控制,根据全局情况做出块放置决定,读取文件时候NameNode尽量让用户先读取*近的副本,降低带块消耗和读取延时。NameNode全权管理数据块的复制。它周期性的从集群中每个DataNode接受心跳信号和块状态报告(Blocreport)。接受到心跳信号意味着该DataNode节点正常工作。块状态报告包含一个该DataNode上所有数据块的列表。
NameNode工作特点:
(1)Namenode始终在内存中保存metedata,用于处理“读请求”
(2)到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回
(3)Hadoop会维护一个fsimage文件,也就是namenode中metedata的镜像,但是fsimage不会随时与namenode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary namenode就是用来合并fsimage和edits文件来更新NameNode的metedata的。

DataNode的介绍:
DataNode是以块的形式存储数据,默认为128M。

(1)提供真实文件数据的存储服务。
(2)文件块(block):*基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.
dfs.block.size
(3)不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
(4)Replication。多复本。默认是三个。hdfs-site.xml的dfs.replication属性。

(5)、DataNode在本地文件系统存储文件块数据,以及块数据的校验和。

(6)、DataNode,一个数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。DataNode启动后NameNode注册,通过后,周期性(1小时)的向NameNode上报所有的块信息。心跳是每3秒一次,心跳返回结果带有NameNode给该DataNode的命令如复制块数据到另一台机器,或者删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。集群运行中可以安全加入和退出一些机器。

以下为我的一些整理:
一、Hadoop分布式下Namenode和Datanode的分布
Namenode整个内存结构大致可以分成四大部分:Namespace、BlockManger、NerworkTopology及其他;Namespace是维护整个文件系统的目录树结构及目录树上的状态变化;BlockManger维护整个文件系统中与数据块相关的信息及数据块的状态变化;NetworkTopology维护机架拓扑及Datanode信息,机架感知的基础;其他部分包括用以实现读写互斥同步的LeaseManger、支持集中式缓存管理的CacheManager、用于数据备份,回滚的SnapshotManager、管理HDFS安全访问的DelegationTokenSecretManager等;Namenode常驻内存,主要被Namespase和BlockManager使用,其他部分内存开销较小且相对固定。
Datanode以块的形式存储数据,一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,另一个是元数据(包括数据块的长度,块数据的校验和,时间戳);
Namenode周期性的从集群中的每个datanode接受心跳信号和块状态报告。而datanode会周期性的向namenode上报所有的块信息。
Namenode和Datanode以管理结点-工作结点模式运行,一个namenode结点和多个datanode结点,其中客户端(client)用户通过与namenode和datanode交互来访问整个文件系统,客户端提供了一些列的文件系统接口。
其中NameNode和secondary namemode、jobtracker运行在Master节点上,而DataNode和TaskTracker在Slave节点上。

二、Hadoop伪分布式下Namenode和Datanode的分布:
伪分布式就是一个机器既当namenode又当datanode;
Namenode、Datanode和JobTracker、TaskTracker等进程在一台机器上同时启动,并没有真正分布到集群内的不同机器上。
————————————————

云服务器下NFS文件挂载配置

什么是NFS
*近想为毕设搭个云服务器,所以想使用nginx+tomcat+nfs的方式搭建一下这个云服务器。所以有了这篇配置的文章。
NFS是网络文件系统,允许一个节点通过网络访问远程计算机的文件系统,远程文件系统可以被直接挂载到本地,文件操作和本地没有区别,如果是局域网的nfs那么io的性能也可以保证。下面就以CentOS 7.x为例,配置NFS。

服务器端配置
首先是服务端配置,服务端提供文件系统供客户端来挂载使用,配置过程如下:

首先检查是否缺少基础环境:
rpm -qa | grep nfs-utils
rpm -qa | grep rpcbind

如果这两个包存在那么可以直接使用,一般服务器安装的时候都会存在,如果没有的话执行下面命令安装:
yum -y install nfs-utils
yum -y install rpcbind

打开需要的端口:
一次正常的挂载操作中,会涉及这些端口。

nfs tcp 2049 这个很明显到处都是
sunrpc tcp 111 这个很明显到处都是
sunrpc udp 111 其中这个很难发现,仔细排查才看到
acp-proto udp 4046 其中仔细看udp的会找到
安装完成之后配置nfs访问目录,配置文件位置/etc/exports,默认是空的这里添加一行:
/nfs_test 192.168.1.8(rw,no_root_squash,no_all_squash,async)
共享的文件夹位置 允许访问的ip(该地址可执行的操作)
这个配置表示开放本地存储目录/nfs_test 只允许192.168.1.8这个主机有访问权限,rw表示允许读写;no_root_squash表示root用户具有完全的管理权限;no_all_squash表示保留共享文件的UID和GID,此项是默认不写也可以;async表示数据可以先暂时在内存中,不是直接写入磁盘,可以提高性能,另外也可以配置sync表示数据直接同步到磁盘;就配置这些就可以,保存退出。

现在配置完这些配置,启动相关服务:
systemctl start rpcbind.service
systemctl start nfs.service

启动之后可以通过status来查看状态,如果下次修改了配置,可以重启服务来使配置生效,也可以直接执行如下命令刷新配置:
exportfs -a

从机配置
现在服务端配置完毕,可以在对应的主机上来配置从机了,需要的环境和服务端一样,要保证安装nfs-utils和rpcbind。

保证环境没问题和上面一样启动rpcbind服务和nfs服务。不再赘述。

首先创建挂载点: mkdir /mnt/test1

然后挂载nfs:mount -t nfs 192.168.1.3:/nfs_test /mnt/test1
注意这里的ip是主机ip,主机挂载位置/nfs_test,从机挂载位置/mnt/test1

挂载成功之后通过 df -h 可以查看挂载的情况,nfs可用空间就是服务端/nfs_test目录所能使用的*大空间。

现在就可以往nfs写入数据了,服务端往/nfs_test读写数据和客户端往/mnt/test1读写数据是一样的,这样就实现了文件同步和共享。

卸载nfs和普通文件系统一样,使用:umount /mnt/test1

如果需要设置开机挂载,在/etc/fstab添加一行配置即可: 192.168.1.3:/nfs_test /mnt/test1 nfs rw,tcp,intr 0 1 然后服务端和客户端都要用enable设置nfs和rpcbind服务开机启动,然后才可以正常挂载。
————————————————
版权声明:本文为CSDN博主「No_Game_No_Life_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/No_Game_No_Life_/article/details/88388975

系统运维常见问题及处理方式

1 Tomcat日志错误
1.1 java.lang.OutOfMemoryError: PermGen space
该错误是由于tomcat的bin目录下catalina.sh配置文件的内存设置过小导致的,需要修改export JAVA_OPTS=”$JAVA_OPTS -server -Xms512m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=512m -Djava.awt.headless=true”中的-XX:PermSize=128m -XX:MaxPermSize=512m的数值。其中-Xms512m -Xmx2048m代表虚拟机堆内存,-XX:PermSize=128m -XX:MaxPermSize=512m代表虚拟机的非堆内存。

2 数据库
2.1 plsql能登录数据库,sqlplus登录会报用户名/密码无效
该错误只需要重新设置下登录用户密码即可
————————————————
%title插图%num

3 Liunx常用操作
3.1 同步服务器时间
liunx crond服务查看
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务

3.1.1 同步服务器时间命令:root执行/usr/sbin/ntpdate 时间同步服务器ip
————————————————
%title插图%num

添加定时任务
执行vim /etc/crontab,添加定时任务命令:

%title插图%num

.1.2 也可以先把同步脚本写到shell文本里,然后定时任务调执行该脚本
ntpdata.sh

%title插图%num

在/etc/crontab中添加

%title插图%num

SSM搭建项目常见错误——Mybatis篇

1 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):com.scor.dao.XX.XX
当mapper.xml文件放在resources目录下时的解决方法有如下两种:

mapper.xml所在的包名与dao.java所在的包名一致;
若包名不一致则需要在spring-dao.xml中指定mapper.xml的路径,如下

————————————————
%title插图%num

当mapper.xml文件放在java目录下时的解决方法:

  1. 点击project structure,将mapper.xml所在的包设置为Resources文件夹,再在spring-dao.xml中指定mapper.xml的路径
  2. %title插图%num
  3. %title插图%num

百度UEditor粘贴或插入的表格不显示边框的解决办法

这个方法是我自己研究出来的。

编辑器里面可以看到表格有边框,在前台页面展示出来的却没有边框。

修改办法:

打开ueditor.all.js

1、找到下面的代码,修改

utils.each(tables, function (table) {
removeStyleSize(table, true);
domUtils.removeAttributes(table, [‘style’]); //改这里,原来是 [‘style’, ‘border’]
utils.each(domUtils.getElementsByTagName(table, “td”), function (td) {
if (isEmptyBlock(td)) {
domUtils.fillNode(me.document, td);
}
removeStyleSize(td, true);
});
});
这是为了不让UEditor去掉粘贴的表格的边框,也就是table元素的border属性(不是border内联样式)

2、UEditor插入的表格实际是没有边框的,编辑器中看到边框,其实是因为编辑器里面(<iframe>中)有下面这个全局css
td,th{ border:1px solid #DDD; }
但是前台展示是没有这段全局css的,所以导致看不到边框。

我们可以让编辑器中无边框的表格,显示成虚线灰色的边框,这也是其他很多html编辑器的处理方式。

找到并修改下面的代码

utils.cssRule(‘table’,
//选中的td上的样式
‘.selectTdClass{background-color:#edf5fa !important}’ +
‘table.noBorderTable td,table.noBorderTable th,table.noBorderTable caption{border:1px dashed #ddd !important}’ +
//插入的表格的默认样式
‘table{margin-bottom:10px;border-collapse:collapse;display:table;}’ +
‘td,th{padding: 5px 10px;border: 1px dashed #DDD;}’ + //这里修改 1px solid #DDD 为 1px dashed #DDD
‘caption{border:1px dashed #DDD;border-bottom:0;padding:3px;text-align:center;}’ +
‘th{border-top:1px dashed #BBB;background-color:#F7F7F7;}’ + //这里修改 1px solid #BBB 为 1px dashed #BBB
‘table tr.firstRow th{border-top-width:2px;}’ +
‘.ue-table-interlace-color-single{ background-color: #fcfcfc; } .ue-table-interlace-color-double{ background-color: #f7faff; }’ +
‘td p{margin:0;padding:0;}’, me.document);
目的是让全局的td/th边框样式显示为灰色虚线

3、*后就是table上右键菜单中有个”表格-设置表格边线可见”的功能。这个功能会让表格显示出实线边框,实际前台展示也是有边框的。

现在td是有实线边框的,可是th却还是虚线,所以要改下面的代码,增加一段对th的处理

注意:th就是表格标题列/行。可以用右键菜单”表格-插入表格标题列/行”插入th

execCommand: function () {
var table = getTableItemsByRange(this).table;
utils.each(domUtils.getElementsByTagName(table,’td’),function(td){
td.style.borderWidth = ‘1px’;
td.style.borderStyle = ‘solid’;
td.style.borderColor = ‘windowtext’;
});
//增加下面一段
utils.each(domUtils.getElementsByTagName(table,’th’),function(th){
th.style.borderWidth = domUtils.getComputedStyle(th, “border-width”);
th.style.borderStyle = ‘solid’;
th.style.borderColor = ‘windowtext’;
});
}

*后如果你用的是ueditor.all.min.js,需要将改过的代码压缩一份min版本。

————————————————

Spring MVC+Mybatis常见错误及解决

1

org.apache.ibatis.binding.BindingException: Parameter 'username' not found. Available parameters are [0, 1, param1, param2]

出现这个错误是由于在执行sql的时候无法匹配sql语句的通配符造成的,有两个解决方法:
<1>、在对应dao的xml文件的sql语句要这样写

<select id=”findByUsernameAndPassword” resultType=”com.lzcc.model.User”>
select * from user where username = #{0} and password = #{1};
</select>
1
2
3
<2>、在dao接口的方法中的参数中添加@param注解
————————————————

List<User> findByUsernameAndPassword(@Param(“username”) String username,@Param(“password”) String password) throws SQLException;
————————————————

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速