精华内容
下载资源
问答
  • web安全-mysql基础

    千次阅读 2021-01-27 18:36:15
    mysql的使用一、什么是数据库二、关系型数据库1、关系型数据库管理系统(RDBMS)(1)RDBMS的特点(2)RDBMS专用术语2、mysql数据库三、增、删、... 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所

    一、什么是数据库

      数据库(Database)是按照数据结构来组织、存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。 我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。

    二、关系型数据库

    1、关系型数据库管理系统(RDBMS)

    (1)RDBMS的特点

      RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
       1.数据以表格的形式出现
       2.每行为各种记录名称
       3.每列为记录名称所对应的数据域
       4.许多的行和列组成一张表单
       5.若干的表单组成数据库(database)

    (2)RDBMS专用术语

      在我们开始学习MySQL 之前,让我们先了解下RDBMS的一些术语:
      数据库 : 数据库是一些关联表的集合。
      数据表 : 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
         : 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
         : 一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
      冗余  : 存储两倍数据,冗余降低了性能,但提高了数据的安全性。
      主键  : 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
      外键  : 外键用于关联两个表。
      复合键 : 复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
      索引  : 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
      参照完整性 : 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

    (3)继续理解数据库管理系统概念

      如图画出的是一个数据库管理系统的数据库包含与权限关系。不同颜色的框代表不同的层级、框的大小和交集表示包含关系和权限。主要就是:不同数据库可以分配不同管理员,同一个管理员也可以分配不同数据库。
    在这里插入图片描述
      许多条数据构成了一张表,许多张表构成了一个数据库,许多个数据库构成了一个数据库管理系统。日常生活中会经常把数据库管理系统叫做数据库,在此要区分许多表构成的数据库和数据库管理系统叫成的数据库!!两个都叫数据库但是完全不是一个概念。
      接下来继续理解数据库中的专业术语,如下图的两张表:学号这一列在成绩表中为主键,在花名册这一张表中就为外键。以花名册表为例:索引是指用一列或者多列的值来排序,比如以姓名、种族这两列来排序。这两列组合以后叫复合键
    在这里插入图片描述

    2、mysql数据库管理系统

      开始学习mysql数据库之前简单的介绍了是数据库是什么,我们目前使用的关系型数据库管理系统(RDBMS)是什么以及它的特点和专业术语。
      mysql为关系型数据库(Relational Database Management System), 这种所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格:
    在这里插入图片描述
      表头(header): 每一列的名称;
      (row): 具有相同数据类型的数据的集合;
      (col): 每一行用来描述某条记录的具体信息;
      (value): 行的具体信息, 每个值必须与该列的数据类型相同;
      (key): 键的值在当前列中具有唯一性。

      现在正式进入MySQL的学习。MySQ是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 除此以外:
      MySQL 是开源的,所以你不需要支付额外的费用。
      MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
      MySQL 使用标准的SQL数据语言形式。
      MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
      MySQL 对PHP有很好的支持,PHP是目前最流行的Web开发语言。
      MySQL 支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
      MySQL 是可以定制的,采用了GPL协议,你可以修改源码来开发自己的 MySQL 系统

    三、mysql概述

    1、mysql的基础操作

      本文中命令以及函数效果的演示:mysql版本为:5.7.26;操作系统为:Windows。
    在这里插入图片描述

    (1)登录数据库

      安装数据库本文不再演示,从登录开始。首先打开命令窗口(cmd),输入mysql,可能显示如下图:
    在这里插入图片描述
    解决方法:
      方法一:在命令窗口中CD到mysql的安装目录的bin目录底下,输入mysql。
      方法二:在系统环境变量中path中添加mysql的bin目录,然后重新打开命令窗口输入mysql。
      显示如图:
    在这里插入图片描述
      输入:quit
      到这里我们的数据库安装是没有问题的,我们开始登录。mysql有一个默认且权限最高的管理员账号,它的账号密码在未修改的情况下默认为:root:root。
      以下为登录命令和示例:
    登录命令:

    mysql -h 主机名 -u 用户名 -p 
    参数说明: 
    	-h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略; 
    	-u : 登录的用户名; 
    	-p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。 
    	如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可: 
    mysql -u root -p 按回车确认, 如果安装正确且 MySQL 正在运行, 会得到以下响应: Enter password: 
    	若密码存在, 输入密码登录, 不存在则直接按回车登录。
    	登录成功后你将会看到 Welecome to the MySQL monitor... 的提示语。 
    	然后命令提示符会一直以
    mysq> 加一个闪烁的光标等待命令的输入, 
    输入 exit 或 quit 退出登录。
    

      忘记密码请转点击:刷新mysqlroot密码
    示例:
    在这里插入图片描述
      到这里就登录成功了。登陆成功我们可以干嘛呢?在操作之前我们还得了解一些东西,在这里我们主要说明一下增删改查中的,其他的会在接下来再说。

    (2)数据库整体结构

      登录成功我们现在处于的位置是如图,在这里我们可以查看这个管理员账号下有哪些数据库,命令如下:

    mysql> show databases;
    查看当前管理员账号下的所有数据库名
    


    示例展示:
    在这里插入图片描述
      此时我们可以看到此账户下的所有数据库,接下来我们进入某个数据库。命令如下:

    mysql> use security;
    进入名为security的数据库
    

      此时我们处于的位置如下:
    在这里插入图片描述
    示例展示:
    在这里插入图片描述
      这里我们就可以查看security数据库下有哪些表,命令如下:

    mysql> show tables;
    查看当前数据库中的所有表名
    

    示例展示:
    在这里插入图片描述
      这时候我们可以查看某张表的数据、表的结构等信息。我们主要说明表的结构,查看命令如下:

    mysql>desc users; 
    查看表名为users的表结构
    

    示例展示:
    在这里插入图片描述
      在上图中我们可以看到表(users)中共有三列,分别为:id、username、password;Type中有int、varchar,这是啥呢?
      这就是的数据类型!!!

    2、mysql数据类型

      MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

    (1)数值类型

      MySQL支持所有标准SQL数值数据类型。 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION) 。
    在这里插入图片描述
    在这里插入图片描述

    (2)日期/时间类型

      表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。TIMESTAMP类型有专有的自动更新特性。
    在这里插入图片描述

    (3)字符型

      字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
    在这里插入图片描述
    注意:
    MySQL 5.0 以上的版本:
      一个汉字占多少长度与编码有关:
         UTF-8:一个汉字=3个字节;MySQL在5.5.3之后增加了这个UTF-8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。
         GBK:一个汉字=2个字节
      CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
      BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
      BLOB是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

    四、mysql常用命令

    1、create语句(创建数据库)

      增删改查我们先解决增、删、部分查的问题,命令如下:

    mysql> create database db_name;  -- 创建数据库
    mysql> show databases;           -- 查看所有的数据库
    mysql> drop database db_name;    -- 删除数据库
    mysql> use db_name;              -- 选择数据库
    mysql> create table tb_name (字段名 varchar(20), 字段名 char(1));   -- 创建数据表模板
    mysql> show tables;              -- 显示数据表
    mysql> desc tb_name;            -- 查看表结构
    mysql> drop table tb_name;      -- 删除表
    

    示例展示:

    mysql> create database db_sql;
    Current database: security
    -- 创建数据库成功
    
    mysql> use db_sql;
    Database changed
    Query OK, 1 row affected (2.01 sec)
    --选择数据库
    
    mysql> create table tb_user(
        -> id int not null,
        -> user_name varchar(100),
        -> password char(4),
        -> age int(4)
        -> );
    Query OK, 0 rows affected (0.14 sec)
    --创建表格
    

    2、insert into语句(插入数据)

      insert into 语句用于向表格中插入新的行:

    /*第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:*/
    mysql> insert into tb_user values (value1,value2,value3,...);
    /*第二种形式需要指定列名及被插入的值:*/
    mysql> insert into tb_user (column1,column2,column3,...) values (value1,value2,value3,...);
    
    示例:
    第一种:
    mysql> insert into tb_user values (01,‘aql’,‘qw’,1);
    第二种:
    mysql> insert into tb_user (id,user_name,password,age)values (02,‘ys’,‘er’,2);
    注意:
    	在插入数据时若数据类型是字符型,需要英文符‘’将数据放进去。
    

    示例展示:
    在这里插入图片描述
      上面的示例展示我们查看表内容时可以看到:select * from tb_user;,这就是我们的查询语句!

    3、select语句(查询数据)

      MySQL 数据库使用SQL SELECT语句来查询数据。
      一个基本的select语句可分解成三个部分:查找什么数据(select)、从哪里查找(from)、查找的条件是什么(where)。
      语法格式如下:

      select <目标列表达式列表>
     	[into 新表名]from 表名或视图名
     	[where <条件>]
     	[group by <分组表达式>]
     	[order by <排序表达式>[ASC|DESC]]
    

      在这里我们只说明最简单的select查询,‘where’、‘group by’、‘order by’会在后面的函数部分详细讲解。

    (1)查询指定的列

      a.查询表中所有列
      在select语句指定列的位置上使用*号时,表示查询表的所有列。

    模板:
    	表格显示:
    	mysql> select * from tb_user;
    	每条语句显示:
    	mysql> select * from tb_user\G
    

    示例展示:
    在这里插入图片描述

    (2)查询表中指定的列

      查询多列时,列名之间要用逗号隔开。

     模板: 
     	select tb_user.<字符型字段>,<字符型字段> ... from  tb_user;
     示例:
     	mysql> select tb_user.id,username from tb_user;
     --查询tb_user表中的id、username这两列
    

    示例展示:
    在这里插入图片描述

    (3)给查询的列标题起别名。

      使输出结果更容易被人理解。

    模板:
    	select <字符型字段> as 列标题1,<字符型字段> as 列标题2 from bt_user;
    示例:
    mysql> select id as a , username as b from tb_user;
    

    示例展示:
    在这里插入图片描述

    (4)查询经过计算的列(即表达式的值)

      运算符和我们所熟知的没差:+,-,*,/,%

    模板:
    	select <字符型字段> + n , <字符型字段> * n from tb_user;
    --给某一字段运算求之后的值
    	select <字符型字段> +  <字符型字段> as a from tb_user;
    --某两列运算之后的值
    示例:
    	mysql> select id+2,age*2 from tb_user;
    --查询id+2,age*2的值
    	mysql> select id + age as a from tb_user;
    --将id和age求和然后起别名为a,然后查询a
    

    示例展示:
    在这里插入图片描述

    4、where子句(指定判定任何条件)

      我们知道从 MySQL 表中使用SELECT 语句来读取数据。 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
      我们的 tb_user 表中数据有点少,我已经使用 insert into 语句为 tb_user 表添加到10条数据。如图:
    在这里插入图片描述

    模板:
    	SELECT field1, field2,... FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....
    
    示例:
    	mysql> select * from tb_user where id > 6;
    --查询tb_user表中所有id大于6的数据
    	mysql> select * from tb_user where id > 6 and age >9;
    --查询tb_user表中所有id大于6而且age大于9的数据
    	mysql> select * from tb_user where id > 8 or age < 6 ;
    --查询tb_user表中所有id大于8或者age小于6的数据
    

    示例展示:
    在这里插入图片描述
      and和or所连接的两个判断语句就是‘且’、‘或’的意思,判断语句的操作符如下所示:
    在这里插入图片描述
    除了这些操作符以外还可以加:between and ; limit 。

    示例:
    	mysql> select * from tb_user where id between 2 and 5;
    --查询表中id在2到5的所有数据
    	mysql> select * from tb_user where id between 2 and 5 limit 0,1;
    --查询表中id在2到5的所有数据,但是只显示第1行
    
    注:
    	limit m,n
    --m表示从可以从n偏移的最大数目
    --n表示最大可输出数目
    --比如limit 5,2; 它会输出6,7
    

    示例展示:
    在这里插入图片描述

      为演示查询两张表的数据,我们又创建了新表 tb_email 并添加了数据,新表如图:
    在这里插入图片描述

    示例:
    	mysql> select * from tb_user,tb_email where name = 'lx' and username = 'lx';
    --查询tb_user、tb_email表中‘lx’的所有信息
    

    示例展示:
    在这里插入图片描述

    5、group by(分组)

      GROUP BY 语句根据一个或多个列对结果集进行分组。 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

    模板:
    SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name;
    
    示例:
    	mysql> select age,count(*) from tb_user group by age;
    --查询tb_user表中列age的值出现的次数并根据age分组
    

    实例展示:
    在这里插入图片描述
      age其它均只出现了一次,只有9出现了两次。

    函数 功能
    avg() 求平均值
    count() 求记录个数,返回int类型整数
    max() 求最大值
    min() 求最小值
    sum() 求和

    6、order by(排序)

      order by语句可根据返回结果对其进行排序。

    模板:
    	order by {排序表达式[ASC|DESC]}[,...n];
    
    示例:
    	mysql> select * from tb_user order by  age asc;
    --查询tb_user的所有数据,并将返回结果根据age从小到大排序(默认就是正序,asc可省略不写)
    	mysql> select * from tb_user order by  age desc;
    --查询tb_user的所有数据,并将返回结果根据age从大到小排序(默认是正序,desc不可省略)
    

    示例展示:
    在这里插入图片描述

    7、alter(增加表的字段)

      增加表的字段,通俗来讲就是对列进行操作。即:增加列、删除列、修改列名等。

    模板:
    	alter table 表名 add/drop/change/ 字段 其他
    示例:
    	mysql> alter table tb_user add x1 int default '0';
    --新增一个字段x1,类型为int,默认为0
    	mysql> alter table tb_user add x2 int ,add x3 char;
    --新增两个字段分别为:字段x2,类型int;x3,类型char
    	mysql> alter table tb_user drop column x1 ,drop column x2;
    --删除两个字段x1、x2
    	mysql> alter table tb_user change username name char(100);
    --修改原来字段‘username’为‘name’
    	mysql> alter table tb_users rename tb_user;
    --修改表名tb_users为tb_user
    

    实例展示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    8、drop、delete(删除)

      在上文中的create、alter中我们见到过drop,它可以删除某个数据库、删除某张表又或者是删除某一列,这是它的功能。
      与drop不同的是:delete只能删除表中的某一行数据,或者是所有数据,将表清空。

    模板:
    	delete from tb_user where 列名称 = 某值
    
    示例:
    	mysql> delete from tb_user where id = 11;
    --删除表tb_user中id=11的数据
    	mysql> delete from tb_email;
    	mysql> delete * from tb_email;
    --删除表tb_email的所有数据
    

    示例展示:
    在这里插入图片描述
    在这里插入图片描述

    9、update(更新数据)

      使用一个新的数据将原来的数据覆盖,原来的值将不存在。

    模板:
    	update tb_name set 列名称 = 新值 where 列名称 = 某值;
    示例:
    	mysql> update tb_user set name = 'lb' where name = 'dc';
    --将表tb_user中name等于dc的地方替换为lb
    

    示例展示:
    在这里插入图片描述

    10、concat、group_concat(连接字符串)

      concat是将将多个字符串连接成一个字符串,group_concat是将列转为行。

    模板:
    	concat(str1,str2,str3)
    示例:
    	mysql> select concat(name,':',password) from tb_user;
    --将name,password的每个结果连接成一个字符串查询返回
    	mysql> select group_concat(name,':',password) from tb_user;
    --将name,password的所有结果连接成一个字符串查询返回
    	mysql> select concat((select name from tb_user where id = 1),';',(select name from tb_user where id = 2));
    --将id=1,id=2的name查询的结果连接
    

    示例展示:
    在这里插入图片描述
    在这里插入图片描述

    11、union(联合查询)

      联合查询,它用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据,若不想删除重复的语句可使用 union all。

    模板:
    	select 1 union (all) select 2 ;
    
    示例:
    	mysql> select * from tb_user where id < 4 union select * from tb_user where age < 10 ;
    --查询所有id小于4或者age小于10的数据,并删除重复项
    	mysql> select * from tb_user where id < 4 union all  select * from tb_user where age < 10 ;
    ----查询所有id小于4或者age小于10的数据,不删除重复项
    

    示例展示:
    在这里插入图片描述

    12、like(匹配)

      我们知道在 MySQL 中使用 SELECT 命令来读取数据,同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。 WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 “runoob_author = ‘RUNOOB.COM’”。 但是有时候我们需要获取 runoob_author 字段含有 “COM” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *。如果没有使用百分号 % , LIKE 子句与等号 = 的效果是一样的。

    模板:
    	selectfromwherelike '匹配内容'
    示例:
    	mysql> select * from tb_user where password like '%f3';
    --匹配表tb_user中字段password以f3结尾的所有行
    	mysql> select * from tb_user where password like '%f%';
    --匹配表tb_user中字段password中中间含有f的所有行
    	mysql> select * from tb_user where password like 'e%';
    --匹配表tb_user中字段password以e开头的所有行
    

    示例展示:
    在这里插入图片描述
    在这里插入图片描述
    mysql数据库基本用法到这里就结束啦!

    展开全文
  • SSO-WebDemo

    2013-08-12 20:25:57
    如下图所示,当浏览器访问了页面1时,web服务器设置了一个cookie,并将这个cookie和页面1一起返回给浏览器,浏览器接到cookie之后,就会保存起来,在它访问页面2的时候会把这个cookie也带上,Web服务器接到请求时也...
  • 发展较慢。 <p><strong>Jquery的出现</strong></p> 出现了非常流行的JavaScript库:jquery,能够快速构建动态、美妙的web应用,完美的封装了Ajax,让开发者开发网页变得优雅。 <p><strong>...
  • 数组元素和对象成员相对较慢</li><li>变量从局部作用域到全局作用域的搜索过程越长速度越慢</li><li>对象嵌套的越深,读取速度就越慢</li><li>对象在原型链中存在的位置越深,找到它的速度就越慢</li></...
  • https://weex.apache.org : Apache 官网地址,部署于 apache 仓库,国内访问速度较慢。 https://weex-project.io : Weex 官网中国镜像,部署于阿里云,国内访问速度较快。 大家可根据实际需求选择访问。 工作原理 ...
  • 访问 Github 较慢的客户可以考虑使用国内下载地址: DOWNLOAD 。 所属平台 Zip下载 Demo运行说明 SDK集成指引 API 列表 iOS 下载 DOC DOC API Android 下载 DOC DOC API Win(C++) 下载 DOC DOC API Win...
  • 初始化的过程比较,但一旦初始化过一次,在单次访问中可以一直调用不失效。然而如果快应用每个需要用到这个API的页面都初始化一次,则会等待时间长,用户体验差。 二、框架改造(1):创造单页快应用 当时的...

    一、场景

    在我们的产品的业务场景中,必须要引用一个特殊的第三方API:

    1. 这个API不能服务端封装,只能客户端自己引用SDK、自己初始化、自己调用。
    2. 初始化的过程比较慢,但一旦初始化过一次,在单次访问中可以一直调用不失效。然而如果快应用每个需要用到这个API的页面都初始化一次,则会等待时间较长,用户体验较差。

    二、框架改造(1):创造单页快应用

    当时的想法很简单,想要一个全局可用的、唯一的Web组件,那么我就开始动手改造,大概步骤如下:

    1. 核心页面就一个Container.ux页面,里面引入了很多组件,每个组件其实就是一个单独的页面,例如Home.ux、WebView.ux等。
    2. 新增加每个页面的配置项,例如标题等,全局配置项全局存储一个 [ 当前活动页面信息 ] ,只有一个页面是显示的;
    3. 我重写了Redirect、Replace、Reload、Back、RemovePage等方法,自己模拟了页面堆栈,当用户点击页面上的跳转按钮时,将新新页面的页面信息写入堆栈中,Container中由于data中的数据变化,则会自动显示新页面,隐藏原页面。
    4. 当A页面需要跳转到B页面时,A页面需要发送消息给Container.ux,Container再调用同一封装的PageHandler,PageHandler会做特定操作。
      this.$dispatch('redirectTo',{ Url: 'Detail',Params:JSON.stringify({pid:1132, img:false})});
      Container.ux监听
      that.$on('redirectTo',function (args) {controller.pageRedirectTo(that, args.detail.Url , args.detail.Params||'')});

    三、框架搭建(2):WebView通信(基于1010版本)

    单页应用的形式改造好之后,我发现当前版本(1010)居然没有网页通信的接口?如果两边无法通信的话将会造成很多数据上和交互上的麻烦。当时一度以为:完了,感觉要凉凉。
    虽然在群里和论坛里有收到回复说后续新版本会有专门的通信的接口,但是项目开发不能干等SDK更新,因为即使官方立马更新了SDK,十大厂商的覆盖率也是个问题,新属性新接口很可能没办法一下子投入使用。
    于是我就开始研究现有接口,是否有可能通过现有接口来实现网页双向通信?
    最终研究出了这个方案:

    实现原理

    1. 快应用端的Web组件的src从一开始就固定了,并且已进入应用实际上就开始执行那个特殊API的初始化。
    2. 快应用端通知H5:可以动态修改锚点,例如#login、#delete。也可以携带参数#get?id=1,#后一律视为锚点,因此参数需要在H5单独解析。修改锚点不会引起网页重新刷新,因此不会存在刷新后需要重新初始化的情况。
    3. H5端通知快应用:修改title,笔者是按照这种格式:
      应用名-DELETE
      解析后执行对应的DELETE事件,也可以携带简单的参数:
      应用名-ADD-sandklasnmd
      第二个-斜杠后代表某个id值。格式不唯一,总之就是H5通过document.title来发送消息。
    4. 快应用端监听titleReceive,并对title进行解析,然后执行对应的操作。


      综合 [ 单页应用搭建方案 ] 和 [ 通信方式搭建方案 ],我终于实现了WebView的理想操作,笔者内心可谓是激动不已:
      WebView全局可用,且只初始化一次,并且可以实现双向通信

    四、框架优化(3):WebView新通信(基于1020版本)

    在产品上线一段时间后,终于迎来了1020新版本,这次我立马关注到了新增的message双向通信,看似非常好用的样子!
    但是!但是根据厂商发布的最新的覆盖率统计,目前仍有至少3个厂商完全不支持1020。支持1020的厂商,目前支持率也有高有低,如果直接使用的话,就意味着1010的用户会无法使用我们的产品。因此,产品和市场的同事们并不同意我们立马使用新特性……其实也在意料之中啦。
    又过了一段时间,一方面官方最新统计的覆盖率有了些许地提升,另一方面市场的同事说貌似不支持1020的厂商市场占有率也不高,我们可以使用1020来主推几个大的厂商,还有就是部分厂商在1010版本中有未解决的BUG,希望我们升级到1020,一方面可以解决前面版本已知BUG,另一方面可以使用1020很多新特性来优化自己产品的体验。
    终于,我就开始改造通信方式,快应用和H5分别都有自己的postmessage和receiveMessage写法,使用起来蛮方便的。并且我开始尝试大数据传输,比如把一个列表数据从H5传到快应用,完全没有问题。想起来如果之前使用title传递的话,会不会字节数就有限制了呢?这个倒没尝试过。

    五、总结

    总的来说,改造单页应用和Web通信其实还是蛮有意思的,的确在某个时间段解决了很大问题,真的感觉我在跟Web组件斗智斗勇,哈哈。如果有哪里错误或者问题欢迎大家不吝骚扰~
    快应用这门技术在不断成长中,作为一个基层前端开发,我愿意相信他会越来越好,也希望它能够越来越好。
    其实这笔者的这份分享并没有大段的代码,想传递的还是一个思路、一个方案,能给大家一些启发最好了。
    预告下:后面笔者会专门做一篇 [ 音频 ] 的分享,主要讲的就是关于快应用音频的种种操作,哈哈~

    转载于:https://juejin.im/post/5c3af8dbe51d4544390b18a9

    展开全文
  • Native 开发的诸多亮点中,流畅体验和系统调用是最多被提及的。流畅体验体现在页面滚动/动画的流畅性... 有丰富的系统调用能力,而 Web 痛点在于:W3C标准太,有限的设备访问能力,API 兼容性问题严重,如 Geolocat

    Native 开发的诸多亮点中,流畅体验和系统调用是最多被提及的。流畅体验体现在页面滚动/动画的流畅性,背后是更好的内存管理和更接近原生的性能;同时又是Web 的痛点:资源首次下载、长页面内存溢出和滚动性能、动画性能、传统 web 性能(如JS执行效率)。Native 有丰富的系统调用能力,而 Web 痛点在于:W3C标准太慢,有限的设备访问能力,API 兼容性问题较严重,如 Geolocation 在 Android Webview 中可用性很差。


    Web 开发同样有诸多亮点,其中最耀眼的当属发布能力和规模协作。NativeApp 商店审核周期长(尤指 iOS);应用更新周期长,iOS 稍快大概能达到一周更新率 60%-80%,Android 同样的更新率要2周甚至更长。而Web 在合适的缓存机制下一分钟可达到 99%+。浏览器内核 webkit 提供了相对一致的底层运行环境,html/js/css 控制页面的结构/行为/样式,uri连接不同的页面,有了这些基础设施,大规模的业务复用和人与人的分工协作变得相对轻松。


    同时今天阿里诸多客户端已经面临包大小接近临界值,大促活动页面(H5)体验较差等一系列问题。结合Native 和 Web 技术亮点,同时又能解决阿里遇到的业务问题,这就是 Weex 诞生的客观环境。


    2016.11.11,在 1754 张双11会场页面中(统计了天猫和淘宝),Weex页面数为 1747 占比99.6%。手淘 iOS/Android分别有 83.5%/78.3% 版本(UV)启用了Weex 会场,手猫iOS/Android 分别为 91.7%/87.9% 版本(UV)。Weex 覆盖了包括主会场、分会场、分分会场、人群会场 等在内几乎所有的双11会场业务。


    在这样的应用规模下,工作和目标是:

    1. 业务支撑,支撑住双11需求,这是最基本的要求,详见下文“业务支撑”一节

    2. 稳定性保障,Weex 引发的问题第一时间响应并处理,不留到双11当天,详见下文“稳定性数据”一节

    3. 秒开实战,稳定当先力争高性能,双11正式主会场秒开率冲到 97%,所有会场秒开率冲到 93%,详见下文“秒开数据”


    2016 双11会场的感受可查看原始录屏文件:WIFI | 4G | 3G | 2G | 无网络 。录屏时主会场已经是预加载版本,其中WIFI 和 4G 效果接近,2G 效果取决于数据的网络请求速度(录屏时数据请求约3.9s),无网络情况下打底数据来自前一次成功请求。流畅性可查看该视频,左起为 H5、iOS Weex、AndroidWeex。



    1.目标

    展开 Weex 双11细分目标:


    图 - Weex 双11细分目标


    2.业务支撑


    支撑住双11的业务需求,是 Weex 必须要迈过的坎。


    双11的会场结构大致为:会场框架(框架 + 主会场、全部会场、必抢、清单、我的双11)、分会场、其他会场(分分会场、人群会场等)。

     

    2.1会场框架

     

    Weex 支撑双11业务首要解决的是会场框架及其交互形式:

     

    1. 交互主流程:

         1.非 push 方式(框架Tab 切换):主会场 - 全部会场- 必抢 - 清单 - 我的双11

         2.push 方式:主会场 - 分会场- 主会场


    2. iOS 考虑到内存开销,需严控打开的主分会场weex页面,定为 n 级可配,默认为5;同时 iOS 会场框架为单实例,也是出于内存的考虑;Android 连续打开 30 级以上 Weex 页面,未见内存异常增长,无需特殊方案 


      图 - 会场框架交互

     

    Weex 会场框架很好支撑住了双11的复杂交互需求并提供了更好的内存管理。除了会场框架,更多的Component 和 Module 支撑住了各色各样的双11需求,这里仅列出几个代表:

     

    1. List 组件是几乎所有会场页面的标配,流畅的滚动帧率、高性能的内存复用机制和渲染机制是页面流畅体验的重要基础

    2. Animation 尽管是实验版需求,却支撑住了会场的垂直弹幕、坑位显隐等动画效果,动画效果细腻

    3. Weex 点播/直播组件 和 全景图组件支撑住了更为垂直个性化的业务需求

     

    2.2组织结构

     

    上节内容也可以看出,参与 Weex 双11会场涉及多个团队和平台系统:


    图 - Weex 双11中组织结构

     

    1. 天猫业务:通过斑马(活动页面搭建和发布平台)发布会场页面

    2. 淘宝业务:通过斑马和 AWP (产品页面发布平台)发布会场页面,上层DSL 使用 Rx(即将开源)

    3. 预加载:提前将会场js-bundle 下载到客户端,客户端访问 Weex 会场时网络 IO 被拦截到本地文件  IO,从而极大加快了网络加载速度,预加载是这次秒开实战的抓手(注:最核心的工作)

    4. 手淘、手猫客户端,Weex 是客户端的一部分,客户端中其实是 Weex、Native、H5并存的

    5. Weex SDK、业务模块:Weex容器和基础的 Components、Modules,业务模块包括直播/点播组件、全景图组件

     

    以上也仅涉及到客户端和发布端,背后还有无数的业务后台系统,就不一一列出了。

     

    将 Weex 架构自上而下地展开:

    1. Business,Weex 业务层,Weex 双11主战场是手淘和手猫,此外还有大量客户端已经启用或接入了Weex

    2. Middleware,Weex 中间件层,包括为 Weex 页面提供发布(斑马、AWP)、预加载(AWP)、客户端接入支持(AliWeex)、组件库(SUI)、游戏引擎、图表库等模块;其中斑马、AWP、预加载都直接参与了双11

    3. Tool,工具层

         1. DevTools界面和交互复用了Webkit Devtools支持 elements、network、断点、console 等

         2. Playground,方便开发者调试Weex 页面,同时也是 Weex example 的聚集地

         3. Cli,Weex 命令行工具集

         4. 目前仍在建设更多的工具,如weex-pack 支持一键打包成 App

    4. DSL

         1. JS Framework,Weex 最初的 DSL 是基于 Vuejs 1.0 语法子集;目前在社区中在推进基于Vuejs 2.0 的版本

         2. Rx,基于reactjs 语法的 Weex DSL

    5. Engine,渲染引擎,从架构设计上,Android/iOS/H5 RenderEngine 是相互独立和平等地位的渲染端,这是保持三端一致的基础,当然在协议实现层面需要更多的设计、质量保证

    图 - Weex 架构

    以上就是 Weex 在双11中的架构和业务支撑的范围了。


    3.稳定性保障

     

    Weex 的首要挑战就是稳定性,或者说保障 Weex 会场最大限度不降级。

     

    3.1 iOS JSCore 内存治理 


    8月初(同期双11启动)奥运大促时,手淘 iPhone 中反复进出会场20+(手猫15+),会出现crash。奥运大促当天,手淘 iOS 1.59% crash 次数来自该问题(top 6),手猫1.94%(top 8)。发现问题的当天成立了攻坚小组,从 JS业务代码、JSFM(框架)、iOS 渲染、iOS JSCore 几个方向同时排查,一周内各方向排查到逐步收敛到:根本原因是 Weex 页面实例被全局持有(weex runtime 只有一份),进而导致页面退出时内存不被释放,反复进出直至内存爆掉。因而任何可能导致页面实例被全局持有的因素都会触发这个问题:

     

    1. 业务代码中的问题,意外导致的,给出 Lint 工具扫描业务代码,引入了“全局污染治理”(见下一节)

    2. JSFM 框架中的问题,如在 destroyInstance 时清理 commonModules 和所有dependency target;iOS7下的 Set Polyfill 内存飙升问题

    3. iOS 中的问题,通过下发配置控制 VC Push层级控制;内存警告时的非当前实例销毁策略,加入开关控制;iOS 9.x JSCore 原生 Promise 和 Polyfill 并存时的内存问题


    除了建立攻坚团队推进解决该问题,也在造势期前就展开双11会场压测,反复验证该问题,自双11造势期会场开测之后,该问题未再出现。

     

    3.2全局污染治理


    在治理 JSCore 内存的过程中,逐步意识到对全局变量管控的必要性。Weex 中多个页面共用 1个 runtime,单个页面如果写法不规范不仅可能导致内存泄露,更有可能污染全局环境,进而导致所有Weex 页面无法正常工作。全局污染治理的核心抓手:

     

    1. 严格模式,即 `use strict`,使用严格模式可以将较多常见的JS 陷阱转化为错误,如:无法再意外创建全局变量、将拼写错转成异常、限制了 eval 的能力 等

    2. 冰冻对象,利用 ES5 的 `Object.freeze()`,将 Weex 核心对象和 JS 原生对象“冰冻”住。尝试修改被“冰冻”的对象会抛出错误,一旦“冰冻”无法“解冻”。

     

    3.3跨端依赖梳理


    Weex 通过 Adapter 来适配不同客户端的具体实现,诸多通用库,如:网络库、图片库、API库、 H5容器(Web 组件)、埋点库、配置库 等在不同客户端上版本不一致,因此导致的线上问题将会成为双11会场的隐患。为此展开的依赖梳理和同步机制是双11稳定性的保障之一。这件事情可能将会长期出现在Weex 问题清单之中,如何做到上层 Weex SDK

     

    3.4会场压测

     

    * 压测场景

        1. 5 个 200 坑位的普通会场页面,1 全景图会场页面,1 UT Expose 压测页面,1 直播会场页面

        2. 页面中提供链接,能够按顺序进行 push 跳转


    * 压测方案 

        1. 主链路(首页->店铺->详情->购物车)做一遍操作,让内存缓存占满,记下内存值M0

        2. 进入 Weex 页面,滑动到底部,滑动到顶部,记下 M1;点击跳转按钮,跳转到下一个页面

        3. 重复步骤 2,让所有的页面进行压栈;全景图->p1p2p3p4->直播->p1p2p3p4->UT


    压测结果:iOS 通过,Android 通过

        1. 测试过程手淘手猫均未出现因为压栈导致的 Crash,稳定性可以保证;

        2. Android低端机压栈过多会导致体验较差,之后也会引入类似 iOS VC 层级控制;

     

    压测在造势期会场测试阶段展开,在超出真实会场压力的情况下(真实会场150坑位上限),尽可能提前嗅探出潜在的iOS JSCore 内存问题、iOS/Android异常闪退等细节问题。

     

    3.5稳定性数据

     

    2016.11.11,Weex 在手淘中的 Crash 占比情况:

     

    * iOS1.46%(TOP7)

    * AndroidJava Crash 0.85%(TOP13)

    * NativeCrash 1.72%(TOP8)

     

    考虑到会场的业务量级,Weex 的稳定性仍然是不错的。注:单独计算的Weex Crash 率太小,参考价值不大。

     

    4.秒开实战

     

     其中:加载时间指 Weex js-bundle 的加载时间(从网络下载或本地加载);首屏渲染时间指Weex 页面开始渲染到第 1 个元素bottom 超出首屏范围的时间。下文提到的“首屏网络时间”为加载时间与首屏渲染时间的和。

     

    从双11结果看预加载大幅度提升加载时间,对秒开率的贡献尤其突出;但性能优化是个长期迭代的过程,回头来看优化的抓手是:预加载和首屏渲染优化。

     

    4.1预加载

     

    预加载解决了 1 个问题:

     

    用户访问页面(H5/Weex)之前,将页面静态资源(HTML/JS/CSS/IMG...)打包提前下载到客户端;用户访问页面时,将网络IO 拦截并替换为本地文件 IO;从而实现加载性能的大幅度提升。

     


    启用预加载后加载时间的变化,粗算一下:手淘 iOS,走网络平均 296ms,走预加载 18ms,网络性能提升约 15 倍;手淘 Android,走网络平均是 696ms,走预加载是 54ms,网络性能提升约 12 倍,但绝对值更大,对Android 会场秒开贡献更为突出。

     

    2015年预加载已经在双11 H5 会场中有较多应用,2016 年预加载升级为一项基础服务,不仅为WindVane 提供预加载能力,也成为Weex 秒开的最强外援。

     

    此次双11会场共启用 30 个预加载包,总容量超过 20MB,业务需求相对稳定且流量较大的几个页面(会场框架+主会场等)是独立的包,保证了对整体秒开的贡献,其他分会场均分在剩余的包中。同时主要采用强制更新的策略,即新的资源包(服务端有新发布)未下载到本地就直接读取线上,可以保证业务的实时性。2016.11.11,双11会场中Android 走预加载占比为59.4%,iOS 为 62.5%,高于平均水平(但还可以更高)。


    4.2首屏渲染优化

     

    首屏渲染优化的目标就是尽力缩短首屏的渲染时间,为此在一系列的优化过程中,可以粗分为:DOM 解析优化、UI 渲染优化、分段懒加载。

     

    4.2.1 DOM 解析优化

     * Component append 属性定义了 `node` 和 `tree` 2 种渲染模式,`node` 就是逐个节点渲染,`tree` 就是整棵树一起渲染。直观的对比:node | tree

     * `node` 模式,节点逐个从 js 提交到 native 的, native 侧有个 16ms 间隔的 layout 保证渲染的正确性,这是更接近于WebKit 的一种解析渲染模式。优势是每一个被解析完的节点都可以立刻显示,同时保证不会长时间阻塞主线程,劣势是可能会造成多次冗余 layout,拉低流畅性。

     * `tree` 模式,整棵树(以当前节点为 root 的整棵树)从 js 提交到 native。优势是只需布局一次,渲染更高效;劣势是如果 tree 过大,就可能会阻塞主线程甚至阻塞渲染。

     * `node` 和 `tree` 可以精细化地控制页面展示的逻辑和颗粒度,典型的实践为首屏以内按 tree 解析,首屏以外按 node 解析。


    4.2.2 UI 渲染优化

        * List 组件在 native 分别对应 iOS UITableView 和 Android RecyclerView,这两种 View 构建了 App 的半壁江山,使用它们来封装 list 的好处:

        * 只会渲染可见区域,减少首屏的渲染消耗

        * 内存复用,所有滑动到不可见区域的 cell 都会被系统回收,用于渲染下一个 cell

       * cell 之间天然互相隔离, 可以默认以 cell 维度划分并用 tree 的模式解析,提高渲染效率

        * 拥有原生的交互体验,在 cell 上点击、左滑、右滑、移动排序等交互方式后续可以更方便地支持

       * 想要达到 60FPS 的体验,一次主线程渲染必须少于 16ms。Weex 中一次渲染需要经过 6 个主要步骤(Build Tree、Compute Style、CSSLayout、Create View、Update Frame、Set View Props),所以必须在 16ms 内完成这 6 个步骤,现实是任何一步在主线程中都可能超过16ms,这块。

     

    4.2.3分段懒加载

     * 除了底层的优化,业务上也通过分段懒加载进一步降低整体渲染时间,对首屏渲染有间接帮助(减少调度)

    * 方案为:会场页面使用 List 进行布局,一个 cell 对应一个模块;页面启动默认加载 6 个模块(少数页面因为首屏模块过多因此特殊处理);默认往下滑到底触发loadmore 后再加载 5 个模块;若加载过程中遇到电梯则电梯以下模块全部加载

     

    除了底层的保障,我们也坚持每天产出“性能优化建议”,推进业务性能优化,接下来会有更加方便的工具提供给业务方直接性能调优;如双11期间devtool 中增加了层级检测和告警,可以帮助排查深层级导致的 android 低端机 stackoverflow。

     

    4.3秒开数据

     

    由于主会场流量占据了总流量的大部分,对其秒开率单列统计。2016.11.11数据为:

     

    主会场

    l  秒开率峰值(00:00):

    整体 96.9%(278.8ms)

    ios99.4%(146.4ms)

    Android93.4%(411.1ms)

    l  秒开率均值:

    整体 94.4%(367.6ms)

    ios99.0%177.0ms

    Android 91.8%(473.3ms)

    l  帧率(FPS):

    红米 Note1s 53、小米5s 58.5;

    iPhone5c53.1

    iPhone6p56.9

    iPhone7 5

    帧率数据来自线下采集,见视频(左起为 H5、iOS Weex、Android Weex)。


     

    所有会场

    l  秒开率峰值(00:49):

    整体 92.4%(490.7ms)

    iOS97.4%(291.6ms)

    Android87.5%(689.8ms)

    l  秒开率均值:

    整体 83.9%(651.9ms)

    iOS94.5%368.0ms

    Android 78.6%(797.4ms)

     

    5.新的起点

     

    Weex 技术委员会在十月中成立了,核心解决 Weex 开发过程中的标准化和协同问题。并于10.26进行了第一次会议,审议的 4 个话题(Input focus/blur、750px实现方案、weex analyze后续发展、标准化流程草案)经过充分讨论,均获得全员投票通过。

     

    鬼道作为第一任组长,接下来半年带领各方推进 Weex 在集团和社区的深度建设,欢迎大家参与Weex 的共建之中。对于参与 Weex 的各方而言,最直接的影响就是:需要作为 Weex 官方推荐,向集团或(和)外部社区贡献的 Module、Component、工具、平台 等成果 需要通过 Weex 技术委员会检视标准性。要求在 方案设计出来后实现之前和(或) 实现出来后 这 2 个时间点向 Weex 技术委员会汇报标准性相关细节;这个要求是强制的,目的是保持 Weex 社区的标准化推进。如果你只是为局部业务开发定制化的Weex 扩展,不涉及标准性,并不会被要求到 Weex 技术委员会汇报。

     

    Weex 任重道远:

    1. Weex 不只是 Weex 容器,Weex 业务背后是发布、预加载、AB、线上监控、质量效能度量、数据埋点、业务开发技能转变/升级 等一系列行为的交织,如何减少业务从H5/Native 转向 Weex 时的“阵痛”,是接下来的攻坚重点

    2. 双11中遇到的典型案例或问题,会成为下一阶段的工作重点之一

    3. 仍有大量业务需求需要开发,为此我们已经启动了 Weex BigBang 项目,按照 WindVane  API 的调用频度和业务反馈情况,分批实现 30+ Weex Module/Component,包括常用的 schema 唤起支持、网络类型判断、geolocation、audio、cookie、大图预览、通讯录等

    4. 减少新客户端接入 Weex 的成本,目前在尝试的 AliWeex 项目会扩大应用范围并成为客户端接入的标配

    5. 跨客户端的底层依赖不同步问题会一直存在下去,需要更好的解法

     

    不一一列举了,之后会有 Weex Roadmap 的讨论并且会及时公布出来,欢迎关注。

     

    从“Native 和 Web 融合”开始,先后经历的 Hybrid、React Native、WVC再到 Weex,这段经历也算挺戏剧性的;未来会是 Weex 吗?答案并不重要,唯有沉醉其中。


    One More Thing

    Weex团队招人啦!* Webkit/V8工程师 * Android工程师 * iOS工程师 * 前端工程师快到“全职参与开源项目”的碗里来~


    Weex 不仅在双十一中会场覆盖率达到99.6%(1700+页面),同时还在支撑大促以外更多的业务,有大量Weex内核性能/稳定性工作、大量新功能、配套的工具、社区需要建设,

    展开全文
  • google webbluetooth在windows下不能弹出设备搜索列表提示“Web Bluetooth API is not available”,因为webbluetooth是google新推出的功能(其实也不是很新已经三年多了,但在国内发展比较)也不是十分成熟。...

    google webbluetooth在windows下不能弹出设备搜索列表提示“Web Bluetooth API is not available”,因为webbluetooth是google新推出的功能(其实也不是很新已经三年多了,但在国内发展比较慢)也不是十分成熟。网上各种文档资料还较少。

    所以Chrome将访问蓝牙设备列表功能禁用了,要想在Windows下使用必须在高级系统设置中开启标记权限。

    地址如下:‘chrome://flags/#enable-experimental-web-platform-features’,将此项设置为“Enable”然后重启浏览器,再次执行即可弹出设备列表。

    前提条件:1、带有蓝牙功能的笔记本

         2、台式机需要有蓝牙适配器,切安装蓝牙驱动

         3、请在Https协议下运行项目

    google蓝牙demo地址:https://googlechrome.github.io/samples/web-bluetooth/index.html

    转载于:https://www.cnblogs.com/wanghaiyang/p/9321739.html

    展开全文
  • 在复杂页面上速度较慢(类似于纯文本搜索)。 $ {selector}:使用类似于jQuery的格式,即包装在$()中CSS选择器,以查找与给定选择器匹配的节点。 当前,这将仅返回第一项。 此方法使用自动化API的domQuerySelector...
  • mysql学习笔记

    2020-03-29 17:00:05
    一.mysql概述。 1.mysql。MySQL是最流行的关系型数据库管理系统,在web应用方面MySQL是最好的RDBMS应用软件之一。...我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。所以现在我们使用关...
  • MYSQL数据库

    2021-01-12 14:09:56
    MYSQL数据库 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 ...我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统(RDBMS)来存
  • 初识MySQL数据库

    2020-05-14 17:10:24
    MySQL数据库 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS...我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统
  • MySQL数据库设计

    2020-05-11 18:40:38
    MySQL MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational ...我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统(RDB
  • 一、简介 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS...我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库管理系统(R
  • MySQL --概述--

    2016-12-18 21:04:00
    每个数据库都有一个或多个不同的(应用程序编程接口)API用于创建、访问、管理、搜索和复制所保存的数据(我们也可以将数据存储在文件中,但是文件的读取速度相对较慢) 所以使用关系型数据库管理系统,建立在关...
  • node.js 学习---第一章

    2021-01-15 10:43:00
    在浏览器中,不存在 Node.js 通过其模块提供的所有不错的 API,例如文件系统访问功能 Node.js 使用 CommonJS 模块系统,而在浏览器中,则还正在实现 ES 模块标准。在实践中,这意味着在 Node.js 中使用 require(),...
  • 单枪匹马数据库

    2021-02-28 00:19:11
    三天认识数据库前言一、数据库是什么二、对MySQL数据库的学习1.引入MySQL2.基本的功能实现 前言 经过对java中IO流的学习以后,我们开始了第三...我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。 简
  • 数据库简介基础复习

    2020-05-12 20:29:40
    我们也可以将数据库存储在文件中,但是在文件中读写数据速度相对较慢。 所以,现在我们使用关系型数据库(RDBMS)来存储和管理大数据量。 所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学...
  • web】静态资源访问实例 WebMvcConfigure, spring.resources.static-locations 204-web-static-resources-ui 【webwebjar静态资源 第三方jar包提供纯静态资源 204-web-freemaker 【web】freemaker引擎整合 ...
  • Memcached缓存资料

    2014-07-23 10:08:29
    由于memcached通常只是当作快取系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程式码更新memcached内的资料[1] memcached 是以LiveJournal 旗下Danga Interactive 公司的...
  • (访问速度比较~)预览地址 05. 快速排序的js实现 根据百度百科中快速排序算法的原理完成js的实现。 源码地址 预览地址 06. 音乐可视化 摸索中…… 07. 图片懒加载 注:我的图片体积大,在线预览效果...
  • c# Linq WebService rss

    2011-11-30 10:12:14
    用户已报告,在某些运行速度较慢的计算机上,或在使用虚拟 PC 时,某些数据库应用程序在首次运行时出错。请尝试运行该示例两次或三次。 未将 LDF (日志)文件随示例中包含的 Northwind 数据库自定义副本一起提供。...
  •  ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据,...
  • java 面试题 总结

    2009-09-16 08:45:34
    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据,Vector...
  • 本项目使用了大量Gif图片, 而且github在国内的访问速度非常不稳定,导致文章页面打开稍, 为了解决大陆用户访问项目速度的问题, zhaoolee在阿里云买了一台5M的VPS, 已将所有文章链接替换到v2fy.com域名下, 访问...
  • 编译速度较慢,但可执行文件更小更快。使用选项时会自动设置此选项-fno-x。 -fno-[eval|string-normalize|regexp|json|proxy|map|typedarray|promise] 禁用所选语言功能以生成较小的可执行文件。 2.4 qjscalc 应用...
  • java面试题

    2018-04-27 19:55:38
    答:JDBC数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系型数据库提供统一访问。 什么情况下不建议使用Hibernate? 答:当数据量大,并且表关系复杂的时候不建议使用。 sleep()和wait()有什么区别? ...
  • Lucene实战(第2版) 中文版

    热门讨论 2013-03-20 11:04:29
    5.11 停止较慢的搜索 5.12 小结 第6章 扩展搜索 6.1 使用自定义排序方法 6.1.1 针对地理位置排序方式进行文档索引 6.1.2 实现自定义的地理位置排序方式 6.1.3 访问自定义排序中的值 6.2 开发自定义的...
  • 参考 <a href="http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/">全面理解面向对象的 JavaScript</a>)</li><li>基于类<code>Class的面向对象,对象由类<code>Class产生:如<code>...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

webapi访问较慢