摘要:由一層函數(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 中的 autoloadAutoload 的加載機(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):3. strtr 和 str_replace 有什么區(qū)別,兩者分別用在什么場景下?
1.不會隨著函數(shù)的調(diào)用和退出而發(fā)生變化。
2.靜態(tài)局部變量只會初始化一次。
3.靜態(tài)屬性只能被初始化為一個字符值或一個常量,不能使用表達(dá)式。
4.當(dāng)多次調(diào)用一個函數(shù)且要求在調(diào)用之間保留某些變量的值時,可考慮采用靜態(tài)局部變量。
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)更為靈活。
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ù)組的開頭插入一個或多個元素
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 和 .phpfunction 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ù)。 |
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
優(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、 ComposerComposer 是一款跨平臺的 PHP 依賴管理工具。讓 組件式編程 成為可能,編寫軟件時,就如拼接樂高玩具一樣。極大的提高了開發(fā)的效率和代碼的可復(fù)用性,解放了生產(chǎn)力。5. laravel 生命周期Laravel 使用 Composer 來作為擴(kuò)展包的管理工具。
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)行處理,整個過程就是這么簡單!
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 26.事務(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_isolation8. 悲觀鎖和樂觀鎖
設(shè)置事務(wù)隔離級別:set [glogal | session] transaction isolation level 隔離級別名稱;或set tx_isolation=’隔離級別名稱;’
悲觀鎖
正如其名,它指的是對數(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ù)。
概念:用戶可以在多個列上建立索引,這種索引叫做復(fù)合索引(組合索引);10. like 的優(yōu)化復(fù)合索引在數(shù)據(jù)庫操作期間所需的開銷更小,可以代替多個單一索引;
窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過2列的索引;
設(shè)計索引的一個重要原則就是能用窄索引不用寬索引,因?yàn)檎饕冉M合索引更有效;
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)返回 substr 在 str 中第一次出現(xiàn)的位置,如果 substr 在 str 中不存在,返回值為 0 。如果pos存在,返回 substr 在 str 第pos個位置后第一次出現(xiàn)的位置,如果 substr 在 str 中不存在,返回值為0。
mysql 優(yōu)化sql 語句優(yōu)化
索引優(yōu)化
選擇合適的存儲引擎
字段選擇合適的數(shù)據(jù)類型
對表進(jìn)行水平或者垂直拆分
針對存儲引擎的優(yōu)化
磁盤 I/O 優(yōu)化
負(fù)載均衡
主從復(fù)制
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è)置為:4. Keepalived
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ù)功能。
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á)式,用斜杠括起來。
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)請求超時等不可用故障。4. XSS、CSRF、SSRF、SQL 注入原理
解決:由于鎖定的 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() 操作);
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ǔ)上,使之變得更快、更安全、更可靠。
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)前日期或時間。
* 快速排序
快速排序:我先選一個標(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; }
優(yōu)點(diǎn):
1、讀寫性能優(yōu)異2、支持?jǐn)?shù)據(jù)持久化,支持 AOF 和 RDB 兩種持久化方式
3、支持主從復(fù)制,主機(jī)會自動將數(shù)據(jù)同步到從機(jī),可以進(jìn)行讀寫分離。
4、數(shù)據(jù)結(jié)構(gòu)豐富:除了支持 string 類型的 value 外還支持 string、hash、set、sortedset、list等數(shù)據(jù)結(jié)構(gòu)。
缺點(diǎn):2、redis 的應(yīng)用場景
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)。
* 緩存——熱數(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
摘要:個人也建議不要滿足于自己當(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)歷和見解來全面的對...
摘要:而在面試過程中,也是經(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)入...
摘要:最近面試了不少公司,正好把記得的問題做個總結(jié)。抽象類的接口的區(qū)別,不在于編程實(shí)現(xiàn),而在于程序設(shè)計模式的不同。一般來講,抽象用于不同的事物,而接口用于事物的行為。 最近面試了不少公司,正好把記得的問題做個總結(jié)。 本文 github 會持續(xù)更新 公眾號 搜索 蘇生不惑 或者掃二維碼關(guān)注,每周更新。 showImg(https://segmentfault.com/img/bVbsYyM?w...
摘要:最近面試了不少公司,正好把記得的問題做個總結(jié)。抽象類的接口的區(qū)別,不在于編程實(shí)現(xiàn),而在于程序設(shè)計模式的不同。一般來講,抽象用于不同的事物,而接口用于事物的行為。 最近面試了不少公司,正好把記得的問題做個總結(jié)。 本文 github 會持續(xù)更新 公眾號 搜索 蘇生不惑 或者掃二維碼關(guān)注,每周更新。 showImg(https://segmentfault.com/img/bVbsYyM?w...
閱讀 786·2023-04-25 20:32
閱讀 2418·2021-11-24 10:27
閱讀 4593·2021-09-29 09:47
閱讀 2309·2021-09-28 09:36
閱讀 3713·2021-09-22 15:27
閱讀 2830·2019-08-30 15:54
閱讀 412·2019-08-30 11:06
閱讀 1317·2019-08-30 10:58