成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php面試總結(jié)

greatwhole / 2320人閱讀

摘要:由一層函數(shù)調(diào)用進(jìn)入下一層函數(shù)調(diào)用的遞推。此時,中的一個稱為孤兒的類就會收留這個對象。禁止訪問服務(wù)器拒絕請求服務(wù)器找不到請求的頁面服務(wù)器內(nèi)部錯誤壞的網(wǎng)關(guān)一般是網(wǎng)關(guān)服務(wù)器請求后端服務(wù)時,后端服務(wù)沒有按照協(xié)議正確返回結(jié)果。

持續(xù)更新。。。。

php 1. 簡述 php 中的 autoload
Autoload 的加載機(jī)制,當(dāng)通過 new 來實(shí)例化一個類時,PHP 會通過定義的 autoload 函數(shù)加載相應(yīng)的文件,如果這個類文件使用了 extends 或者 implements 需要用到其他的類文件,php 會重新運(yùn)行 autoload 去進(jìn)行類文件的查找和加載,如果發(fā)生了兩次對同一類文件的請求,就會報錯。
2. 靜態(tài)變量及有什么優(yōu)缺點(diǎn)?
靜態(tài)局部變量的特點(diǎn):    
1.不會隨著函數(shù)的調(diào)用和退出而發(fā)生變化。
2.靜態(tài)局部變量只會初始化一次。
3.靜態(tài)屬性只能被初始化為一個字符值或一個常量,不能使用表達(dá)式。
4.當(dāng)多次調(diào)用一個函數(shù)且要求在調(diào)用之間保留某些變量的值時,可考慮采用靜態(tài)局部變量。
3. strtrstr_replace 有什么區(qū)別,兩者分別用在什么場景下?

str_replace() 以其他字符替換字符串中的一些字符(區(qū)分大小寫)

strtr() 轉(zhuǎn)換字符串中特定的字符。

5.6版本 str_replace  比 strtr 效率高10+倍,  7.0 版本效率基本相同, 但 5.6 的 str_replace  竟比 7.0 高 3倍
4. 魔術(shù)方法

__construct():類的默認(rèn)構(gòu)造方法,如果 __construct() 和與類同名的方法共同出現(xiàn)時,默認(rèn)調(diào)用__construct()而不是同類名方法。

__call():當(dāng)調(diào)用不存在或者不可訪問的方法時,會調(diào)用 __call ( $name, $arguments )方法。

__toString():當(dāng)打印對象時會被直接調(diào)用。

__clone():當(dāng)對象被拷貝時直接調(diào)用。

__isset():對不存在或者不可訪問的屬性使用 isset() 或者 empty() 時,__isset() 會被調(diào)用;

__destruct():類的析構(gòu)函數(shù),當(dāng)該對象的所有引用都被刪除,或者對象被顯式銷毀時執(zhí)行。

__sleep()執(zhí)行 serialize() 函數(shù)時會調(diào)用

5. 如下所示,會輸出什么結(jié)果?
foreach ($array as $key => $item) {
            $array[$key + 1] = $item + 2;
            echo "$item";
        }
        print_r($array);

結(jié)果示例: $array = [3,6,7,8];

3678 //echo 輸出數(shù)組內(nèi)元素的值
Array
(
    [0] => 3  //$key 保持不變
    [1] => 5 //每次的$eky + 1,對應(yīng)的值加2,
    [2] => 8
    [3] => 9
    [4] => 10
)
6. 遞歸的次數(shù)限制
遞歸是一種函數(shù)調(diào)用自身(直接或間接)的一種機(jī)制,這種強(qiáng)大的思想可以把某些復(fù)雜的概念變得極為簡單。邏輯上的遞歸可以無次數(shù)限制, 但語言執(zhí)行器或者程序堆棧會限制遞歸的次數(shù).
php 手冊注解:但是要避免遞歸函數(shù)/方法調(diào)用超過 100-200 層,因?yàn)榭赡軙苟褩1罎亩巩?dāng)前腳本終止。 無限遞歸可視為編程錯誤。

遞歸的兩個基本條件

遞歸的退出條件,這是遞歸能夠正常執(zhí)行的必要條件,也是保證遞歸能夠正確返回的必要條件。缺乏這個條件,遞歸就會無限進(jìn)行,直到系統(tǒng)給予的資源耗盡。如果碰到“max nest level of 100 reached”(php 中,超出遞歸限制)是沒有正確的退出條件,導(dǎo)致了遞歸深度過大或者無限遞歸。

遞推過程。由一層函數(shù)調(diào)用進(jìn)入下一層函數(shù)調(diào)用的遞推。

7. 單引號和雙引號的區(qū)別

雙引號內(nèi)部變量會解析,單引號則不解析.

雙引號中特殊字符( 之類)會被轉(zhuǎn)義,單引號中的內(nèi)容不會被轉(zhuǎn)義。

執(zhí)行效率:單引號串中的內(nèi)容總被認(rèn)為是普通字符,因此單引號中的內(nèi)容不會被轉(zhuǎn)義從而效率更高。

8. array 數(shù)組排序并去重;

如:$arr = [10,4,6,4,19,3,5];

1、 array_multisort可以用來一次對多個數(shù)組進(jìn)行排序,或者根據(jù)某一維或多維對多維數(shù)組進(jìn)行排序。

2、思路:想到的是排序算法(如冒泡) + 去重函數(shù) array_unique

代碼:

function bubbleSort(array $arr){
        $count = count($arr); //數(shù)組長度
        for($i = 1;$i < $count;$i++){
            for ($k = 0;$k < $count - $i;$k++){
                if ($arr[$k] > $arr[$k+1]){
                    $temp = $arr[$k];
                    $arr[$k] = $arr[$k+1];
                    $arr[$k+1] = $temp;
                }
            }
        }
        return array_unique($arr);
        
    }
    
 bubbleSort($arr);
9. 面向?qū)ο笫鞘裁矗?/b>
是一種程序設(shè)計范型,同時也是一種程序開發(fā)方法。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和可擴(kuò)展性。
10. 類和對象的區(qū)別及關(guān)系

類是定義一系列屬性和操作的模板,而對象則把屬性進(jìn)行具體化,然后交給類處理。

對象就是數(shù)據(jù),對象本身不包含方法。但是對象有一個“指針”指向一個類,這個類里可以有方法。

類和對象是不可分割的,有對象就必定有一個類和其對應(yīng),否則這個對象也就成了沒有親人的孩子(有一個特殊情況存在,就是由標(biāo)量進(jìn)行強(qiáng)制類型轉(zhuǎn)換的 object,沒有一個類和它對象。此時,PHP 中的一個稱為“孤兒”的 stdClass 類就會收留這個對象)。

11、for 和 foreach 的區(qū)別

1、foreach 也叫增強(qiáng) for 循環(huán),foreach 其實(shí)是 for 循環(huán)的一個特殊簡化版。
2、foreach 適用于只進(jìn)行集合或數(shù)組遍歷, for 則在較復(fù)雜的循環(huán)中效率更高。
3、foreach 不能對數(shù)組或集合進(jìn)行修改(添加刪除操作),如果想要修改就要用 for 循環(huán)。
所以相比較下來 for 循環(huán)更為靈活。

12、語句 include 和 require 的區(qū)別是什么?

include 和 require 都是引入指定的文件。加上 _once 表示只引入一次,已經(jīng)引入過的不再引入。

include 在引入不存文件時產(chǎn)生一個警告且腳本還會繼續(xù)執(zhí)行,require 則會導(dǎo)致一個致命性錯誤且腳本停止執(zhí)行。

include 有返回值,而 require 沒有。

兩者的使用不同:

require 這個函數(shù)通常放在 PHP 程序的最前面,PHP 程序在執(zhí)行前,就會先讀入 require 所指定引入的文件,使它變成 PHP 程序網(wǎng)頁的一部份。常用的函數(shù),亦可以這個方法將它引入網(wǎng)頁中。

include 這個函數(shù)一般是放在流程控制的處理部分中。PHP 程序網(wǎng)頁在讀到 include 的文件時,才將它讀進(jìn)來。這種方式,可以把程序執(zhí)行時的流程簡單化。

13、isset()、empty()、is_null() 的區(qū)別?

當(dāng)變量未定義時,is_null() 是不允許作為參數(shù)判斷的,會報 Notice 警告錯誤;

empty ,isset 首先都會檢查變量是否存在,然后對變量值進(jìn)行檢測。而 is_null 只是直接檢查變量值是否為 null,因此如果變量未定義就會出現(xiàn)錯誤!

isset():僅當(dāng) null 和未定義,返回 false;

empty():""、0、"0"、NULL、FALSE、array(),未定義,均返回 false ;

is_null():僅判斷是否為 null,未定義報警告;

變量本身作為參數(shù),與 empty() 一致,但接受未定義變量時,報警告;

""、0、"0"、NULL、FALSE、array() 這幾個中,empty() 和“變量本身作為參數(shù)”結(jié)果一致,均作為“空”來處理,而 isset() 和 is_null() 僅當(dāng)是 null 時,才作為“空”來處理(注意 false 并不會被認(rèn)為是空)

14、常用的 php 數(shù)組函數(shù)及其作用

array_values($arr):獲得數(shù)組的值
array_keys($arr):獲得數(shù)組的鍵名
array_flip($arr):數(shù)組中的值與鍵名互換(如果有重復(fù)前面的會被后面的覆蓋)
in_array("apple",$arr): 在數(shù)組中檢索apple
array_search("apple",$arr): 在數(shù)組中檢索apple ,如果存在返回鍵名
array_push($arr,"apple","pear"):將一個或多個元素壓入數(shù)組棧的末尾(入棧),返回入棧元素的個數(shù)
array_pop($arr):將數(shù)組棧的最后一個元素彈出(出棧)
array_shift($arr):數(shù)組中的第一個元素移出并作為結(jié)果返回(數(shù)組長度減1,其他元素向前移動一位,數(shù)字鍵名改為從零技術(shù),文字鍵名不變)
array_unshift($arr,"a",array(1,2)):在數(shù)組的開頭插入一個或多個元素

15、php 打印前一天的日期,(格式:2015-01-01 11:11:00)
 echo date("Y-m-d H:i:s",strtotime("-1 day",time()));
16、php 中 error_reporting 函數(shù)的作用

error_reporting() 設(shè)置 PHP 的報錯級別并返回當(dāng)前級別。

17、寫一個函數(shù)、盡可能高效的從一個標(biāo)準(zhǔn) url 中取出文件的擴(kuò)展名,如 http://www.abcs.com/abc/de/fg... 中的 php 和 .php
function getExt2($url)
{
   $urlinfo = pathinfo($url);

  if(isset($urlinfo["extension"]))
  {
    if(strpos($urlinfo["extension"],"?") !== false)
      return explode("?",$urlinfo["extension"])[0];
    else
      return $urlinfo["extension"];
  }
  return "no extension";
}
18、實(shí)現(xiàn)一個字符串反轉(zhuǎn)函數(shù)
public function strrev($str)
{
    $newstr = "";
    $len = strlen($str); //獲取字符串長度
    
    for($i = $len; $i >= 0; $i--)
    {
        $newstr .= $str{$i}; //從最大下標(biāo)拼接至最小即是反轉(zhuǎn)了
    }
    return $newst;
}
19、寫出常用的 http 狀態(tài)碼及其作用
Name Academy score
200 OK 請求成功,服務(wù)器成功返回網(wǎng)頁
301 Moved Permanently 永久跳轉(zhuǎn),請求的網(wǎng)頁已永久跳轉(zhuǎn)到新位置。
403 Forbidden 禁止訪問,服務(wù)器拒絕請求
404 Not Found 服務(wù)器找不到請求的頁面
500 Internal Server Error 服務(wù)器內(nèi)部錯誤
502 Bad Gateway 壞的網(wǎng)關(guān),一般是網(wǎng)關(guān)服務(wù)器請求后端服務(wù)時,后端服務(wù)沒有按照 http 協(xié)議正確返回結(jié)果。
503 Service Unavailable 服務(wù)當(dāng)前不可用,可能因?yàn)槌d或停機(jī)維護(hù)。
504 Gateway Timeout 網(wǎng)關(guān)超時,一般是網(wǎng)關(guān)服務(wù)器請求后端服務(wù)時,后端服務(wù)沒有在特定的時間內(nèi)完成服務(wù)。
20、寫一個驗(yàn)證電子郵箱格式是否正確的函數(shù)
   function check_email($email){

        $preg = "/^w+([-_.]w+)*@w+([-_.]w+)*(.w+){0,3}$/i";
        
        preg_match($preg,$email,$res);
        
        return $res;//匹配成功返回1,匹配失敗返回0
    }
21、mvc 的理解

MVC 是模型( model ) -視圖( view )-控制器( controller )的縮寫,一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面,在改進(jìn)和個性化定制界面及用戶交互的同時,不需要重新編寫業(yè)務(wù)邏輯。

22、 post 和 patch 的區(qū)別 23、php內(nèi)存回收機(jī)制

php的內(nèi)存管理機(jī)制是:預(yù)先給出一塊空間,用來存儲變量,當(dāng)空間不夠時,再申請一塊新的空間。

1.存儲變量名,存在符號表。

2.變量值存儲在內(nèi)存空間。

3.在刪除變量的時候,會將變量值存儲的空間釋放,而變量名所在的符號表不會減小。

雖然刪除后內(nèi)存變小了,但還是比沒定義變量之前時大,這是因?yàn)殡m然刪除了變量的值,但變量名沒有被刪除。

php垃圾回收機(jī)制

PHP 變量存儲是存儲在一個 zval 容器里面的

1.類型 2.值 3. is_ref 代表是否有地址引用 4.refcount 指向該值的變量數(shù)量

垃圾回收:

1.在 5.2 版本或之前版本,PHP會根據(jù) refcount 值來判斷是不是垃圾。如果 refcount 值為 0,PHP 會當(dāng)做垃圾釋放掉。這種回收機(jī)制有缺陷,對于環(huán)狀引用的變量無法回收

2.在 5.3 之后版本改進(jìn)了垃圾回收機(jī)制。如果發(fā)現(xiàn)一個zval容器中的refcount在增加,說明不是垃圾。如果發(fā)現(xiàn)一個zval容器中的refcount在減少,如果減到了 0,直接當(dāng)做垃圾回收。如果發(fā)現(xiàn)一個 zval 容器中的 refcount 在減少,并沒有減到 0,PHP 會把該值放到緩沖區(qū),當(dāng)做有可能是垃圾的懷疑對象。當(dāng)緩沖區(qū)達(dá)到了臨界值,PHP 會自動調(diào)用一個方法去遍歷每一個值,如果發(fā)現(xiàn)是垃圾就清理

24、
laravel 1. laravel 和其他框架對比的優(yōu)缺點(diǎn)

laravel

優(yōu)點(diǎn): 使用人數(shù)全球第一,文檔齊全,框架結(jié)構(gòu)組織清晰,大量第三方擴(kuò)展包供引用,適合大型網(wǎng)站協(xié)同開發(fā),提供的 artisan 開發(fā)工具開發(fā)效率高。composer 擴(kuò)展自動加載,中間件

缺點(diǎn):稍復(fù)雜,上手比一般框架要慢;大量引用第三方包,但某些場景下我們只使用類中的部分方法,代碼顯得有些冗余

ThinkPHP

優(yōu)點(diǎn):輕量級 PHP 開發(fā)框架,易于上手,有豐富的中文文檔;框架的兼容性較強(qiáng),PHP4和PHP5完全兼容;適合中小項(xiàng)目的開發(fā),學(xué)習(xí)成本低,社區(qū)活躍度高

缺點(diǎn):對Ajax的支持不是很好;缺少面向?qū)ο蟮脑O(shè)計,5的版本基本面向?qū)ο?,框架社區(qū)相關(guān)的輔助工具少;目錄結(jié)構(gòu)混亂,需要花時間整理;

Yaf

優(yōu)點(diǎn):用C語言開發(fā)的PHP框架, 相比原生的PHP, 幾乎不會帶來額外的性能開銷.不需要編譯, 在PHP啟動的時候加載, 并常駐內(nèi)存.更快的執(zhí)行速度, 更少的內(nèi)存占用.

缺點(diǎn):C的擴(kuò)展,如果程序有漏洞,作者未及時更新,使用者在不懂C的情況下,只能看著網(wǎng)站受辱或者祈禱,或者關(guān)閉網(wǎng)站.

2、 laravel 依賴注入
依賴注入,實(shí)質(zhì)是通過構(gòu)造函數(shù)或者某些情況下通過 setter 方法將類依賴注入到類中。通俗的講就是一個類中要多次引入某個 model 的時候,可以在構(gòu)造函數(shù)中一次引入,類中的方法直接調(diào)用即可。
3、依賴注入的原理

依賴注入原理利用類方法反射,取得參數(shù)類型,然后利用容器構(gòu)造好實(shí)例。然后再使用回調(diào)函數(shù)調(diào)起。

注入對象構(gòu)造函數(shù)不能有參數(shù)。否則會報錯。Missing argument 1

依賴注入故然好,但它必須要由 Router 類調(diào)起,否則直接用 new 方式是無法實(shí)現(xiàn)注入的。所以這就為什么只有 Controller 、Job 類才能用這個特性了。

4、 Composer
Composer 是一款跨平臺的 PHP 依賴管理工具。讓 組件式編程 成為可能,編寫軟件時,就如拼接樂高玩具一樣。極大的提高了開發(fā)的效率和代碼的可復(fù)用性,解放了生產(chǎn)力。

Laravel 使用 Composer 來作為擴(kuò)展包的管理工具。

5. laravel 生命周期

Laravel 應(yīng)用的所有請求入口都是 public/index.php 文件。index.php 文件載入 Composer 生成的自動加載設(shè)置,然后從 bootstrap/app.php 腳本獲取 Laravel 應(yīng)用實(shí)例,Laravel 的第一個動作就是創(chuàng)建服務(wù)容器實(shí)例。

請求被發(fā)送到 HTTP 內(nèi)核或 Console 內(nèi)核(分別用于處理 Web 請求和 Artisan 命令),這取決于進(jìn)入應(yīng)用的請求類型。

內(nèi)核啟動過程中最重要的動作之一就是為應(yīng)用載入服務(wù)提供者,應(yīng)用的所有服務(wù)提供者都被配置在 config/app.php 配置文件的 providers 數(shù)組中。首先,所有提供者的 register 方法被調(diào)用,然后,所有提供者被注冊之后,boot 方法被調(diào)用。

一旦應(yīng)用被啟動并且所有的服務(wù)提供者被注冊,Request 將會被交給路由器進(jìn)行分發(fā),路由器將會分發(fā)請求到路由或控制器,同時運(yùn)行所有路由指定的中間件。

服務(wù)提供者是啟動 Laravel 應(yīng)用中最關(guān)鍵的部分,應(yīng)用實(shí)例被創(chuàng)建后,服務(wù)提供者被注冊,請求被交給啟動后的應(yīng)用進(jìn)行處理,整個過程就是這么簡單!

Mysql 1. Mysql 中,int(1) 和 int(10) 的區(qū)別

int(M) M 指示最大顯示寬度,在數(shù)據(jù)庫里面存儲的都是4個字節(jié)的長度。最大有效顯示寬度是255。該可選顯示寬度規(guī)定用于顯示寬度小于指定的列寬度的值時從左側(cè)填滿寬度。顯示寬度并不限制可以在列內(nèi)保存的值的范圍,也不限制超過列的指定寬度的值的顯示。

2.索引左原則:

like,匹配字符串時,不以通配符開頭,左側(cè)必須固定,該字段索引才會起作用

復(fù)合索引,左側(cè)的字段固定時,在索引匹配時,右側(cè)的索引才有效。因?yàn)閺?fù)合索引關(guān)鍵字排序,按照左邊字段進(jìn)行排序,如果左邊字段相同,才依據(jù)右邊字段。

3.索引創(chuàng)建的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):

創(chuàng)建索引可提高系統(tǒng)性能

通過唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性

加快檢索速度

加速表與表之間的連接

使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時,減少查詢中分組和排序的時間

通過使用索引,可以在查詢過程中,使用優(yōu)化隱藏器,提高系統(tǒng)性能

缺點(diǎn):

創(chuàng)建索引和維護(hù)索引要耗費(fèi)時間,隨數(shù)據(jù)量的增加而增加

索引占用物理空間

對表中的數(shù)據(jù)進(jìn)行增刪改的時候,索引需動態(tài)維護(hù),降低了數(shù)據(jù)的維護(hù)速度

4. 請描述一下 mysql 主從服務(wù)器之間是如何同步數(shù)據(jù)的,什么樣的 sql 會造成主從無法正確同步?

網(wǎng)絡(luò)的延遲

由于 mysql 主從復(fù)制是基于 binlog 的一種異步復(fù)制,通過網(wǎng)絡(luò)傳送 binlog 文件,理所當(dāng)然網(wǎng)絡(luò)延遲是主從不同步的絕大多數(shù)的原因,特別是跨機(jī)房的數(shù)據(jù)同步出現(xiàn)這種幾率非常的大,所以做讀寫分離,注意從業(yè)務(wù)層進(jìn)行前期設(shè)計。

主從兩臺機(jī)器的負(fù)載不一致

由于 mysql 主從復(fù)制是主數(shù)據(jù)庫上面啟動1個 io 線程,而從上面啟動1個 sql 線程和1個 io 線程,當(dāng)中任何一臺機(jī)器的負(fù)載很高,忙不過來,導(dǎo)致其中的任何一個線程出現(xiàn)資源不足,都將出現(xiàn)主從不一致的情況。

max_allowed_packet 設(shè)置不一致

主數(shù)據(jù)庫上面設(shè)置的 max_allowed_packet 比從數(shù)據(jù)庫大,當(dāng)一個大的 sql 語句,能在主數(shù)據(jù)庫上面執(zhí)行完畢,從數(shù)據(jù)庫上面設(shè)置過小,無法執(zhí)行,導(dǎo)致的主從不一致。

key 自增鍵開始的鍵值跟自增步長設(shè)置不一致引起的主從不一致。

mysql 異常宕機(jī)情況下,如果未設(shè)置 sync_binlog=1 或者 innodb_flush_log_at_trx_commit=1 很有可能出現(xiàn) binlog 或者 relaylog 文件出現(xiàn)損壞,導(dǎo)致主從不一致。

mysq l本身的 bug 引起的主從不同步。

版本不一致,特別是高版本是主,低版本為從的情況下,主數(shù)據(jù)庫上面支持的功能,從數(shù)據(jù)庫上面不支持該功能

5.有一個order表,如下,求購買次數(shù)最多的兩個用戶
order_id user_id goods
100000 100 蘋果
100001 100 蘋果
100002 101 橘子
100003 102 蘋果
100004 102 香蕉

sql

SELECT order_id,user_id,COUNT(order_id) AS count FROM order GROUP BY user_id ORDER BY  count DESC  limit 2
6.事務(wù)的特性

原子性(Atomicity)

原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾。

一致性(Consistency)

一致性是指事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。

隔離性(Isolation)

隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離

持久性(Durability)

持久性是指一個事務(wù)一旦被提交,對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的
7.事務(wù)的隔離級別和高并發(fā)

如果不考慮事務(wù)的隔離性,會發(fā)生的幾種問題:

臟讀 (dirty read) :指在一個事務(wù)處理過程里讀取了另一個未提交的事務(wù)中的數(shù)據(jù)。

不可重復(fù)讀 (unrepeated read):指在對于數(shù)據(jù)庫中的某個數(shù)據(jù),一個事務(wù)范圍內(nèi)多次查詢卻返回了不同的數(shù)據(jù)值,這是由于在查詢間隔,被另一個事務(wù)修改并提交了。

幻讀(phantom read):一個事務(wù)執(zhí)行兩次查詢,第二次查詢比第一次多出或少一些數(shù)據(jù),造成兩次結(jié)果不一致。只是另一個事務(wù)在這兩次查詢中間插入或者 刪除了數(shù)據(jù)造成的。

第一類丟失更新(lost update): 在完全未隔離事務(wù)的情況下,兩個事物更新同一條數(shù)據(jù)資源,某一事物異常終止,回滾造成第一個完成的更新也同時丟失 。

第二類丟失更新(second lost updates):是不可重復(fù)讀的特殊情況,如果兩個事務(wù)都讀取同一行,然后兩個都進(jìn)行寫操作,并提交,第一個事務(wù)所做的改變就會丟失。

四種事務(wù)隔離級別:

  1. Serializable 串行化
  2. Repeatable Read 可重復(fù)讀
  3. Read Commited 可讀已提交
  4. Read Uncommited 可讀未提交

并發(fā)控制:

數(shù)據(jù)庫系統(tǒng)采用不同的鎖類型來實(shí)現(xiàn)以上四種隔離級別,具體的實(shí)現(xiàn)過程對用戶是透明的。用戶關(guān)心的是如何選擇隔離級別。

對于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫系統(tǒng)的隔離級別設(shè)為 Read Committed,它能夠避免臟讀,而且具有較好的并發(fā)性能。

每個數(shù)據(jù)庫連接都有一個全局變量 @@tx_isolation ,表示當(dāng)前的事務(wù)隔離級別。JDBC 數(shù)據(jù)庫連接使用數(shù)據(jù)庫系統(tǒng)默認(rèn)的隔離級別。

在 Hibernate 的配置文件中可以顯示地設(shè)置隔離級別。每一種隔離級別對應(yīng)著一個正整數(shù)。

需要注意的是,在受管理環(huán)境中,如果 Hibernate 使用的數(shù)據(jù)庫連接來自于應(yīng)用服務(wù)器提供的數(shù)據(jù)源,Hibernate不會改變這些連接的事務(wù)隔離級別。在這種情況下,應(yīng)該通過修改應(yīng)用服務(wù)器的數(shù)據(jù)源配置來修改隔離級別。

當(dāng)數(shù)據(jù)庫系統(tǒng)采用 Red Committed 隔離級別時,會導(dǎo)致不可重復(fù)讀和第二類丟失更新的并發(fā)問題,在可能出現(xiàn)這種問題的場合。可以在應(yīng)用程序中采用悲觀鎖或樂觀鎖來避免這類問題。

mysql查看當(dāng)前事務(wù)隔離級別:select @@tx_isolation
設(shè)置事務(wù)隔離級別:set [glogal | session] transaction isolation level 隔離級別名稱;set tx_isolation=’隔離級別名稱;’
8. 悲觀鎖和樂觀鎖

悲觀鎖

  正如其名,它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。基于數(shù)據(jù)庫的鎖機(jī)制實(shí)現(xiàn)(也只有數(shù)據(jù)庫層提供的鎖機(jī)制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。
  在Hibernate使用悲觀鎖十分容易,但實(shí)際應(yīng)用中悲觀鎖是很少被使用的,因?yàn)樗看伟l(fā)送的SQL語句都會加上"for update"用于告訴數(shù)據(jù)庫鎖定相關(guān)數(shù)據(jù),大大限制了并發(fā)性,數(shù)據(jù)庫性能的大量開銷

樂觀鎖

  樂觀鎖,大多是基于數(shù)據(jù)版本( Version )記錄機(jī)制實(shí)現(xiàn)。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個版本標(biāo)識,在基于數(shù)據(jù)庫表的版本解決方案中,一般是通過為數(shù)據(jù)庫表增加一個 "version" 字段來實(shí)現(xiàn)。
  樂觀鎖的工作原理:讀取出數(shù)據(jù)時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù)據(jù)庫表對應(yīng)記錄的當(dāng)前版本信息進(jìn)行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號,則予以更新,否則認(rèn)為是過期數(shù)據(jù)。

9.復(fù)合索引
概念:用戶可以在多個列上建立索引,這種索引叫做復(fù)合索引(組合索引); 

復(fù)合索引在數(shù)據(jù)庫操作期間所需的開銷更小,可以代替多個單一索引;
窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過2列的索引;
設(shè)計索引的一個重要原則就是能用窄索引不用寬索引,因?yàn)檎饕冉M合索引更有效;

10. like 的優(yōu)化
like寫法一般為 select cat from animal where name like "%貓%" 
explain 解釋來看 sql 語句并沒有運(yùn)用索引(name 已經(jīng)創(chuàng)建索引),而是全表掃描。

盡量不要使用 like "%..%"

對于 like "..%.." (不以 % 開頭), 對于 like "%..." 的 (不以 % 結(jié)尾),加個 reverse 函數(shù),又可以用上索引了"(需要反向索引的支持)SQL> select * from test_like where reverse(object_name)like reverse("%AS");

使用locate函數(shù)代替like

語法一 LOCATE(substr,str)返回字符串substr中第一次出現(xiàn)子字符串的位置 str

語法二:LOCATE(substr,str,pos)返回 substrstr 中第一次出現(xiàn)的位置,如果 substrstr 中不存在,返回值為 0 。如果pos存在,返回 substrstrpos個位置后第一次出現(xiàn)的位置,如果 substrstr 中不存在,返回值為0。

mysql 優(yōu)化

sql 語句優(yōu)化

索引優(yōu)化

選擇合適的存儲引擎

字段選擇合適的數(shù)據(jù)類型

對表進(jìn)行水平或者垂直拆分

針對存儲引擎的優(yōu)化

磁盤 I/O 優(yōu)化

負(fù)載均衡

主從復(fù)制


Linux 1. 如何檢測 web 服務(wù)慢

top:查看系統(tǒng)性能

Nginx:最后一個字段加入$request_time

列出 php 頁面請求時間超過3秒的頁面,并統(tǒng)計其出現(xiàn)的次數(shù),顯示前100條
cat access.log|awk "($NF > 1 && $7~/.php/){print $7}"|sort -n|uniq -c|sort -nr|head -100

代碼中實(shí)現(xiàn),開頭寫入時間,結(jié)尾寫入時間

2. 自動腳本

crond 是 linux 下用來周期性的執(zhí)行某種任務(wù)或等待處理某些事件的一個守護(hù)進(jìn)程。

系統(tǒng)任務(wù)調(diào)度:系統(tǒng)周期性所要執(zhí)行的工作,比如寫緩存數(shù)據(jù)到硬盤、日志清理等。在/etc目錄下有一個 crontab 文件,這個就是系統(tǒng)任務(wù)調(diào)度的配置文件。

* 用戶任務(wù)調(diào)度:用戶定期要執(zhí)行的工作,比如用戶數(shù)據(jù)備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計劃任務(wù)。所有用戶定義的 crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。
語法:
minute hour day month week command
還可以使用以下特殊字符:

星號(*):代表所有可能的值,例如 month 字段如果是星號,則表示在滿足其它字段的制約條件后每月都執(zhí)行該命令操作。

逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”

中杠(-):可以用整數(shù)之間的中杠表示一個整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”

正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執(zhí)行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在 minute 字段,表示每十分鐘執(zhí)行一次。

3.Nginx負(fù)載均衡方案

常用的幾種方式:

輪詢 (Round Robin)

根據(jù)Nginx配置文件中的順序,每個請求按時間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器 down 掉,能自動剔除。
upstream web { 
    server server1; 
    server server2; 
  } 

最少連接

Web 請求會被轉(zhuǎn)發(fā)到連接數(shù)最少的服務(wù)器上。least_conn 算法很簡單,首選遍歷后端集群,比較每個后端的 conns/weight,選取該值最小的后端。如果有多個后端的 conns/weight 值同為最小的,那么對它們采用加權(quán)輪詢算法。
 upstream web { 
     least_conn; 
     server server1; 
     server server2; 
 } 

IP地址哈希

同一客戶端連續(xù)的 Web 請求可能會被分發(fā)到不同的后端服務(wù)器進(jìn)行處理,因此如果涉及到會話 Session,可以使用基于 IP 地址哈希的負(fù)載均衡方案。這樣的話,同一客戶端連續(xù)的 Web 請求都會被分發(fā)到同一服務(wù)器進(jìn)行處理(每個請求按訪問 ip 的 hash 結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決 session 的問題)。
upstream web { 
    ip_hash;
    server server1; 
    server server2; 
  } 

權(quán)重 (Weighted Load Balancing)

可以根據(jù)服務(wù)器的性能狀況有選擇的分發(fā) web 請求。指定輪詢幾率,weight 越高、訪問比率越大。weight=2,意味著每接收到3個請求,前2個請求會被分發(fā)到第一個服務(wù)器,第3個請求會分發(fā)到第二個服務(wù)器,其它的配置同輪詢配置。
upstream web { 
    server server1 weight=2; 
    server server2; 
  } 

基于權(quán)重的負(fù)載均衡和基于 IP 地址哈希的負(fù)載均衡可以組合在一起使用。

fair(第三方)

按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。

upstream web {
    server server1;
    server server2;
    fair;
}

url_hash(第三方)

按訪問 url 的 hash 結(jié)果來分配請求,使每個 url 定向到同一個后端服務(wù)器,后端服務(wù)器為緩存時比較有效。 hash_method 是使用的 hash 算法

upstream web {

server server1:3128;
server server1:3128;
hash $request_uri;
hash_method crc32;

}

每個設(shè)備的狀態(tài)設(shè)置為:
1.down 表示單前的 server 暫時不參與負(fù)載
2.weight 默認(rèn)為1.weight 越大,負(fù)載的權(quán)重就越大。
3.max_fails:允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時,返回 proxy_next_upstream 模塊定義的錯誤
4.fail_timeout:max_fails 次失敗后,暫停的時間。
5.backup: 其它所有的非 backup 機(jī)器 down 或者忙的時候,請求 backup 機(jī)器。所以這臺機(jī)器壓力會最輕。sorry server 提供非業(yè)務(wù)功能。
4. Keepalived
Keepalived是通過VRRP(虛擬路由器冗余協(xié)議)協(xié)議實(shí)現(xiàn)高可用功能的。VRRP 出現(xiàn)的目的就是為了解決靜態(tài)路由單點(diǎn)故障問題的,它能夠保證當(dāng)個別節(jié)點(diǎn)宕機(jī)時,整個網(wǎng)絡(luò)可以不間斷地運(yùn)行。
5.vi 和 vim 的區(qū)別
它們都是多模式編輯器,不同的是 vim 是 vi 的升級版本,它不僅兼容 vi 的所有指令,而且還有一些新的特性在里面。vim 的這些優(yōu)勢主要體現(xiàn)在以下幾個方面:

1、多級撤消

我們知道在 vi 里,按 u 只能撤消上次命令,而在 vim 里可以無限制的撤消。

2、易用性

vi只能運(yùn)行于 unix 中,而 vim 不僅可以運(yùn)行于 unix,windows ,mac 等多操作平臺。

3、語法加亮

vim 可以用不同的顏色來加亮你的代碼。

4、可視化操作

就是說 vim 不僅可以在終端運(yùn)行,也可以運(yùn)行于 x window、 mac os、 windows。

5、對 vi 的完全兼容

某些情況下,你可以把 vim 當(dāng)成 vi 來使用。vi 和 vim 都是 Linux 中的編輯器,不同的是 vim 比較高級,可以視為 vi 的升級版本。vi 使用于文本編輯,但是 vim 更適用于 coding。
6. awk 命令
AWK是一種處理文本文件的語言,是一個強(qiáng)大的文本分析工具。通常,awk 是以文件的一行為處理單位的。awk 每接收文件的一行,然后執(zhí)行相應(yīng)的命令,來處理文本。
語法: awk "{pattern + action}" {filenames}
pattern 表示 AWK 在數(shù)據(jù)中查找的內(nèi)容,而 action 是在找到匹配內(nèi)容時所執(zhí)行的一系列命令?;ɡㄌ枺?b>{}
)不需要在程序中始終出現(xiàn),但它們用于根據(jù)特定的模式對一系列指令進(jìn)行分組。 pattern就是要表示的正則表達(dá)式,用斜杠括起來。

綜合 1. AES 和 RSA 的區(qū)別:

RSA 是非對稱加密,公鑰加密,私鑰解密, 反之亦然。缺點(diǎn):運(yùn)行速度慢,不易于硬件實(shí)現(xiàn)。常私鑰長度有512bit,1024bit,2048bit,4096bit,長度越長,越安全,但是生成密鑰越慢,加解密也越耗時。

AES 對稱加密,密鑰最長只有256個 bit,執(zhí)行速度快,易于硬件實(shí)現(xiàn)。由于是對稱加密,密鑰需要在傳輸前通訊雙方獲知。

AES加密數(shù)據(jù)塊分組長度必須為128比特,密鑰長度可以是128比特、192比特、256比特中的任意一個(如果數(shù)據(jù)塊及密鑰 長度不足時,會補(bǔ)齊)

總結(jié)采用非對稱加密算法管理對稱算法的密鑰,然后用對稱加密算法加密數(shù)據(jù),這樣我們就集成了兩類加密算法的優(yōu)點(diǎn),既實(shí)現(xiàn)了加密速度快的優(yōu)點(diǎn),又實(shí)現(xiàn)了安全方便管理密鑰的優(yōu)點(diǎn)。
2. 一次完整的 http 請求詳解

客戶端輸入 URL 。

客戶端檢測緩存(有緩存且較新,客戶端直接讀取本地緩存進(jìn)行資源展示,有緩存但是不新,準(zhǔn)備 http 請求包,發(fā)送至服務(wù)端進(jìn)行緩存校驗(yàn))。

提取請求首部 HOST通過 DNS 域名解析獲取服務(wù) IP(DNS 緩存遞歸等)。

通過 IP 與默認(rèn)端口創(chuàng)建 TCP 連接,進(jìn)行 http 請求報文數(shù)據(jù)發(fā)送,其中重點(diǎn)就三次握手進(jìn)行描述(客戶端向服務(wù)端發(fā)送 syn,服務(wù)端向客戶端發(fā)送 syn、ack,客戶端向服務(wù)端發(fā)送 syn,ack,data)。

服務(wù)端程序接受請求,定向到請求路徑處理程序,準(zhǔn)備http響應(yīng)。

通過建立的 tcp 連接來返回相關(guān)的 http 響應(yīng)報文及 http 狀態(tài)信息,然后根據(jù)實(shí)際情況看是否關(guān)閉連接( Connection的keep-alive )。

TCP 連接關(guān)閉經(jīng)歷 4 次握手。

客戶端拿到 http 響應(yīng)的報文信息,經(jīng)過一系列前端處理過程最終將請求的資源進(jìn)行展示

3. cookie 和 session 的區(qū)別和用法。session 鎖

cookie 數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上.

cookie 不是很安全,別人可以分析存放在本地的 COOKIE 并進(jìn)行 COOKIE 欺騙,考慮到安全應(yīng)當(dāng)使用 session。

session 會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用 COOKIE。

單個 cookie 保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點(diǎn)最多保存20個 cookie。(Session 對象沒有對存儲的數(shù)據(jù)量的限制,其中可以保存更為復(fù)雜的數(shù)據(jù)類型)

session 鎖

php 的 session 默認(rèn)用文件存儲,當(dāng)請求一個需要操作 session 的 php 文件(session_start())時,這個文件是會被第一個操作 session 的進(jìn)程鎖定,導(dǎo)致其他請求阻塞。其他請求會掛起在 session_start() 直到s ession文件解鎖。這樣保證了讀取-寫入,讀取-寫入的順序。對數(shù)據(jù)流來說很理想,但是,對于目前這種頁面大量應(yīng)用ajax的情況,所有請求排隊(duì)處理,將大大加大頁面展現(xiàn)的耗時,甚至出現(xiàn)請求超時等不可用故障。
解決:由于鎖定的 session 文件直到腳本執(zhí)行結(jié)束或者 session 正常關(guān)閉才會解鎖,為了防止大量的 php 請求(需要使用 $_SESSION 數(shù)據(jù))被鎖定,可以在寫完 session 后馬上關(guān)閉(使用session_write_close()),這樣就釋放了鎖;
Memcache 或者 Redis 做 session 的存儲,是能解決“鎖定”的問題,但處理不好會導(dǎo)致連接數(shù)飆高(在 session 操作后如果有耗時操作,連接是不回收的,可以主動在 session 寫操作完成后做 session_write_close() 操作);
4. XSS、CSRF、SSRF、SQL 注入原理

XSS跨站腳本一種網(wǎng)站應(yīng)用程序的安全漏洞攻擊,是代碼注入的一種。它允許惡意用戶將代碼注入到網(wǎng)頁上。通常包含了 HTML 以及用戶端腳本語言。防御頁面上直接輸出的所有不確定(用戶輸入)內(nèi)容都進(jìn)行 html 轉(zhuǎn)義;對用戶輸入內(nèi)容格式做校驗(yàn);script 腳本中不要使用不確定的內(nèi)容;

CSRF:跨站請求偽造是一種挾制用戶在當(dāng)前已登錄的 Web 應(yīng)用程序上執(zhí)行非本意的操作的攻擊方法;防御:驗(yàn)證 HTTP Referer 字段;在請求地址中(或 HTTP 頭中)添加 token 并驗(yàn)證;

SSRF模擬服務(wù)器對其他服務(wù)器資源進(jìn)行請求,沒有做合法性驗(yàn)證。構(gòu)造惡意內(nèi)網(wǎng)IP做探測,或者使用其余所支持的協(xié)議對其余服務(wù)進(jìn)行攻擊。防御:禁止跳轉(zhuǎn),限制協(xié)議,內(nèi)外網(wǎng)限制,URL 限制。繞過:使用不同協(xié)議,針對IP,IP 格式的繞過,針對 URL,惡意 URL 增添其他字符,@之類的。301跳轉(zhuǎn) + dns rebindding。

SQL注入:是通過把 SQL 命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的 SQL 命令。防御過濾特殊符號特殊符號過濾或轉(zhuǎn)義處理(addslashes函數(shù));綁定變量,使用預(yù)編譯語句;

5. NPM 、Yarn 概念
NPM 是 Node.js(一個基于 Google V8 引擎的 JavaScript 運(yùn)行環(huán)境)的包管理和分發(fā)工具。
Yarn 是 Facebook 在 2016 年 10 月開源的一個新的包管理器,用于替代現(xiàn)有的 NPM 客戶端或者其他兼容 NPM 倉庫的包管理工具。Yarn 在保留 NPM 原有工作流特性的基礎(chǔ)上,使之變得更快、更安全、更可靠。

MongoDB MongoDB 數(shù)據(jù)類型:

String(字符串): mongodb 中的字符串是 UTF-8 有效的。

Integer(整數(shù)): 存儲數(shù)值。整數(shù)可以是 32 位或 64 位,具體取決于您的服務(wù)器。

* Boolean(布爾): 存儲布爾( true/false )值。

Arrays(數(shù)組): 將數(shù)組或列表或多個值存儲到一個鍵中。

Timestamp(時間戳): 存儲時間戳。

Object(對象): 嵌入式文檔。

Null (空值): 存儲 Null 值。

Date(日期): 以 UNIX 時間格式存儲當(dāng)前日期或時間。


算法 1. 排序算法

* 快速排序

快速排序:我先選一個標(biāo)尺,用它把整個隊(duì)列過一遍篩選,以保證其左邊的元素都不大于它,其右邊的元素都不小與它
function quickSort($arr){
  // 獲取數(shù)組長度
  $length = count($arr);
  // 判斷長度是否需要繼續(xù)二分比較
  if($length <= 1){
    return $arr;
  }
  // 定義基準(zhǔn)元素
  $base = $arr[0];
  // 定義兩個空數(shù)組,用于存放和基準(zhǔn)元素的比較后的結(jié)果
  $left = [];
  $right = [];
  // 遍歷數(shù)組
  for ($i=1; $i < $length; $i++) 
    // 和基準(zhǔn)元素作比較
    if ($arr[$i] > $base) {
      $right[] = $arr[$i];
    }else {
      $left[] = $arr[$i];
    }
  }
  // 然后遞歸分別處理 left 和 right
  $left = quickSort($left);
  $right = quickSort($right);
  // 合并
  return array_merge($left,[$base],$right);
  
}

冒泡排序

思路:法如其名,就像冒泡一樣,每次從數(shù)組中冒出一個最大的數(shù)
比如:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){
  // 獲取數(shù)組長度
  $length = count($arr);
  // 第一層循環(huán)控制冒泡輪次
  for ($i=0; $i < $length-1; $i++) { 
    // 內(nèi)層循環(huán)控制從第0個鍵值和后一個鍵值比較,每次冒出一個最大的數(shù)
    for ($k=0; $k < $length-$i; $k++) { 
      if($arr[$k] > $arr[$k+1]){
        $tmp = $arr[$k+1];
        $arr[$k+1] = $arr[$k];
        $arr[$k] = $tmp;
      }
    }
  }
  return $arr;
}

選擇排序

思路:每次選擇一個相應(yīng)的元素,然后將其放到指定的位置.使用雙重循環(huán)完成,外層控制輪數(shù),當(dāng)前的最小值,內(nèi)層控制比較次數(shù)
function selectSort($arr){
  // 獲取長度
  $length = count($arr);
  for ($i=0; $i < $length - 1; $i++) { 
    // 假設(shè)最小值的位置
    $p = $i;
    // 使用假設(shè)的最小值和其他值比較,找到當(dāng)前的最小值
    for ($j=$i+1; $j < $length; $j++) { 
      // $arr[$p] 是已知的當(dāng)前最小值
      // 判斷當(dāng)前循環(huán)值和已知最小值的比較,當(dāng)發(fā)下更小的值時記錄下鍵,并進(jìn)行下一次比較
      if ($arr[$p] > $arr[$j]) {
        $p = $j; // 比假設(shè)的值更小
      }
    }
    // 通過內(nèi)部 for 循環(huán)找到了當(dāng)前最小值的 key,并保存在 $p 中
    // 判斷 當(dāng)前 $p 中的鍵和假設(shè)的最小值的鍵不一致增將其互換
    if ($p != $i) {
      $tmp = $arr[$p];
      $arr[$p] = $arr[$i];
      $arr[$i] = $tmp;
    }
  }
  // 返回最終結(jié)果
  return $arr;
}

正則表達(dá)式

緩存及 nosql 1、redis 的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1、讀寫性能優(yōu)異

2、支持?jǐn)?shù)據(jù)持久化,支持 AOFRDB 兩種持久化方式

3、支持主從復(fù)制,主機(jī)會自動將數(shù)據(jù)同步到從機(jī),可以進(jìn)行讀寫分離。

4、數(shù)據(jù)結(jié)構(gòu)豐富:除了支持 string 類型的 value 外還支持 stringhash、set、sortedsetlist等數(shù)據(jù)結(jié)構(gòu)。

缺點(diǎn):
1、 Redis 不具備自動容錯和恢復(fù)功能,主機(jī)從機(jī)的宕機(jī)都會導(dǎo)致前端部分讀寫請求失敗,需要等待機(jī)器重啟或者手動切換前端的 IP 才能恢復(fù)。

2、 主機(jī)宕機(jī),宕機(jī)前有部分?jǐn)?shù)據(jù)未能及時同步到從機(jī),切換IP后還會引入數(shù)據(jù)不一致的問題,降低了系統(tǒng)的可用性。

3、 redis 的主從復(fù)制采用全量復(fù)制,復(fù)制過程中主機(jī)會 fork 出一個子進(jìn)程對內(nèi)存做一份快照,并將子進(jìn)程的內(nèi)存快照保存為文件發(fā)送給從機(jī),這一過程需要確保主機(jī)有足夠多的空余內(nèi)存。若快照文件較大,對集群的服務(wù)能力會產(chǎn)生較大的影響,而且復(fù)制過程是在從機(jī)新加入集群或者從機(jī)和主機(jī)網(wǎng)絡(luò)斷開重連時都會進(jìn)行,也就是網(wǎng)絡(luò)波動都會造成主機(jī)和從機(jī)間的一次全量的數(shù)據(jù)復(fù)制,這對實(shí)際的系統(tǒng)運(yùn)營造成了不小的麻煩。

4、 Redis 較難支持在線擴(kuò)容,在集群容量達(dá)到上限時在線擴(kuò)容會變得很復(fù)雜。為避免這一問題,運(yùn)維人員在系統(tǒng)上線時必須確保有足夠的空間,這對資源造成了很大的浪費(fèi)。

2、redis 的應(yīng)用場景

* 緩存——熱數(shù)據(jù)

熱點(diǎn)數(shù)據(jù)(經(jīng)常會被查詢,但是不經(jīng)常被修改或者刪除的數(shù)據(jù))

計數(shù)器

諸如統(tǒng)計點(diǎn)擊數(shù)等應(yīng)用。由于單線程,可以避免并發(fā)問題,保證不會出錯,而且 100% 毫秒級性能!別忘記持久化,畢竟是 redis 只是存了內(nèi)存!

 * 命令:INCRBY

隊(duì)列

相當(dāng)于消息系統(tǒng)。由于 redis 把數(shù)據(jù)添加到隊(duì)列是返回添加元素在隊(duì)列的第幾位,所以可以做判斷用戶是第幾個訪問這種業(yè)務(wù)。隊(duì)列不僅可以把并發(fā)請求變成串行,并且還可以做隊(duì)列或者棧使用

分布式鎖與單線程機(jī)制

驗(yàn)證前端的重復(fù)請求(可以自由擴(kuò)展類似情況),可以通過 redis 進(jìn)行過濾:每次請求將request Ip、參數(shù)、接口等 hash 作為 key 存儲 redis(冪等性請求),設(shè)置多長時間有效期,然后下次請求過來的時候先在 redis 中檢索有沒有這個 key,進(jìn)而驗(yàn)證是不是一定時間內(nèi)過來的重復(fù)提交.

秒殺系統(tǒng),基于 redis 是單線程特征,防止出現(xiàn)數(shù)據(jù)庫“爆破”

全局增量 ID 生成,類似“秒殺”

最新列表

例如新聞列表頁面最新的新聞列表,如果總數(shù)量很大的情況下,盡量不要使用 select a from A limit 10 這種 low 貨,嘗試 redis 的 LPUSH命令構(gòu)建 List,一個個順序都塞進(jìn)去就可以啦。不過萬一內(nèi)存清掉了咋辦?也簡單,查詢不到存儲 key 的話,用 mysql 查詢并且初始化一個 List 到 redis 中就好了。

排行榜

誰得分高誰排名往上。命令:ZADD(有續(xù)集,sorted set)

3、MongoDB 優(yōu)缺點(diǎn)
缺點(diǎn)
1、 不支持事務(wù)操作
2、 占用空間過大
3、 MongoDB 沒有如 MySQL 那樣成熟的維護(hù)工具
4、 無法進(jìn)行關(guān)聯(lián)表查詢,不適用于關(guān)系多的數(shù)據(jù)
5、 復(fù)雜聚合操作通過 mapreduce 創(chuàng)建,速度慢
6、 模式自由,自由靈活的文件存儲格式帶來的數(shù)據(jù)錯誤

優(yōu)點(diǎn)
1、 文檔結(jié)構(gòu)的存儲方式,能夠更便捷的獲取數(shù)據(jù)
2、 內(nèi)置 GridFS,支持大容量的存儲
3、 內(nèi)置 Sharding,分片簡單
4、 海量數(shù)據(jù)下,性能優(yōu)越
5、 支持自動故障恢復(fù)(復(fù)制集)
參考:https://www.cnblogs.com/shiji...


內(nèi)容為本人收集整理,如有表達(dá)錯誤歡迎指正。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28409.html

相關(guān)文章

  • 個人建議之PHP面試的準(zhǔn)備

    摘要:個人也建議不要滿足于自己當(dāng)下所知道的,多去拓展自己,多去學(xué)新的東西。作為一個面試者來說,知識點(diǎn)的記憶準(zhǔn)備為的是更好的應(yīng)對面試中技術(shù)面中問到的各種問題。 你好,是我琉憶——PHP程序員面試筆試系列圖書的作者。 隨著越來越多的人開始邁入PHP開發(fā)工程師的隊(duì)列,不管是一個PHP新手還是一個有一兩年開發(fā)經(jīng)驗(yàn)的PHPer都不得不去面對找工作前面試這件事。 我現(xiàn)在以個人對面試的經(jīng)歷和見解來全面的對...

    macg0406 評論0 收藏0
  • PHP面試總結(jié)

    摘要:而在面試過程中,也是經(jīng)常會遇到的,所以,無論是面試準(zhǔn)備還是日常開發(fā),我們都應(yīng)該關(guān)注這方面的東西。二分法的基本做法是確定要查找的區(qū)間。區(qū)間內(nèi)選取二分點(diǎn)。根據(jù)二分點(diǎn)的值,綜合左右區(qū)間情況以及求解的目的,舍去一半無用的區(qū)間。 showImg(https://images.pexels.com/photos/935977/pexels-photo-935977.jpeg); 前言 面試是你進(jìn)入...

    alin 評論0 收藏0
  • 2018 PHP 面試總結(jié)

    摘要:最近面試了不少公司,正好把記得的問題做個總結(jié)。抽象類的接口的區(qū)別,不在于編程實(shí)現(xiàn),而在于程序設(shè)計模式的不同。一般來講,抽象用于不同的事物,而接口用于事物的行為。 最近面試了不少公司,正好把記得的問題做個總結(jié)。 本文 github 會持續(xù)更新 公眾號 搜索 蘇生不惑 或者掃二維碼關(guān)注,每周更新。 showImg(https://segmentfault.com/img/bVbsYyM?w...

    William_Sang 評論0 收藏0
  • 2018 PHP 面試總結(jié)

    摘要:最近面試了不少公司,正好把記得的問題做個總結(jié)。抽象類的接口的區(qū)別,不在于編程實(shí)現(xiàn),而在于程序設(shè)計模式的不同。一般來講,抽象用于不同的事物,而接口用于事物的行為。 最近面試了不少公司,正好把記得的問題做個總結(jié)。 本文 github 會持續(xù)更新 公眾號 搜索 蘇生不惑 或者掃二維碼關(guān)注,每周更新。 showImg(https://segmentfault.com/img/bVbsYyM?w...

    lunaticf 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<