简历项目经验层次php
redishtml
应用场景前端
内部数据结构node
dict:key[string] VS value (redis obj);拉链法解决冲突(同php);装载因子(哈希表已保存节点数量 / 哈希表大小)超过预约值自动扩充内, 引起(增量式)rehashingmysql
期间响应客户端react
sds:simple dynamic stringlinux
robj:redis object,为多种数据类型提供一种统一的表示方式,同时容许同一类型的数据采用不一样的内部表示,支持对象共享和引用计数。nginx
typedef struct redisObject { unsigned type:4;【OBJ_STRING, OBJ_LIST, OBJ_SET, OBJ_ZSET, OBJ_HASH】 unsigned encoding:4【上述type的OBJ-ENCODING _XXX常量,四个位说明同一个type多是不一样的encoding,或者说同一个数据类型,可能不一样的内部表示】; unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount; void *ptr【真正指向的数据】; } robj
OBJ_ENCODING_laravel
stringgolang
OBJ_HASH
OBJ_SET
config
OBJ_ZSET
OBJ_LIST
config
内部结构实现
hash(两种encoding,根据下面的config)
config
list
zset如何根据两个属性排序?好比根据id和age
redis是如何保证原子性操做的?
主从复制过程:
特性:
/* Include the best multiplexing layer supported by this system. * The following should be ordered by performances, descending. */ #ifdef HAVE_EVPORT #include "ae_evport.c" #else #ifdef HAVE_EPOLL #include "ae_epoll.c" #else #ifdef HAVE_KQUEUE #include "ae_kqueue.c" #else #include "ae_select.c" #endif #endif
备份与持久化
rdb(fork 进程dump到file,可是注意触发节点的覆盖问题,致使数据不完整)
conf:save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb
aof(相似binlog)
过时策略:
内存淘汰机制
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy" 2) "noeviction" 127.0.0.1:6379>
redis队列特殊关注(可能坑)之处
队列可能丢东西
队列的consumer 须要手动处理commit协议
事件重放机制不支持
队列最大长度及过时时间
sennx
或者基于set
众多参数没问题,集群下可利用tag机制vs memcache
memcached
优点
劣势
特色
redis
优点:
劣势:
more | other
redis 单线程如何实现阻塞队列?
redis 阻塞队列的时间设置实现?
mysql
索引
物理存储
数据结构
逻辑角度
复合索引 (最左前缀原则)
引擎类型
区别:
相同点:
存储
innodb
root@udev:/var/lib/mysql# ls
中查看,下图为innodb
行格式,由下到上,均向上兼容Antelope 羚羊 对存放bolb或者大varchar存储极长的数据时,将行数据的前768字节存储在数据页中,后面经过偏移量指向溢出页。
Barracuda 梭鱼
myisam
事务
分表数量级
隔离级别
索引机制(算法)
b+tree(m阶b+tree)
b-tree【不要念成b减tree,-只是个符号】
特色(m阶的B树)
b+与b-区别
锁
种类
pessimistic lock悲观锁
innodb的MVCC(Multi-Version Concurrency Control)
- 翻译成中文叫~~心理医生~~ ,多版本并发控制,适用于行锁的、事务性的数据库模型。 - 适用于innodb的rc和rr级别,由于可串行化涉及到锁表 - 实现思想是在每行增长一个create_verison和delete_version字段 - update 是插入一个新行,先保存当前版本号到旧行的delete_version,且新建行的new_create_version也就是delete_version - delete操做就是直接标记delete_version - insert的时候,就是保存至create_version - selete的时候能够这样 - 读delete_version为空的 - 大于当前事务版本号的 - 建立版本号<=当前事务版本号的
粒度划分
意向锁 intention lock(表级锁)
锁的算法
覆盖索引(复合索引)
汇集索引cluster index 通常为primary key
CREATE TABLE users( id INT NOT NULL, first_name VARCHAR(20) NOT NULL, last_name VARCHAR(20) NOT NULL, age INT NOT NULL, PRIMARY KEY(id), KEY(last_name, first_name, age) KEY(first_name)
辅助索引:非汇集索引均可以被称做辅助索引,其叶子节点不包含行记录的所有数据,仅包含索引中的全部键及一个用于查找对应行记录的【书签(即主键或者说汇集索引)】,下面两个图为辅助索引(first_name,age)以及经过主键再次查找的过程
explain
extra
type(链接类型:join type),如下逐步增大
其余:
hash
hash 碰撞解决方案
想到了php max_input_vars
)开放寻址,优势是空间利用率高,一直找..
链表操做
单链表删除
p->next=p->next->next; if(head->next===null){ head=null }
单链表插入
new_node->next=p->next; p->next=new_node if(head===null){ head=new_node; }
应用问题
设计模式
单例模式 (static ,consturct)
static private $instance; private $config; private funciton __construct($config){ $this->config=$config; } private funciton __clone(){ } static public function instance($config){ if(!self::$instance instanceof self){ self::$instance=new self($config); } return self::$instance; } }
简单工厂(switch case include new return )
{ public function makeModule($moduleName, $options) { switch ($moduleName) { case 'Fight': return new Fight($options[0], $options[1]); case 'Force': return new Force($options[0]); case 'Shot': return new Shot($options[0], $options[1], $options[2]); } } } # 使用工厂方式 001 class Superman { protected $power; public function __construct() { // 初始化工厂 $factory = new SuperModuleFactory; // 经过工厂提供的方法制造须要的模块 $this->power = $factory->makeModule('Fight', [9, 100]); // $this->power = $factory->makeModule('Force', [45]); // $this->power = $factory->makeModule('Shot', [99, 50, 2]); /* $this->power = array( $factory->makeModule('Force', [45]), $factory->makeModule('Shot', [99, 50, 2]) ); */ } } # 使用工厂方式 002 class Superman { protected $power; public function __construct(array $modules) { // 初始化工厂 $factory = new SuperModuleFactory; // 经过工厂提供的方法制造须要的模块 foreach ($modules as $moduleName => $moduleOptions) { $this->power[] = $factory->makeModule($moduleName, $moduleOptions); } } } // 建立超人 $superman = new Superman([ 'Fight' => [9, 100], 'Shot' => [99, 50, 2]
门面模式
正则表达式
应用场景
php
代码解释过程(大多的非编译语言)
语法分析 工具为文法(LALR),输出为表达式,7.0为AST,涉及:
类型检查、关键字处理、导入,输出为中间代码。工具为选定的的编译器优化工具
代码规范
php进程间如何通讯
经常使用的数组函数(列出10个)
php垃圾回收机制(gc)
php.ini
funciton
把session放入redis里面还会触发相似文件的state session
操做系统
进程间通讯手段
线程间通讯手段
网络协议
http
版本:
长链接
httpdns
其余解决方案
get vs post:
get(
post
resultful
Rpc VS Http/rest
http/rest
同步阻塞
优势
注意点
rpc
分类
优点
注意点
tcp
释放:
关于TIME_WAIT:
关于'粘包'
长链接TCP分包:
xml,json
特性协议
udp
js
百度统计的实现
中间件
php框架
laravel
IocContainer:(工厂模式的升华:ioc容器)
实现方式
运维&架构
golang
linux
awk
nginx
负责均衡实现方式
第三方
分布式
微服务
最佳原则
业务内原则:
考虑问题
基于事件+生产|消费模型选型
其余
分布式
基础
分布式协议
分布式工具
如何对一个大文件排序(装不进内存的)-好将来
思路:
冒泡排序代码