簡歷項目經驗層次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
負責均衡實現方式
第三方
分佈式
微服務
最佳原則
業務內原則:
考慮問題
基於事件+生產|消費模型選型
其餘
分佈式
基礎
分佈式協議
分佈式工具
如何對一個大文件排序(裝不進內存的)-好將來
思路:
冒泡排序代碼