Skip to content

Instantly share code, notes, and snippets.

@yezihack
Last active July 16, 2018 15:45
Show Gist options
  • Save yezihack/392837fa1d5aa1b9c81787262c0d8d65 to your computer and use it in GitHub Desktop.
Save yezihack/392837fa1d5aa1b9c81787262c0d8d65 to your computer and use it in GitHub Desktop.
web开发重要知识点,mysql,基本算法,网络知识
Redis
Redis是一个基于内存key-value的数据库
支持多种数据结构,string,list, set,hash
速度快,基于内存存储。
支持事务:原子性,一致性,隔离性,持久性。
提供持久化数据
Redis支持主从同步
Memcache
memcache是一套分布式的高速缓存系统
缺点:
数据只能存储在内存里,重启数据将丢失,无持久化数据
支持存储类型单一
redis和memcache的区别
memcache
redis 的RDB和AOF持久化的区别
RDB:手动运行SAVE时再备份
优点:使用单独子进程来进行持久化,主进程不会进行任何IO操作,保证了redis的高性能
Aof:缓存一致性
append only file。把所有对redis数据库操作的命令,增删改操作的命令保存到文件中,数据库恢复时把所有命令执行一遍
索引类型:normal, unique, fulltext
索引方法:btree,hash
normal 表示普通索引
unique 表示唯一,不允许重复索引
fulltext 全文搜索索引
hash只支持精确查找,不支持范围查找,不支持排序
btree支持范围查找,支持排序
MyIsAm和InnoDB都支持BTree
myisam的btree是牺牲性能
InnoDb的Btree是变种btree
索引字段越小越好
离散度更大,就放最前面.
判断离散程度
select count(distinct custom_id), count(distinct stiff) from table;
数据最大离散度更大
index(custom_id, stiff)
MYSQL 查看库状态
show table status from dataname;
MYSQL查看某表的状态
show create table tablename;
MYSQL 查看所有的引擎
show engines;
MYSQL 事物四大特性
原子性,一致性,隔离性,持久性
查看MySQL服务器配置信息
show variables;
查看MySQL服务器运行的各种状态值
show global status
MYSQL慢查询
show variables like '%slow%';
show global status like '%slow%';
连接数
show variables like 'max_connections';
show global status like 'max_used_connections';
max_used_connections / max_connections * 100% = 99.6% (理想值 ≈ 85%)
查询缓存(query cache)
show variables like 'query_cache%';
show global status like 'qcache%';
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。
show variables like 'query_cache%';
query_cache_limit:超过此大小的查询将不缓存
query_cache_min_res_unit:缓存块的最小大小
query_cache_size:查询缓存大小
query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
文件打开数(open_files)
show global status like 'open_files';
show variables like 'open_files_limit';
比较合适的设置:Open_files / open_files_limit * 100% <= 75%
参考: https://blog.csdn.net/mooncarp/article/details/51787694
用于设置set global max_allowed_packet = xxx
复制表结构至新表
create table 新表 select * from 旧表 where 1<>1
create table 新表 like 旧表
复制表结构及数据到新表
CREATE TABLE 新表 SELECT * FROM 旧表
复制旧表的数据到新表(假设两个表结构一样)
INSERT INTO 新表 SELECT * FROM 旧表
复制旧表的数据到新表(假设两个表结构不一样)
INSERT INTO 新表(字段1,字段2,.......) SELECT 字段1,字段2,...... FROM 旧表
# myisam 与 innodb
myisam 不支持事物, innodb支持事物
myisam 可能允许没有主键, innodb不加主键,系统会自动生成一个6位的隐藏主键
myisam 支持全文搜索, innodb不支持全文搜索
myisam 支持表级锁, innodb支持行级锁
myisam存储形成三个文件,innodb只存储一个文件,受文件大小限制,一般2g或4g
myisam 存储一个计数器,innodb没有计数器
大指量查询,插入使用myisam
需要数据完整性,支持事务,崩溃恢复能力使用innodb
大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,
但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。
MYSQL插入
LOAD DATA INFILE效率很高
load data infile "/data/mysql/e.sql" into table e;
# mysql强制使用
强制索引 force index
SELECT * FROM TABLE1 FORCE INDEX (FIELD1) …
忽略索引 IGNORE INDEX
SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2)
关闭查询缓冲 SQL_NO_CACHE
SELECT SQL_NO_CACHE field1, field2 FROM TABLE1;
强制查询缓冲 SQL_CACHE
SELECT SQL_CALHE * FROM TABLE1;
优先操作 HIGH_PRIORITY
SELECT HIGH_PRIORITY * FROM TABLE1;
滞后操作 LOW_PRIORITY
update LOW_PRIORITY table1 set field1= where field1= …
延时插入 INSERT DELAYED
INSERT DELAYED INTO table1 set field1= …
# 表优化
optimize table 表名
#查看表索引详情
show index from 表名
php cgi是一种协议,cgi是php解析器,每次接到一个请求,就会创建一个进程,特别费时费力。后被fastcgi取代
fastcgi提高了CGI程序性能。主进程,一次加载配置。处理由子进程完成。
php-cgi是php的解释器,只解析请求,返回结果,不会进程管理
php-fpm是fastcgi进程管理器,负责管理一个进程池,来处理来自Web服务器的请求
web server(比如说nginx)只是内容的分发者
#冒泡排序
$list = [2, 4, 1, 99, 55, 44, 22];
for ($i = 0; $i < count($list); $i++) {
for ($j = 1; $j < count($list) - $i; $j++) {
if ($list[$j - 1] < $list[$j]) {//小于则降序,大于则升序
$tmp = $list[$j - 1];
$list[$j - 1] = $list[$j];
$list[$j] = $tmp;
}
}
}
#约瑟夫环
josephus(100, 5);#47
/**约瑟夫环*/
function josephus($n, $m)
{
$monkey = range(1, $n);
$i = 0;
while (count($monkey) > 1) {
$i += 1;
$head = array_shift($monkey);//一个个出列最前面的猴子
if ($i % $m != 0) {
#如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
array_push($monkey, $head);
}
}
return array_shift($monkey);
}
/**
* 约瑟夫环
* @param $n
* @param $m
* @return int
*/
public function calc($n, $m)
{
$s = 0;
for ($i = 2; $i <= $n; $i++) {
$s = ($s + $m) % $i;
}
return $s + 1;
}
#二分法
/**
* 二分法查找
* 用法
* $list = [1, 2, 4, 33, 44, 55, 98];
$rs = $this->bSearch2(98, $list, 0, count($list) - 1);
dump($rs);
* @param $search
* @param $list
* @param $min
* @param $max
* @return int
*/
function bSearch2($search, $list, $min, $max)
{
if ($max < $min) {
return -1;
}
$mid = intval(($min + $max) / 2);
if ($list[$mid] > $search) {
return $this->bSearch2($search, $list, $min, $mid - 1);
} elseif ($list[$mid] < $search) {
return $this->bSearch2($search, $list, $mid + 1, $max);
} else {
return $mid;
}
}
/**
* 二分法查找
* @param $list
* @param $search
* @return int
*/
function bSearch($list, $search)
{
$min = 0;
$max = count($list) - 1;
while ($min <= $max) {
$mid = intval(($min + $max) / 2);
if ($list[$mid] == $search) {
return $mid;
} else if ($list[$mid] > $search) {
$max = $mid - 1;
} else if ($list[$mid] < $search) {
$min = $mid + 1;
} else {
return $mid;
}
}
return -1;
}
#快速获取最大值,最小值
function getMax($list)
{
$max = $list[0];
for ($i = 0; $i < count($list); $i++) {
if ($list[$i] > $max) {
$max = $list[$i];
}
}
return $max;
}
function getMin($list)
{
$min = $list[0];
for ($i = 0; $i < count($list); $i++) {
if ($list[$i] < $min) {
$min = $list[$i];
}
}
return $min;
}
# TCP/IP 协议
应用层,传输层,网络层,网络接口层
应用层:采用什么协议传输,http,ftp,ssh,smtp,telnet,https(tls/ssl)
传输层:TCP,UDP
网络层:物理逻辑寻址,确定传输目标,端到端的传输服务(ip寻址,icmp报文协议)
网络接口层:各种物理通信网络接口
#浏览器上输入网址后发生什么?
1.输入地址url
2.查看缓存,如果有缓存直接显示
3.域名解析(DNS)获取相应IP
4.向服务器发起TCP协议,建立三次握手
5.服务器请求数据,将处理完的数据返回http报文
6.浏览器接收响应,渲染页面.
7.连接结束
#http常见状态码
200成功
202已接受
301永久重定向
302临时移动
304请求页面未修改
305使用代理
400请求语法错误
401未授权
403服务器拒绝请求
404未找到
500服务器内部错误
502网关错误
503服务不可用
504网关超时
505http版本不支持
进程:
1.进程是资源分配的基本单位,它是程序执行的一个实例.
2.一个程序至少有一个进程,一个进程至少有一个线程
3.进程拥有独立的内存单元,多个线程共享内存.从而极大的提高了程序的运行效率
4.同一个进程可以包括多个线程,并且线程共享整个进程的资源,一个进程至少包括一个线程.
线程:
1.线程是程序执行的最小单位,它是进程的一个执行流
线程和进程各自有什么区别和优劣呢?
1.进程是资源分配的最小单位,线程是程序执行的最小单位。
2.进程有自己的独立地址空间,每启动一个进程,系统就会分配地址空间.
为什么使用多线程?
1.使用多线程可以减少程序响应时间
2.与进程相比,线程的创建和切换开销更小
3.多CPU或多内核计算机本身具有执行多线程的能力.
4.使用多线程能简化程序的结构,使用程序便于理解和维护.
面试对象三大特性:封装,继承,多态
封装: 将一类事物的属性和行为抽象成一个类,隐藏内部实现细节,提供外部访问方式.使代码模块化,复用性更高.增加安全性,简化编程.
继承:进一步将一类事物共有的属性和行为抽象成一个父类,由每一个子类继承父类,进一步提高代码的复用性.
多态:
1.封装是为了对物与外界交流进行抽象。
2.继承是为了对物的信息进行抽象。
3.多态是为了对物的行为进行抽象。
类:是封装对象属性和行为的载体
PHP 解决多继承,接口解决,trait解决
OOP达到了软件工程的三 个目标:重用性、灵活性和扩展性
参考:https://www.kancloud.cn/webxyl/php_oop/68894
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment