[TOC]
# **自我介紹**
```
您好, 我是董金鑫,本科計算機專業,
之前工作主要做的是:
1. 做為出口跟外部業務 啥的去對接需求
2. 主要做一些api接口這類的,去跟攜程 美團 之類對接接口
3. 服務端的一些開發
之前有做過toB項目(會議服務平臺模塊化的項目 跟大型的企業去對接),
toC項目(即刮彩彩票直播平臺,gp投資服務平臺,大王商城項目)
```
# **實際項目相關問題**
*****
### **一個項目是怎樣做的?**
### **第三方接口加密?**
> 微信加密流程:
> 1.簽名算法
> 第一步:將發送/接受的數據按照ASCII碼字典序排列,使用url鍵值對格式拼接成字符串。
> 第二步:再將剛生成的字符串拼接上用戶自己的密鑰key,然后進行md5加密,加密后再將字符串所有的字母轉化為大寫字母。
> 攜程加密流程:
> 1.通過接口,使用接入賬號和密碼獲取令牌ticket
> 2.再通過令牌進行用戶單點登錄,檢驗身份是否合法。
> 生成簽名Signature方式是,將發送的數據參數值按照攜程規定的順序拼接,再拼接上md5后的接入密碼(AppSecurity)值,生成字符串,再將新字符串MD5.
# **php**
*****
### **php7和php5的區別?**
> 1、性能提升:PHP7比PHP5.0性能提升了兩倍。
> 1.1.變量存儲字節減小,減少[內存](http://www.solves.com.cn/it/yj/nc/)占用,提升變量操作速度
1.2.改善數組結構,數組元素和hash映射表被分配在同一塊內存里,降低了內存占用、提升了 cpu 緩存命中率
1.3.改進了函數的調用機制,通過優化參數傳遞的環節,減少了一些指令,提高執行效率
> 2、以前的許多致命錯誤,現在改成拋出異常。
> 3、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服務器端應用編程端口)和擴展。
> 4、PHP 7.0比PHP5.0新增了空接合操作符。
> 5、PHP 7.0比PHP5.0新增加了結合比較運算符。
> 6、PHP 7.0比PHP5.0新增加了函數的返回類型聲明。
> 四種不同的返回類型可用-bool,int,string和float。
> 7、PHP 7.0比PHP5.0新增加了標量類型聲明。
> 8、PHP 7.0比PHP5.0新增加匿名類。
> 9、錯誤處理和64位支持
### **垃圾回收機制?**
> 本質是引用計數
> php5.3之前判斷垃圾的標準是看:是否有變量名指向變量容器zval,也就是說看refcount是否等于0,若沒有則認為是垃圾釋放掉。
> 但是會因為環形引用,產生內存泄漏。
> 所以從php5.3開始的GC中,對垃圾的說明如下,
> 1.當refcount增加的時候,肯定不是垃圾,不用放到緩沖區中。
> 2.當refcount減少到0的時候,肯定是垃圾,zval會被立即釋放,不是GC處理的垃圾對象不會進入緩沖區
> 3.當refcount減少之后大于0的時候,可能是垃圾,會進入緩沖區進入處理。
### **大文件讀取上傳?**
### **isset和empty的區別?**
### **session與cookie的區別?**
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙
?? 考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能
?? 考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。
### **session共享?**
### **session_Id的傳遞方式?**
> 1.使用post方式傳遞, 隱藏表單
> 2.通過url傳參的方式
> 3.header()
> 4.文件形式
> 在生成session文件的代碼中獲取session\_id并將其寫入文件中,那么其他頁面可以通過獲取該文件內的session\_id,進而獲取session文件中的內容
> session.use\_only\_cookies=1
> session.use\_trans\_sid=0
### **常見的加密算法?**
> 對稱加密:加密與解密**密鑰相同**
> `DES`、加密算法是一種**分組密碼**,以`64`位為**分組對數據**加密,它的**密鑰長度**是`56`位,**加密解密**用**同一算法**
> `3DES`:基于`DES`的**對稱算法**,對**一塊數據**用**三個不同的密鑰**進行**三次加密**,**強度更高**
> `AES`:該加密算法采用**對稱分組密碼體制**,密鑰長度的最少支持為`128`位、`192`位、`256`位,分組長度`128`位,算法應易于各種硬件和軟件實現。這種加密算法是美國聯邦政府采用的**區塊加密標準**。
> 非對稱加密:加密密鑰與解密**密鑰不同**
> `RSA`、`DSA`
> 散列算法:**不需要密鑰**
> `SHA-1`:比`MD5`的**安全性更強**,對于長度小于`2 ^ 64`位的消息,`SHA1`會產生一個`160`位的**消息摘要**。
> `MD5`:都會輸出長度為`128bits`的一個串 (通常用`16`**進制**表示為`32`個字符)。
### **常見php框架的優缺點(結合實際項目使用感受)?**
# **數據庫**
*****
### **explain的幾個重要參數?**
### **事物的隔離級別?**
> read uncommitted(讀取未提交的)
> read committed(讀取已提交的)
> repeatable read(可重復讀)
> serializable(串行化)
臟讀 不可重復讀(需要行鎖) 幻讀(需要表鎖)
不可重復讀側重于修改,幻讀側重于新增或刪除
show global variables like ‘tx\_isolation’;查看mysql的默認事務隔離級別
select @@ tx_isolation 查看當前會話的隔離級別
select @@ global.tx_isolation 查看系統的隔離級別
set session transtion isolatin level serializable 設置當前會話的隔離級別
set global trastion isolation level serializable 設置系統的隔離級別
### **聯合索引?**
```
abc 只能命中 a, ab, abc三種其余都不可命中。
ac 只能命中a
```
### **InnoDB 和 MysIAM的區別?**
> 1. i支持事物,M不支持
> 2. i支持外鍵,M不支持
> 3. i是聚集索引(B+樹),M是非聚集索引
> 4. i不保存表的具體行數,m保存集體的行數的
> 5. i5.7之前不支持全文索引 之后支持了,M支持全文索引
> 6. i有行(默認),表級鎖 m是只有表鎖
> 7. i必須有主鍵,
> 8. i支持奔潰后的安全恢復, m不支持
> 9. Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI
> Innodb:frm是表定義文件(show table status 查看的相關信息),ibd是數據文件
> Myisam:frm是表定義文件,myd是數據文件,myi是索引文件
### **sql語句優化方案?**

### **數據庫優化方案?**
```
(1)、根據服務層面:配置mysql性能優化參數;
(2)、從系統層面增強mysql的性能:優化數據表結構、字段類型、字段索引、分表,分庫、讀寫分離等等。
(3)、從數據庫層面增強性能:優化SQL語句,合理使用字段索引。
(4)、從代碼層面增強性能:使用緩存和NoSQL數據庫方式存儲,如MongoDB/Memcached/Redis來緩解高并發下數據庫查詢的壓力。
(5)、減少數據庫操作次數,盡量使用數據庫訪問驅動的批處理方法。
(6)、不常使用的數據遷移備份,避免每次都在海量數據中去檢索。
(7)、提升數據庫服務器硬件配置,或者搭建數據庫集群。
(8)、編程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查詢;正則表達式過濾(非法字符串過濾);
```

# **redis**
### **redis的各種類型和應用場景?**
> string
> 緩存功能 計數器(視頻播放器)
> hash
> list
> 雙向鏈表
> 點贊 回復
> set
> 數據沒有順序,并且每一個值不能重復
> 去重 抽獎(srandmember)
> zset
> 有序的
> 排行榜 延時任務
### **redis+lua?**
> $redis->eval($lua,array('key1','key2','first','second'),2)
> redis拓展執行腳本,第一個是腳本代碼,第二個是一個數組,參數數組,第三個參數是個整數,表示第二個參數中的前幾個鍵名參數,剩下的都是附加參數
> [EVALSHA](http://redis.readthedocs.org/en/latest/script/evalsha.html#evalsha "(in Redis 命令參考 v2.8)") SCRIPT LOAD通過構建函數名,直接調用 Lua 中已定義的函數,從而執行相應的腳本
### **lua的8數據類型以及和redis類型的轉化?**
1 number 實數 ,可以是整數,浮點數
2.string 字符串,一旦賦值不能被修改,可以通過方法string.gsub()來修改
3.nil 全局變量沒被賦值默認為nil,刪除變量就賦值為 nil
4.boolean(bool) false 和nil為假 ,其它都為真
5.function 函數
6.table 數組、容器
7.userdata (類,其它語言轉換過來就變成userdata類型)
8.thread 線程
### **redis和memcache的區別?**
> **數據結構不同**
Memcache對數據類型支持相對簡單。
Redis有復雜的數據類型。
> **存儲方式**
> memcache把數據全部存在內存之中,斷電會掛掉,數據不能超過內存大小
> Redis有部份存在硬盤上,這樣能保證數據的持久性
> 使用RDB快照的方式,將內存中的數據不斷寫入磁盤;或使用類似MySQL的AOF日志方式,記錄每次更新的日志
> **內存管理機制不同**
>redis
當物理內存用完時,Redis可以將一些很久沒用到的value交換到磁盤,Redis只會緩存所有的key的信息
(實現:Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據“swappability = age\*log(size\_in\_memory)”計算出哪些key對應的value需要swap到磁盤。然后再將這些key對應的value持久化到磁盤中,同時在內存中清除)
>memcache
>它首先從操作系統申請一大塊內存,并將其分割成各種尺寸的塊Chunk,并把尺寸相同的塊分成組Slab Class。其中,Chunk就是用來存儲key-value數據的最小單位。每個Slab Class的大小,可以在Memcached啟動的時候通過制定Growth Factor來控制
>redis
>為了方便內存的管理,在分配一塊內存之后,會將這塊內存的大小存入內存塊的頭部(ret_ptr zmalloc.h和zmalloc.c兩個文件)
>定義一個數組(zmalloc_allocations)來記錄所有的內存分配情況,這個數組的長度為ZMALLOC\_MAX\_ALLOC\_STAT。數組的每一個元素代表當前程序所分配的內存塊的個數,且內存塊的大小為該元素的下標. zmalloc.c中有一個靜態變量used\_memory用來記錄當前分配的內存總大小
> **數據持久化支持不同**
>Redis雖然是基于內存的存儲系統,但是它本身是支持內存數據的持久化的,而且提供兩種主要的持久化策略:RDB快照和AOF日志。而memcached是不支持數據持久化操作的。
>**過期策略的不同**
>memcache在set時就指定
>Redis可以通過例如expire 設定
>**災難恢復的不同**
>memcache掛掉后,數據不可恢復; redis數據丟失后可以通過aof恢復
>**線程模型的不同**
>redis(單線程)
>內部使用文件事件處理器 `file event handler`,這個文件事件處理器是單線程的,所以 redis 才叫做單線程的模型。它采用 IO 多路復用機制同時監聽多個 socket,將產生事件的 socket 壓入內存隊列中,事件分派器根據 socket 上的事件類型來選擇對應的事件處理器進行處理
>其中文件處理器包括:多個 socket, IO 多路復用程序,文件事件分派器,事件處理器(連接應答處理器、命令請求處理器、命令回復處理器)
>memcache
>單進程多線程模型,通過主進程分發給work線程
>**應用場景的不同**
>Redis出來作為NoSQL數據庫使用外,還能用做消息隊列、數據堆棧和數據緩存等;
>Memcached適合于緩存SQL語句、數據集、用戶臨時性數據、延遲查詢數據和session等。
備選答案:
> **主從模式**
Redis支持主從模式的應用
> **value大小**
> Redis單個value的最大限制是1GB,而Memcached則只能保存1MB內的數據
> **性能方面**
> redis只能使用單核,而memcache可以使用多核,所以在比較上,平均每一個核上redis在儲存小數據時比memccache性能更高。而卻100K以上數據中,memcache性能要高于redis,雖然redis最近也在儲存大數據的性能上進行優化,但是比起memcached還是有點遜色。
> **開銷方面**
> 1.Memcached的內存管理不像Redis那么復雜,元數據metadata更小,相對來說額外開銷就很少。
> 2. Memcached唯一支持的數據類型是字符串string,非常適合緩存只讀數據,因為字符串不需要額外的處理。
>**使用底層模型不同**
> 它們之間底層實現方式 以及與客戶端之間通信的應用協議不一樣。
> Redis直接自己構建了VM 機制 ,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
### **為啥redis效率那么高?**
> * 純內存操作。
> * C 語言實現,一般來說,C 語言實現的程序“距離”操作系統更近,執行速度相對會更快。
> * 核心是基于非阻塞的 IO 多路復用機制。
> * 單線程反而避免了多線程的頻繁上下文切換問題,預防了多線程可能產生的競爭問題。
### **redis的垃圾回收?**
> 定期刪除+惰性刪除+內存淘汰機制
> 定期刪除:隔100ms`隨機`抽取設置了過期時間的key,并對其進行檢查,如果已經過期則刪除
> 惰性刪除:每次獲取key時會對key進行判斷是否還存活,如果已經過期了則刪除。
> Redis配置文件中可以設置maxmemory,內存的最大使用量,到達限度時會執行`內存淘汰機制`
> 內存淘汰機制:
> volatile-lru 從已設置過期時間的數據集中挑選最近最少使用的數據淘汰
volatile-lfu 從已設置過期時間的數據集中挑選最不經常使用的數據淘汰
volatile-ttl 從已設置過期時間的數據集中挑選將要過期的數據淘汰
volatile-random 從已設置過期時間的數據集中挑選任意數據淘汰
allkeys-lru 當內存不足寫入新數據時淘汰最近最少使用的Key
allkeys-random 當內存不足寫入新數據時隨機選擇key淘汰
allkeys-lfu 當內存不足寫入新數據時移除最不經常使用的Key
no-eviction(默認)當內存不足寫入新數據時,寫入操作會報錯,同時不刪除數據
# **kafka**
*****
### **常見配置?**
[https://blog.csdn.net/m0\_37989911/article/details/103667412](https://blog.csdn.net/m0_37989911/article/details/103667412)
*log.dirs*:Kafka把所有的消息都保存在磁盤上,存放這些數據的目錄通過log.dirs指定。
*num.partitions*:
每個新建主題的分區個數。這個參數一般要評估,比如,每秒鐘要寫入和讀取1GB數據,如果現在每個消費者每秒鐘可以處理50MB的數據,那么需要20個分區,這樣就可以讓20個消費者同時讀取這些分區,從而達到設計目標。
### **Kafka 存儲在硬盤上的消息格式是什么**?
> 消息由一個固定長度的頭部和可變長度的字節數組組成。頭部包含了一個版本號和 CRC32
> 校驗碼。
> ?消息長度: 4 bytes (value: 1+4+n)
> ?版本號: 1 byte
> ?CRC 校驗碼: 4 bytes
> ?具體的消息: n bytes
### **Kafka 判斷一個節點是否還活著有那兩個條件***?
(1)節點必須可以維護和 ZooKeeper 的連接,Zookeeper 通過心跳機制檢查每個節點的連接
(2)如果節點是個 follower,他必須能及時的同步 leader 的寫操作,延時不能太久
### **ZooKeeper 的作用***?
> zookeeper 是一個分布式的協調組件,早期版本的kafka用zk做meta信息存儲,consumer的消費狀態,group的管理以及 offset的值。考慮到zk本身的一些因素以及整個架構較大概率存在單點問題,新版本中逐漸弱化了zookeeper的作用。新的consumer使用了kafka內部的group coordination協議,也減少了對zookeeper的依賴,
> 但是broker依然依賴于ZK,zookeeper 在kafka中還用來選舉controller 和 檢測broker是否存活等等。
### **數據傳輸的事物定義有哪三種***?
> 最多一次: 消息不會被重復發送,最多被傳輸一次,但也有可能一次不傳輸
> (2)最少一次: 消息不會被漏發送,最少被傳輸一次,但也有可能被重復傳輸.
> (3)精確的一次(Exactly once): 不會漏傳輸也不會重復傳輸,每個消息都傳輸被一次而
> 且僅僅被傳輸一次,這是大家所期望的
### ****Kafka 的設計時什么樣的呢*****?
> Kafka 將消息以 topic 為單位進行歸納
> 將向 Kafka topic 發布消息的程序成為 producers.
> 將預 topics 并消費消息的程序成為 consumer.
> Kafka 以集群的方式運行,可以由一個或多個服務組成,每個服務叫做一個 broker.
> producers 通過網絡將消息發送到 Kafka 集群,集群向消費者提供消息
### **Kafka中是怎么體現消息順序性的**
> kafka每個partition中的消息在寫入時都是有序的,消費時,每個partition只能被每一個group中的一個消費者消費,保證了消費時也是有序的。
> 整個topic不保證有序。如果為了保證topic整個有序,那么將partition調整為1.
# **操作系統和網絡**
*****
### **從用戶輸入地址到解析到頁面過程?**
> 1. 用戶在瀏覽器中輸入地址;
> 2. 解析ip地址; 先看本地hosts有沒有記錄,有直接返回沒有則通過DNS獲取域名對應的ip地址
> 3. 將http請求發送到nginx服務器(建立tcp鏈接)
> 4. nginx根據訪問的url和后綴判斷請求是否是靜態資源,如是直接返回,如果是動態內容
> 5. nginx會將請求分發給fastcgi,fastcgi 會通過fastcgi_pass將請求發送給php-fpm,php-fpm接受到請求后會啟動worker進程處理請求,處理完進程后會將結果返回給nginx
> 6. nginx再通過http返回給瀏覽器
fastcgi(快速通用網關接口)
fastcgi_pass(127.0.0.1:9000)
php-fpm(進程管理器 是 FastCGI 的實現,并提供了進程管理)
### **git常用命令?**
> **提交**
> git init
> git add
> git commit -m
> git push
> **合并分支**
>git branch 新建分支
git checkout 切換分支
git merge 合并分支
git branch -d 刪除分支
**撤銷**
git revert HEAD 撤銷前一次commit
git reset --hard 撤銷所有本地修改
git reset --hard HEAD^撤銷所有本地到上一次修改
git reset --soft HEAD 撤銷上一次commit,將commit的文件撤回暫存區
> 要是想撤銷到上上次,就是HEAD^^ ,以此類推。
> git revert 是撤銷某次操作,此次操作之前的commit都會被保留
> git reset 是撤銷某次提交,但是此次之后的修改都會被退回到暫存區
### **nginx和apache的區別?**
# **數據結構和算法**
*****
### **常見的數據結構?**
數組,棧,鏈表,隊列,樹,圖,堆,散列表
> **數組**
> 可以再內存中連續存儲多個元素的結構,在內存中的分配也是連續的
> 棧(先進后出)
> 隊列(先進先出),
> 鏈表
> 一個是存儲元素的數據域 (內存空間),另一個是指向下一個結點地址的指針域
> 樹
> 由n個有限節點組成一個具有層次關系的集合
**圖**
由結點的有窮集合V和邊的集合E組成 有向圖和有向圖
**堆**
看做一棵樹的數組對象
堆中某個節點的值總是不大于或不小于其父節點的值;
堆總是一棵完全二叉樹。
**散列表**
是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構
# **系統設計和架構**
*****
### **負載均衡是什么?常見算法?**
> 部署多臺服務器,將用戶的請求分發到不同的服務器用來提高網站、應用、數據庫或其他服務的性能以及可靠性
> **輪詢**:為第一個請求選擇健康池中的第一個后端服務器,然后按順序往后依次選擇,直到最后一個,然后循環。
> **最小連接**:優先選擇連接數最少,也就是壓力最小的后端服務器,在會話較長的情況下可以考慮采取這種方式。
> **散列**:根據請求源的 IP 的散列(hash)來選擇要轉發的服務器。這種方式可以一定程度上保證特定用戶能連接到相同的服務器。如果你的應用需要處理狀態而要求用戶能連接到和之前相同的服務器,可以考慮采取這種方式。
### **如果讓你實現一個秒殺系統,或者搶票系統,你想怎么做(論述方案就行)?你會哪些關鍵的點?怎么處理?**

# **linux**
*****
### **linux常用命令?**
```
文件管理
1.chmod 修改權限 chomd 777 file.txt
2.chown 修改所屬者 chown root file.txt
壓縮管理
3.tar 壓縮:tar -cvf 包名.tar.gz 源文件 解壓:tar -zxf 包名
4.unzip 解壓:unzip 包名
進程管理
5.crontab -e ***** 分時曰月周 * 都 1-3 1點到3點 1,3 1,3點 /4 每隔4分鐘
6.ps 查看當前運行進程 (ps aux)
7.top 查看資源利用
8.kill kill -9 進程號
網絡管理
9.curl curl 鏈接 例: http://www.linux.com >> linux.html
10.netstat 顯示各種網絡相關信息 netstat -antp
11.wget 下載資源 wget 鏈接
12. sed 替換
```
- 簡介
- html
- js
- 正則表達式
- php
- 開發環境和配置
- PHP基礎
- 變量
- 數據類型
- 函數
- 常量
- 運算符
- 流程控制
- 文件
- 異常處理
- 高級
- 會話控制
- 面向對象
- 框架
- laravel
- ThinkPhp
- Yii 易
- Yaf 亞夫
- Swooole
- python
- 數據庫
- 基礎
- 索引
- 倒排索引
- 關聯sql
- 事務
- 鎖
- 優化
- 安全性
- 數據庫類型
- linux
- 基礎命令
- shell腳本
- 操作系統和網絡
- 版本控制器
- git
- git 命令行
- 小烏龜git的使用
- git 基礎命令
- svn
- svn 命令行
- 小烏龜svn的使用
- 網絡
- OSI七層模型
- 網絡協議
- https協議
- TCP UTP協議
- 數據結構和算法
- 算法
- 時間復雜度
- 空間復雜度
- 排序算法
- 查找算法
- 數據結構
- 系統設計和架構
- 緩存系統
- redis
- lua
- memcached
- redis與memcached的區別
- 消息隊列
- kafka
- 設計模式
- 單例模式
- 高并發和大流量設計
- 流量優化
- 前端優化
- web防盜鏈
- CDN加速
- 獨立的圖片服務器
- 服務器端
- 動態語言靜態化
- 并發處理
- 數據庫優化
- web服務器負載均衡
- 面試
- 項目整理
- novonordisk.micego.com
- nnm.micego.com
- www.dawang.tv
- lottery.3lotto.cn
- www.gpquan.cn
- in-tao.com
- 簡歷
- 面試問題
- 知識點
- 真題