算法
总体较全链接
https://www.cnblogs.com/fengyumeng/p/10994279.html
》B、B+、B* tree
B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;
所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
B*树:在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
具体链接: https://blog.csdn.net/andyzhaojianhui/article/details/76988560
》Hash
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构
具体链接: https://www.cnblogs.com/xiohao/p/4389672.html
》sort
十大经典排序算法
排序算法
冒泡排序(Bubble Sort)
选择排序(Selection Sort)
插入排序(Insertion Sort)
希尔排序(Shell Sort)
归并排序(Merge Sort)
快速排序(Quick Sort)
堆排序(Heap Sort)
计数排序(Counting Sort)
桶排序(Bucket Sort)
基数排序(Radix Sort)
具体链接:https://www.cnblogs.com/AlvinZH/p/8677814.html
》seek
》矩阵
》分布式:cap、一致性哈希
cap:https://blog.csdn.net/w372426096/article/details/80437198
一致性哈希:https://www.cnblogs.com/jajian/p/10896624.html
Linux 命令
》nginx 访问日志指定行数统计:
cat *.log | grep 'url' | wc -l
》去重文件重复行:
uniq
》分隔日志:
spit
》查看日志最后100行:
tail -f -n 100 access.log
》shell脚本接收input变量的 $0 代表什么:
shell脚本的文件名
》查看目录下第一级子目录的磁盘占用情况:
du -h --max-depth=1
Nginx
》restart 与 reload 区别;
reload一般只是从新读取一次配置文件。
restart则是把进程停掉,从头启动一次。
restart自然也就reload了。
但是对于大型服务,restart可能不方便。
》master进程与worker进程区别;
ngnix进程启动启动后会有一个master进程和多个worker进程。
master进程的主要作用:
1.读取并验证配置信息;
2.创建,绑定及关闭套接字;
3.启动,终止worker进程以及维护worker进程的个数;
4.无须终止服务而重新配置工作。
5.控制非中断式程序升级,启用新的二进制程序并在需要的时回滚到老版本。
6.重新打开日志文件。
7.编译嵌入式perl脚本。
worker主要作用:
1.接收,传入并处理来自客户端的连接;
2.提供反向代理及过滤功能;
3.nginx任何能完成的其他任务
》upstream 原生支持的3种分配方式;
1、轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。
upstream backend {
server 192.168.1.101:8888;
server 192.168.1.102:8888;
server 192.168.1.103:8888;
}
2.weight
轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。
upstream backend {
server 192.168.1.101 weight=1;
server 192.168.1.102 weight=2;
server 192.168.1.103 weight=3;
}
3、ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
upstream backend {
ip_hash;
server 192.168.1.101:7777;
server 192.168.1.102:8888;
server 192.168.1.103:9999;
}
具体链接:https://blog.csdn.net/wangpengfei163/article/details/81661407
MySQL
》使用自增主键的好处
1.自增主键节省存储空间。
2.innodb的索引特性导致了自增id做主键是效率最好的
具体链接:https://www.jianshu.com/p/b8d6d809fce3
》长度大于 255 的varchar
用text类型
》MySQL查询优化:
太多了直接看链接吧
具体链接:
https://zhuanlan.zhihu.com/p/101959564
https://www.nowcoder.com/discuss/150059?type=0&order=0&pos=13&page=0
》Innodb 主键索引与二级(辅助)索引;
太多了直接看链接吧
具体链接:
https://blog.csdn.net/alexdamiao/article/details/51934917
归纳:https://blog.csdn.net/u010841296/article/details/77427175?locationNum=4&fps=1
》B-tree;B+tree;B*tree 比较;
有了
》Innodb 逻辑存储结构;
InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block),1 extent = 64 pages,InnoDB存储引擎的逻辑存储结构大致如图所示。
具体链接,
https://www.jianshu.com/p/fdc5e066433a
https://www.cnblogs.com/wade-luffy/p/6288656.html
》为什么INNODB数据页面中最少存储2条记录?
额。还是看链接吧
https://www.cnblogs.com/bdsir/p/8745553.html
https://www.cnblogs.com/bamboos/archive/2012/11/13/2768375.html
PHP
》PHP 解释型;
》PHP-FPM;
FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。
它的功能包括:
1.支持平滑停止/启动的高级进程管理功能;
2.可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置);
3.stdout 和 stderr 日志记录;
4.在发生意外情况的时候能够重新启动并缓存被破坏的 opcode;
5.文件上传优化支持;
6."慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢;
7.fastcgi_finish_request() - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等);
8.动态/静态子进程产生;
9.基本 SAPI 运行状态信息(类似Apache的 mod_status);
10基于 php.ini 的配置文件。
具体链接:
https://www.php.net/install.fpm
https://zhuanlan.zhihu.com/p/96911584
》PHP 弱类型实现;引用计数、写时拷贝;
PHP是弱类型,
动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。例如:
php $var = 'Hello World'; ?>
引用计数
每个php5.5变量都存储在一个叫做zval的变量容器中。
一个zval变量容器,除了包含变量的类型与值外,还包含两个字节的额外信息:
1、第一个是“is_ref”,是个bool型,用来标识这个变量是否属于引用集合(reference set),若属于则其值为1,否则为0。
有个这个变量php引擎就能够将普通变量与引用变量区分开来。
2、第二个是“refcount”,用来表示指向这个zval变量(符号)的个数。每个符号都有作用域(scope),那些主脚本和函数或者方法也都有作用域。
所有的符号都存在一个符号表中。
当一个变量被赋值一个常量值时,就会生成一个zval变量容器,如下例:
这个时候执行以下程序得到$a变量指向zval容器中的is_ref与refcount值
a: (refcount=1, is_ref=0)='Hello world'
写时复制
PHP中的写时复制可以简单描述为:
如果通过赋值的方式赋值给变量时不会申请新内存来存放新变量所保存的值,
而是简单的通过一个计数器来共用内存,
只有在其中的一个引用指向变量的值发生变化时才申请新空间来保存值内容以减少对内存的占用。
具体链接
饮用计数:
https://www.cnblogs.com/leezhxing/p/4151784.html
写时拷贝:
推荐看:https://www.php.cn/php-weizijiaocheng-390368.html
https://zhuanlan.zhihu.com/p/26654414
http://www.haonin.com/content/php-copy-on-write-copy-on-write.html
》PHP7 新特性:opcache;命名空间;composer;生成器;SPL;闭包等;
》PHP GC 相关:destruct;循环引用;
引用计数——根缓冲区内数量到达10000——深度优先遍历(refcount-1)——refcount变为0则为垃圾;
不为0则移出缓冲区(先进行refcount+1操作还原);
紫(已加入缓冲区)、灰(已进行-1操作)、白(垃圾标识)、黑(正常变量待移出缓冲区);
》PHP Array -> Hash Table -> Hash冲突;处理Hash冲突常见方式;
链地址法
》PHP 现代框架(Laravel、Yii2)核心设计模式(依赖注入、服务容器);魔术方法、反射等;
》PHP 最好的语言?
Redis
》常用命令
》数据结构列举;SET与ZSET区别;
》缓存穿透、缓存雪崩、缓存击穿;
》key过期删除策略;
》RDB 与 AOF;
Git
Golang
》线程与协程,goroutine 防范泄漏
》map键类型约束,查找过程,碰撞怎么办
》map 并发安全
》new与make区别
》闭包
》切片cap(),扩容方式
》接口变量的 动态值、动态类型、静态类型
》互斥锁解决什么问题
》条件变量用于解决什么问题
》条件变量为什么要基于互斥锁保护下执行
》for sendCond.Wait()为什么用for ?
》原子操作
》waitgroup作用,方法调用顺序,计数周期
》context,withCanel
》go 模块划分(按职责垂直;MVC按层级水平)
》map 与 struct 使用场景
》面向接口、鸭子类型、组合