简历(最优.pdf格式)项目经验层次
利用什么技术
redis(这块说的太乱了,回头我好好整理下~)
应用场景
内部数据结构
Hash:dictht->dickEntry,dict是对dictht结构再次封装。装拉链法(单向链表)解决冲突(同php),采用头插的方法;装载因子(哈希表已保存节点数量 / 哈希表大小)超过预定值自动扩充内, 引发(增量式|渐进式)rehash
期间响应客户端
sds:simple dynamic string
robj:redis object,为多种数据类型提供一种统一的表示方式,同时允许同一类型的数据采用不同的内部表示,支持对象共享和引用计数。
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_
string
OBJ_HASH
OBJ_SET
config
OBJ_ZSET
OBJ_ENCODING_SKIPLIST,表示成skiplist
config
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"
redis队列特殊关注(可能坑)之处
队列可能丢东西
队列的consumer 需要手动处理commit协议
事件重放机制不支持
队列最大长度及过期时间
sennx
或者基于set
众多参数没问题,集群下可利用tag机制vs memcache
memcached
优势
劣势
特点
redis
优势:
劣势:
more | other
redis 单线程如何实现阻塞队列?
redis 阻塞队列的时间设置实现?
redis 事务机制
redis 主从哨兵配置,copy三份redis.conf文件,以下设置一主二从一哨兵
vim redis01.conf
port 63791
vim redis02.conf
port 63792
slaveof 127.0.0.1 63791
vim redis03.conf
port 63793
slaveof 127.0.0.1 63791
vim sentinel.conf
daemonize yes
port 26379
sentinel monitor mymaster 127.0.0.1 63791 1
// mymaster为自定义命名,127.0.0.1 63791为master,1为选举主节点的时候投票数目的同意个数,1代表有一个哨兵同意就行。
redis cluster集群
mysql
索引
物理存储
数据结构
逻辑角度
复合索引 (最左前缀原则)
引擎类型
区别:
相同点:
存储
innodb
root@udev:/var/lib/mysql# ls
中查看,下图为innodb
行格式,由下到上,均向上兼容Antelope 羚羊 对存放bolb或者大varchar存储极长的数据时,将行数据的前768字节存储在数据页中,后面通过偏移量指向溢出页。
Barracuda 梭鱼
myisam
事务
分表数量级
隔离级别
索引机制(算法)
b-tree【不要念成b减tree,-只是个符号】
特点(m阶的B树)
b+与b-区别
锁
种类
pessimistic lock悲观锁
innodb的MVCC(Multi-Version Concurrency Control)
selete的时候可以这样
粒度划分
意向锁 intention lock(表级锁)
关于innodb必须要知道的
SELECT \* FROM products WHERE id='3' FOR UPDATE
进行锁,但是必须在事务中锁的算法
覆盖索引(复合索引)
聚集索引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
内存模型
fpm三种配置及场景
dynamic
static
ondaemon
数组底层
fpm状态查看
curl localhost/php_fpm-status
pool: www
process manager: dynamic
start time: 13/May/2017:09:50:43 +0800
start since: 986
accepted conn: 2
listen queue: 0
max listen queue: 0
listen queue len: 0
idle processes: 1
active processes: 1
total processes: 2
max active processes: 1
max children reached: 0
slow requests: 0
操作系统
进程间通信手段
线程间通信手段
网络协议
http
版本:
长连接
httpdns
其他解决方案
get vs post:
get(
post
resultful
RPC
tcp
释放:
关于TIME_WAIT:
关于'粘包'
长连接TCP分包:
xml,json
关于syn flood
常见防攻击方法
延缓tcp分配:当三次握手后再分配tcb,这样可以有效的减轻对服务器资源消耗(常见方法是使用syn cache,syn cookie)
syn cache
syn cookie
特性协议
udp
js
百度统计的实现
中间件
kafka
Redis 队列
php框架
ci
hyperf
laravel
核心关键字:
IocContainer:(工厂模式的升华:ioc容器)
控制反转(inversion of control)可以降低计算机代码之间的耦合,其中最常见的方式叫做依赖注入。(Dependence Injection),还有一种方式为依赖查找。可以理解简单的工厂可以实现依赖的转移(简单理解不需要在A类中依次new ABCDE,只需要传递ABCDE这个参数(必要的时候循环就可以了),然后调用工厂的makeObj方法就可以)
实现方式
运维&架构
golang
linux
# 一般用 -p pid,-u username,-c redis,lsof -i :6379等命令
lsof -n /usr/bin/php7.3
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 19852 root txt REG 252,0 4704192 146309 /usr/bin/php7.3
awk & sed
nginx
负责均衡实现方式
第三方
分布式
微服务
优点:
缺点:(或者难点)
最佳原则
考虑问题
其他
如何对一个大文件排序(装不进内存的)-好未来
思路:
冒泡排序代码