一、http和https區別php
二、MySQL隔離級別html
三、linux基礎命令java
四、PHP魔術方法mysql
五、php7新特性linux
六、MySQL分區分表nginx
七、MySQL索引原理及查詢優化面試
八、nginx實現負載均衡redis
九、nginx實現反向代理算法
十、反射與映射sql
十一、redis
十二、進程與線程
1三、進程調度
1四、MySQL經常使用數據類型
1五、三次握手和四次揮手
1六、PHP實現原理
1七、設計一個排名榜的設計方案
1八、abcde求子集,必需要包含所有字母,不能有重複
1九、階乘算法
20、12345求子集
2一、編寫shell腳本,讀取 ./path 目錄下全部 .data文件
2二、二叉樹的層級查找
2三、B樹和B+樹
答案:
二、MySQL事物及隔離級別:
事物的基本要素:
①原子性(Atomicity):事務開始後全部操做,要麼所有作完,要麼所有不作,不可能停滯在中間環節。事務執行過程當中出錯,會回滾到事務開始前的狀態,全部的操做就像沒有發生同樣。也就是說事務是一個不可分割的總體,就像化學中學過的原子,是物質構成的基本單位。
②一致性(Consistency):事務開始前和結束後,數據庫的完整性約束沒有被破壞 。好比A向B轉帳,不可能A扣了錢,B卻沒收到。
③隔離性(Isolation):同一時間,只容許一個事務請求同一數據,不一樣的事務之間彼此沒有任何干擾。好比A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉帳。
⑤持久性(Durability):事務完成後,事務對數據庫的全部更新將被保存到數據庫,不能回滾。
隔離級別:
①髒讀(未提交讀):事務A讀取了事務B更新的數據,而後B回滾操做,那麼A讀取到的數據是髒數據
②提交讀(不可重複讀):事務 A 屢次讀取同一數據,事務 B 在事務A屢次讀取的過程當中,對數據做了更新並提交,致使事務A屢次讀取同一數據時,結果 不一致。
③幻讀(可重複讀):系統管理員A將數據庫中全部學生的成績從具體分數改成ABCDE等級,可是系統管理員B就在這個時候插入了一條具體分數的記錄,當系統管理員A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺同樣,這就叫幻讀。
④可串行化:是最高的隔離級別。它經過強制事物串行執行,避免了前面說的幻讀問題。簡單來講,serializable會在讀取的每一行數據上都加鎖,因此可能致使大量的超市和鎖爭用的問題。實際應用中也不多用到這個隔離級別,只有在很是須要確保數據的一致性並且能夠接受沒有併發的狀況下,才考慮採用該級別。
三、linux基礎命令
四、PHP魔術方法:
__construct(),類的構造函數
__destruct(),類的析構函數
__call(),在對象中調用一個不可訪問方法時調用
__callStatic(),用靜態方式中調用一個不可訪問方法時調用
__get(),得到一個類的成員變量時調用
__set(),設置一個類的成員變量時調用
__isset(),當對不可訪問屬性調用isset()或empty()時調用
__unset(),當對不可訪問屬性調用unset()時被調用。
__sleep(),執行serialize()時,先會調用這個函數
__wakeup(),執行unserialize()時,先會調用這個函數
__toString(),類被當成字符串時的迴應方法
__invoke(),調用函數的方式調用一個對象時的迴應方法
__set_state(),調用var_export()導出類時,此靜態方法會被調用。
__clone(),當對象複製完成時調用
__autoload(),嘗試加載未定義的類
__debugInfo(),打印所需調試信息
實例:參見詳情
六、MySQL分區分表:mysql分表分庫策略;
七、MySQL索引原理及查詢優化:MySQL查詢優化
8:nginx實現負載均衡:負載均衡算法;nginx實現負載均衡與緩存;nginx負載均衡與反向代理;
9:nginx實現反向代理:使用nginx實現反向代理
10:反射與映射:Java反射和映射
11:redis:redis面試;redis和memcache
1三、進程調度:
①先來先服務
②短做業優先
③高優先權優先調度算法
④高響應比優先調度算法
⑤基於時間片的輪轉
⑥多級反饋隊列調度算法
14:MySQL經常使用數據類型
①整數
②【定數】小數:decimal(dec)精確小數類型---精確數的存儲
③浮點數:float/double單精度、雙精度浮點類型········
④字符串:
char(n):固定長度,最多255個字符
varchar(n):固定長度,最多65535個字符
tinytext:可變長度,最多255個字符
text:可變長度,最多65535個字符
mediumtext:可變長度,最多2的24次方-1個字符
longtext:可變長度,最多2的32次方-1個字符
⑤日期時間時區:
date:日期 '2008-12-02'
time:時間 '12:25:36'
datetime:日期時間 '2008-12-12 22:06:44'
timestamp:自動存儲記錄修改時間(若是數據庫裏面有timestamp數據類型,就應該考慮時區問題)
15:三次握手和四次揮手:TCP/IP協議
1六、PHP實現原理
17:設計一個排名榜的設計方案
18:abcde求子集,必需要包含所有字母,不能有重複
function func2($arr, $str){ // $str 爲保存由 i 組成的一個排列狀況 $cnt = count($arr); if($cnt == 1){ echo $str . $arr[0] . "\n<br>"; } else { for ($i = 0; $i < count($arr); $i++) { $tmp = $arr[0]; $arr[0] = $arr[$i]; $arr[$i] = $tmp; func2(array_slice($arr, 1), $str . $arr[0]); } } } $a = array('1', '2', '3', '4'); func2($a, '');
19:階乘算法
方案一之遞歸: private static long RecursiveFac(long n){ if (n == 0){ return 1; }else{ return n * RecursiveFac(n - 1); } } 方案二之遞推: private static long Fac(long n){ var result = 1; for (var i = 1; i <= n; i++){ result = result * i; } return result; } 方案三之尾遞歸: private static int TailRecursiveFac(int n, int accumulator){ if (n == 0){ return accumulator; } return Fac(n - 1, n * accumulator); } 方案四之消除尾遞歸: private static int Fac(int n, int accumulator){ while (true){ var tempN = n; var tempAccumulator = accumulator; if (tempN == 0){ return tempAccumulator; } n = tempN - 1; accumulator = tempN * tempAccumulator; } }
20:12345求子集
public static List<List<Integer>> rank(int[] nums){ List<Integer>source = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { source.add(nums[i]); } List<List<Integer>> res = new ArrayList<>(); for (int i = 0; i < source.size(); i++) { List<Integer> tem = new ArrayList<>(); tem.add(source.get(i)); if (res.size()>0){ List<List<Integer>> in = new ArrayList<>(); for (List<Integer> re : res) { List<Integer> temp = new ArrayList<>(tem); temp.addAll(re); in.add(temp); } res.addAll(in); } res.add(tem); } res.add(new ArrayList<>()); return res; }
2一、編寫shell腳本,讀取 ./path 目錄下全部 .data文件
2二、二叉樹的層級查找
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public static void LaywerTraversal(TreeNode root){ if(root==null) { return; } LinkedList<TreeNode> list = new LinkedList<TreeNode>(); list.add(root); TreeNode currentNode; while(!list.isEmpty()){ currentNode=list.poll(); System.out.println(currentNode.val); if(currentNode.left!=null){ list.add(currentNode.left); } if(currentNode.right!=null){ list.add(currentNode.right); } } }
2三、B樹即二叉樹:
爲何B樹能夠優化查詢:爲何B類樹能夠進行優化呢?咱們能夠根據B類樹的特色,構造一個多階的B類樹,而後在儘可能多的在結點上存儲相關的信息,保證層數儘可能的少,以便後面咱們能夠更快的找到信息,磁盤的I/O操做也少一些,並且B類樹是平衡樹,每一個結點到葉子結點的高度都是相同,這也保證了每一個查詢是穩定的。
這裏的B樹,也就是英文中的B-Tree,一個 m 階的B樹知足如下條件:
B樹上大部分的操做所須要的磁盤存取次數和B樹的高度是成正比的,在B樹中能夠檢查多個子結點,因爲在一棵樹中檢查任意一個結點都須要一次磁盤訪問,因此B樹避免了大量的磁盤訪問。
爲何須要B+樹:因爲B+樹的數據都存儲在葉子結點中,分支結點均爲索引,方便掃庫,只須要掃一遍葉子結點便可,可是B樹由於其分支結點一樣存儲着數據,咱們要找到具體的數據,須要進行一次中序遍歷按序來掃,因此B+樹更加適合在區間查詢的狀況,因此一般B+樹用於數據庫索引,而B樹則經常使用於文件索引。
以一個m階樹爲例:
B樹和B+樹的區別:
這都是因爲B+樹和B具備這不一樣的存儲結構所形成的區別,以一個m階樹爲例。
擴展:
獲取樹的深度:
class Bitree { int data; Bitree left; Bitree right; } private static int BitreeDepth(Bitree p) { int rd,ld; if(p == null){ return 0; }else{ ld=BitreeDepth(p.left); rd=BitreeDepth(p.right); if(ld>rd){ return ld+1; }else { return rd+1; } } }
求e在二叉樹P中的層次。若是不存在返回值爲0;不然返回值爲層次
class Bitree { int data; Bitree left; Bitree right; } private static int BitreeLevel(Bitree P,char e) { int ld=0; int rd=0; if(P == null){ return 0; }else if(e==P.data){ return 1; }else if(e!=P.data) { ld=BitreeLevel(P.left,e); rd=BitreeLevel(P.right,e); if(ld>0){ return ld+1; }else if(rd>0){ return rd+1; }else { return 0; } } return ld>rd?ld:rd; }