持續更新。。。。php
autoload
Autoload
的加載機制,
當經過 new 來實例化一個類時,PHP 會經過定義的 autoload 函數加載相應的文件,若是這個類文件使用了 extends 或者 implements 須要用到其餘的類文件,php 會從新運行 autoload 去進行類文件的查找和加載,若是發生了兩次對同一類文件的請求,就會報錯。
靜態局部變量的特色:
1.不會隨着函數的調用和退出而發生變化。
2.靜態局部變量只會初始化一次。
3.靜態屬性只能被初始化爲一個字符值或一個常量,不能使用表達式。
4.當屢次調用一個函數且要求在調用之間保留某些變量的值時,可考慮採用靜態局部變量。
strtr
和 str_replace
有什麼區別,二者分別用在什麼場景下?str_replace()
以其餘字符替換字符串中的一些字符(區分大小寫)strtr()
轉換字符串中特定的字符。5.6版本 str_replace 比 strtr 效率高10+倍, 7.0 版本效率基本相同, 但 5.6 的 str_replace 竟比 7.0 高 3倍
__construct()
:類的默認構造方法,若是 __construct() 和與類同名的方法共同出現時,默認調用__construct()而不是同類名方法。__call()
:當調用不存在或者不可訪問的方法時,會調用 __call ( $name, $arguments )方法。__toString()
:當打印對象時會被直接調用。__clone()
:當對象被拷貝時直接調用。__isset()
:對不存在或者不可訪問的屬性使用 isset() 或者 empty() 時,__isset() 會被調用;__destruct()
:類的析構函數,當該對象的全部引用都被刪除,或者對象被顯式銷燬時執行。__sleep()
執行 serialize() 函數時會調用foreach ($array as $key => $item) { $array[$key + 1] = $item + 2; echo "$item"; } print_r($array);
結果示例: $array = [3,6,7,8];
html
3678 //echo 輸出數組內元素的值 Array ( [0] => 3 //$key 保持不變 [1] => 5 //每次的$eky + 1,對應的值加2, [2] => 8 [3] => 9 [4] => 10 )
遞歸是一種函數調用自身(直接或間接)的一種機制
,這種強大的思想能夠把某些複雜的概念變得極爲簡單。邏輯上的遞歸能夠無次數限制, 但語言執行器或者程序堆棧會限制遞歸的次數.
php 手冊註解:可是要避免遞歸函數/方法調用超過 100-200 層,由於可能會使堆棧崩潰從而使當前腳本終止。 無限遞歸可視爲編程錯誤。
遞歸的兩個基本條件
:前端
遞歸的退出條件
,這是遞歸可以正常執行的必要條件,也是保證遞歸可以正確返回的必要條件。缺少這個條件,遞歸就會無限進行,直到系統給予的資源耗盡。若是碰到「max nest level of 100 reached」(php 中,超出遞歸限制)是沒有正確的退出條件,致使了遞歸深度過大或者無限遞歸。遞推過程
。由一層函數調用進入下一層函數調用的遞推。如:$arr = [10,4,6,4,19,3,5];mysql
array_multisort
能夠用來一次對多個數組進行排序,或者根據某一維或多維對多維數組進行排序。array_unique
代碼:linux
function bubbleSort(array $arr){ $count = count($arr); //數組長度 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);
是一種程序設計範型,同時也是一種程序開發方法。它將對象做爲程序的基本單元,將程序和數據封裝其中,以提升軟件的重用性、靈活性和可擴展性。
標量進行強制類型轉換的 object
,沒有一個類和它對象。此時,PHP 中的一個稱爲「孤兒」的 stdClass
類就會收留這個對象)。一、foreach 也叫加強 for 循環,foreach 實際上是 for 循環的一個特殊簡化版。
二、foreach 適用於只進行集合或數組遍歷, for 則在較複雜的循環中效率更高。
三、foreach 不能對數組或集合進行修改(添加刪除操做),若是想要修改就要用 for 循環。
因此相比較下來 for 循環更爲靈活。laravel
二者的使用不一樣:web
array_values
($arr):得到數組的值array_keys
($arr):得到數組的鍵名array_flip
($arr):數組中的值與鍵名互換(若是有重複前面的會被後面的覆蓋)in_array
("apple",$arr): 在數組中檢索applearray_search
("apple",$arr): 在數組中檢索apple ,若是存在返回鍵名array_push
($arr,"apple","pear"):將一個或多個元素壓入數組棧的末尾(入棧),返回入棧元素的個數array_pop
($arr):將數組棧的最後一個元素彈出(出棧)array_shift
($arr):數組中的第一個元素移出並做爲結果返回(數組長度減1,其餘元素向前移動一位,數字鍵名改成從零技術,文字鍵名不變)array_unshift
($arr,"a",array(1,2)):在數組的開頭插入一個或多個元素ajax
echo date('Y-m-d H:i:s',strtotime('-1 day',time()));
error_reporting
函數的做用error_reporting() 設置 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'; }
public function strrev($str) { $newstr = ''; $len = strlen($str); //獲取字符串長度 for($i = $len; $i >= 0; $i--) { $newstr .= $str{$i}; //從最大下標拼接至最小便是反轉了 } return $newst; }
http 狀態碼
及其做用Name | Academy | score |
---|---|---|
200 | OK | 請求成功,服務器成功返回網頁 |
301 | Moved Permanently | 永久跳轉,請求的網頁已永久跳轉到新位置。 |
403 | Forbidden | 禁止訪問,服務器拒絕請求 |
404 | Not Found | 服務器找不到請求的頁面 |
500 | Internal Server Error | 服務器內部錯誤 |
502 | Bad Gateway | 壞的網關,通常是網關服務器請求後端服務時,後端服務沒有按照 http 協議正確返回結果。 |
503 | Service Unavailable | 服務當前不可用,可能由於超載或停機維護。 |
504 | Gateway Timeout | 網關超時,通常是網關服務器請求後端服務時,後端服務沒有在特定的時間內完成服務。 |
function check_email($email){ $preg = "/^\w+([-_.]\w+)*@\w+([-_.]\w+)*(\.\w+){0,3}$/i"; preg_match($preg,$email,$res); return $res;//匹配成功返回1,匹配失敗返回0 }
MVC
是模型( model ) -視圖( view )-控制器( controller )的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。redis
php的內存管理機制是:預先給出一塊空間,用來存儲變量,當空間不夠時,再申請一塊新的空間。
雖然刪除後內存變小了,但仍是比沒定義變量以前時大,這是由於雖然刪除了變量的值,但變量名沒有被刪除。
php垃圾回收機制
垃圾回收:
zval容器
中的refcount
在增長,說明不是垃圾。若是發現一個zval容器
中的refcount
在減小,若是減到了 0,直接當作垃圾回收。若是發現一個 zval 容器中的 refcount 在減小,並無減到 0,PHP 會把該值放到緩衝區,當作有多是垃圾的懷疑對象。當緩衝區達到了臨界值,PHP 會自動調用一個方法去遍歷每個值,若是發現是垃圾就清理laravel
ThinkPHP
Yaf
依賴注入
,實質是經過構造函數或者某些狀況下經過 setter 方法將類依賴注入到類中
。通俗的講就是一個類中要屢次引入某個 model 的時候,能夠在構造函數中一次引入,類中的方法直接調用便可。
Composer
是一款跨平臺的 PHP 依賴管理工具。讓 組件式編程 成爲可能,編寫軟件時,就如拼接樂高玩具同樣。極大的提升了開發的效率和代碼的可複用性,解放了生產力。Laravel 使用 Composer 來做爲擴展包的管理工具。
public/index.php
文件。index.php
文件載入 Composer
生成的自動加載設置,而後從 bootstrap/app.php
腳本獲取 Laravel 應用實例,Laravel 的第一個動做就是建立服務容器實例
。HTTP
內核或 Console
內核(分別用於處理 Web 請求和 Artisan 命令),這取決於進入應用的請求類型。服務提供者
,應用的全部服務提供者都被配置在 config/app.php
配置文件的 providers
數組中。首先,全部提供者的 register
方法被調用,而後,全部提供者被註冊以後,boot
方法被調用。Request
將會被交給路由器進行分發,路由器將會分發請求到路由或控制器,同時運行全部路由指定的中間件。
服務提供者
是啓動 Laravel 應用中最關鍵的部分,應用實例被建立後,服務提供者被註冊,請求被交給啓動後的應用進行處理,整個過程就是這麼簡單!
int(M) M 指示最大顯示寬度
,在數據庫裏面存儲的都是4個字節的長度。最大有效顯示寬度是255。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度
。顯示寬度並不限制能夠在列內保存的值的範圍,也不限制超過列的指定寬度的值的顯示。
優勢:
缺點:
因爲 mysql
主從複製是基於 binlog 的一種異步複製
,經過網絡傳送 binlog 文件,理所固然網絡延遲是主從不一樣步的絕大多數的緣由,特別是跨機房的數據同步出現這種概率很是的大,因此作讀寫分離,注意從業務層進行前期設計。
因爲 mysql 主從複製是主數據庫上面啓動1個 io 線程,而從上面啓動1個 sql 線程和1個 io 線程,當中任何一臺機器的負載很高,忙不過來,致使其中的任何一個線程出現資源不足,都將出現主從不一致的狀況。
主數據庫上面設置的
max_allowed_packet
比從數據庫大,當一個大的 sql 語句,能在主數據庫上面執行完畢,從數據庫上面設置太小,沒法執行,致使的主從不一致。
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
原子性
(Atomicity)原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾。
一致性
(Consistency)一致性是指事務執行以前和執行以後都必須處於一致性狀態。
隔離性
(Isolation)隔離性是當 多個用戶併發訪問數據庫時,好比操做同一張表時, 數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。
持久性
(Durability)持久性是指一個事務一旦被提交,對數據庫中的數據的改變就是永久性的
若是不考慮事務的隔離性,會發生的幾種問題:
髒讀
(dirty read) :指在一個事務處理過程裏讀取了另外一個未提交的事務中的數據。不可重複讀
(unrepeated read):指在對於數據庫中的某個數據,一個事務範圍內屢次查詢卻返回了不一樣的數據值,這是因爲在查詢間隔,被另外一個事務修改並提交了。幻讀
(phantom read):一個事務執行兩次查詢,第二次查詢比第一次多出或少一些數據,形成兩次結果不一致。只是另外一個事務在這兩次查詢中間插入或者 刪除了數據形成的。第一類丟失更新
(lost update): 在徹底未隔離事務的狀況下,兩個事物更新同一條數據資源,某一事物異常終止,回滾形成第一個完成的更新也同時丟失 。第二類丟失更新
(second lost updates):是不可重複讀的特殊狀況,若是兩個事務都讀取同一行,而後兩個都進行寫操做,並提交,第一個事務所作的改變就會丟失。 1. Serializable 串行化
2. Repeatable Read 可重複讀
3. Read Commited 可讀已提交
4. Read Uncommited 可讀未提交
併發控制:
@@tx_isolation
,表示當前的事務隔離級別。JDBC 數據庫鏈接使用數據庫系統默認的隔離級別。mysql查看當前事務隔離級別:select @@tx_isolation
設置事務隔離級別:set [glogal | session] transaction isolation level 隔離級別名稱;
或set tx_isolation=’隔離級別名稱;’
悲觀鎖
正如其名,它指的是對數據被外界(包括本系統當前的其餘事務,以及來自外部系統的事務處理)修改持保守態度,在整個數據處理過程當中,將數據處於鎖定狀態
。基於數據庫的鎖機制實現
(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,不然,即便在本系統中實現了加鎖機制,也沒法保證外部系統不會修改數據)。
在Hibernate使用悲觀鎖十分容易,但實際應用中悲觀鎖是不多被使用的,由於它每次發送的SQL語句都會加上"for update"用於告訴數據庫鎖定相關數據,大大限制了併發性
,數據庫性能的大量開銷
樂觀鎖
樂觀鎖,大可能是基於數據版本( Version )記錄機制實現。何謂數據版本?即爲數據增長一個版本標識,在基於數據庫表的版本解決方案中,通常是經過爲數據庫表增長一個 "version" 字段來實現
。
樂觀鎖的工做原理:讀取出數據時,將此版本號一同讀出,以後更新時,對此版本號加一。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,若是提交的數據版本號大於數據庫表當前版本號,則予以更新,不然認爲是過時數據。
概念:用戶能夠在多個列上創建索引
,這種索引叫作複合索引(組合索引);複合索引在數據庫操做期間所需的開銷更小,能夠代替多個單一索引;
窄索引
是指索引列爲1-2列的索引,寬索引
也就是索引列超過2列的索引;
設計索引的一個重要原則就是能用窄索引不用寬索引
,由於窄索引每每比組合索引更有效;
like寫法通常爲select cat from animal where name like '%貓%'
用explain
解釋來看 sql 語句並無運用索引(name 已經建立索引),而是全表掃描。
like '%..%'
like '..%..'
(不以 % 開頭), 對於 like '%...'
的 (不以 % 結尾),加個 reverse 函數,又能夠用上索引了'(須要反向索引的支持)SQL> select * from test_like where reverse(object_name)like reverse('%AS');
使用locate
函數代替like
LOCATE(substr,str)
返回字符串substr
中第一次出現子字符串的位置 str
。LOCATE(substr,str,pos)
返回 substr
在 str
中第一次出現的位置,若是 substr
在 str
中不存在,返回值爲 0
。若是pos
存在,返回 substr
在 str
第pos
個位置後第一次出現的位置,若是 substr
在 str
中不存在,返回值爲0
。$request_time
列出 php 頁面請求時間超過3秒的頁面,並統計其出現的次數,顯示前100條
cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100
crond
是 linux 下用來週期性的執行某種任務或等待處理某些事件的一個守護進程。
* 用戶任務調度:用戶按期要執行的工做,好比用戶數據備份、定時郵件提醒等。用戶可使用 crontab 工具來定製本身的計劃任務。全部用戶定義的 crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。
語法:minute
hour
day
month
week
command
還可使用如下特殊字符:
經常使用的幾種方式:
輪詢 (Round Robin)
根據Nginx配置文件中的順序, 每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器 down 掉,能自動剔除。
upstream web { server server1; server server2; }
Web 請求會被轉發到 鏈接數最少的服務器上。least_conn 算法很簡單,首選遍歷後端集羣,比較每一個後端的 conns/weight,選取該值最小的後端。若是有多個後端的 conns/weight 值同爲最小的,那麼對它們採用加權輪詢算法。
upstream web { least_conn; server server1; server server2; }
同一客戶端連續的 Web 請求可能會被分發到不一樣的後端服務器進行處理,所以若是涉及到會話 Session,可使用基於 IP 地址哈希的負載均衡方案。這樣的話, 同一客戶端連續的 Web 請求都會被分發到同一服務器進行處理(每一個請求按訪問 ip 的 hash 結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決 session 的問題)。
upstream web { ip_hash; server server1; server server2; }
能夠根據服務器的性能情況有選擇的分發 web 請求。指定輪詢概率,weight 越高、訪問比率越大。weight=2,意味着每接收到3個請求,前2個請求會被分發到第一個服務器,第3個請求會分發到第二個服務器,其它的配置同輪詢配置。
upstream web { server server1 weight=2; server server2; }
基於權重的負載均衡和基於 IP 地址哈希的負載均衡能夠組合在一塊兒使用。
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream web { server server1; server server2; fair; }
按訪問 url 的 hash 結果來分配請求,使每一個 url 定向到同一個後端服務器,後端服務器爲緩存時比較有效。 hash_method 是使用的 hash 算法
upstream web {
server server1:3128; server server1:3128; hash $request_uri; hash_method crc32;
}
每一個設備的狀態設置爲:
1.down 表示單前的 server 暫時不參與負載
2.weight 默認爲1.weight 越大,負載的權重就越大。
3.max_fails:容許請求失敗的次數默認爲1.當超過最大次數時,返回 proxy_next_upstream 模塊定義的錯誤
4.fail_timeout:max_fails 次失敗後,暫停的時間。
5.backup: 其它全部的非 backup 機器 down 或者忙的時候,請求 backup 機器。因此這臺機器壓力會最輕。sorry server 提供非業務功能。
Keepalived
是經過VRRP(虛擬路由器冗餘協議)協議實現高可用
功能的。VRRP 出現的目的就是爲了解決靜態路由單點故障問題的,它可以保證當個別節點宕機時,整個網絡能夠不間斷地運行。
它們都是
多模式編輯器
,不一樣的是 vim 是 vi 的升級版本,它不只兼容 vi 的全部指令,並且還有一些新的特性在裏面。vim 的這些優點主要體如今如下幾個方面:
咱們知道在 vi 裏,按 u 只能撤消上次命令,而在 vim 裏能夠無限制的撤消。
vi只能運行於 unix 中,而 vim 不只能夠運行於 unix,windows ,mac 等多操做平臺。
vim 能夠用不一樣的顏色來加亮你的代碼。
就是說 vim 不只能夠在終端運行,也能夠運行於 x window、 mac os、 windows。
某些狀況下,你能夠把 vim 當成 vi 來使用。vi 和 vim 都是 Linux 中的編輯器,不一樣的是 vim 比較高級,能夠視爲 vi 的升級版本。vi 使用於文本編輯,可是 vim 更適用於 coding。
AWK
是一種處理文本文件的語言
,是一個強大的文本分析工具。一般,awk 是以文件的一行爲處理單位
的。awk 每接收文件的一行,而後執行相應的命令,來處理文本。
語法:awk '{pattern + action}' {filenames}
pattern
表示 AWK 在數據中查找的內容,而action
是在找到匹配內容時所執行的一系列命令。花括號({}
)不須要在程序中始終出現,但它們用於根據特定的模式對一系列指令進行分組。pattern
就是要表示的正則表達式,用斜槓括起來。
總結:
採用非對稱加密算法管理對稱算法的密鑰,而後用對稱加密算法加密數據,這樣咱們就集成了兩類加密算法的優勢,既實現了加密速度快的優勢,又實現了安全方便管理密鑰的優勢。
客戶端檢測緩存
(有緩存且較新,客戶端直接讀取本地緩存進行資源展現,有緩存可是不新,準備 http 請求包,發送至服務端進行緩存校驗)。DNS 域名解析
獲取服務 IP(DNS 緩存遞歸等)。TCP 鏈接
,進行 http 請求
報文數據發送,其中重點就三次握手進行描述(客戶端向服務端發送 syn,服務端向客戶端發送 syn、ack,客戶端向服務端發送 syn,ack,data)。服務端程序接受請求
,定向到請求路徑處理程序,準備http響應。返回
相關的 http
響應報文及 http 狀態信息
,而後根據實際狀況看是否關閉鏈接( Connection的keep-alive )。TCP 鏈接關閉
經歷 4 次握手。客戶端
拿到 http 響應的報文信息,通過一系列前端處理過程最終將請求的資源
進行展現
。session 鎖
php 的 session 默認用文件存儲,當請求一個須要操做 session 的 php 文件(session_start())時,這個文件是會被第一個操做 session 的進程鎖定,致使其餘請求阻塞。其餘請求會掛起在 session_start() 直到s ession文件解鎖。這樣保證了讀取-寫入,讀取-寫入的順序。對數據流來講很理想,可是,對於目前這種頁面大量應用ajax的狀況,全部請求排隊處理,將大大加大頁面展示的耗時,甚至出現請求超時等不可用故障。
解決
:因爲鎖定的 session 文件直到腳本執行結束或者 session 正常關閉纔會解鎖,爲了防止大量的 php 請求(須要使用 $_SESSION 數據)被鎖定,能夠在寫完 session 後立刻關閉(使用session_write_close()
),這樣就釋放了鎖;
Memcache 或者 Redis 作 session 的存儲,是能解決「鎖定」的問題,但處理很差會致使鏈接數飆高(在 session 操做後若是有耗時操做,鏈接是不回收的,能夠主動在 session 寫操做完成後作 session_write_close() 操做);
XSS
:跨站腳本
一種網站應用程序的安全漏洞攻擊,是代碼注入
的一種。它容許惡意用戶將代碼注入到網頁上。一般包含了 HTML 以及用戶端腳本語言。防護
:頁面上直接輸出的全部不肯定(用戶輸入)內容都進行 html 轉義;對用戶輸入內容格式作校驗;script 腳本中不要使用不肯定的內容; CSRF
:跨站請求僞造
是一種挾制用戶在當前已登陸的 Web 應用程序上執行非本意的操做
的攻擊方法;防護:
驗證 HTTP Referer 字段;在請求地址中(或 HTTP 頭中)添加 token 並驗證;SSRF
:模擬服務器對其餘服務器資源進行請求,沒有作合法性驗證
。構造惡意內網IP作探測,或者使用其他所支持的協議對其他服務進行攻擊。防護:禁止跳轉,限制協議,內外網限制,URL 限制。繞過:使用不一樣協議,針對IP,IP 格式的繞過,針對 URL,惡意 URL 增添其餘字符,@之類的。301跳轉 + dns rebindding。SQL注入
:是經過把 SQL 命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,欺騙服務器執行惡意的 SQL 命令。防護
:過濾特殊符號特殊符號過濾或轉義處理(addslashes
函數);綁定變量,使用預編譯語句; NPM 是 Node.js(一個基於 Google V8 引擎的 JavaScript 運行環境)的包管理和分發工具。
Yarn 是 Facebook 在 2016 年 10 月開源的一個新的包管理器,用於替代現有的 NPM 客戶端或者其餘兼容 NPM 倉庫的包管理工具。Yarn 在保留 NPM 原有工做流特性的基礎上,使之變得更快、更安全、更可靠。
* Boolean(布爾): 存儲布爾( true/false )值。
* 快速排序
快速排序:我先選一個標尺,用它把整個隊列過一遍篩選,以保證其左邊的元素都不大於它,其右邊的元素都不小與它
function quickSort($arr){ // 獲取數組長度 $length = count($arr); // 判斷長度是否須要繼續二分比較 if($length <= 1){ return $arr; } // 定義基準元素 $base = $arr[0]; // 定義兩個空數組,用於存放和基準元素的比較後的結果 $left = []; $right = []; // 遍歷數組 for ($i=1; $i < $length; $i++) // 和基準元素做比較 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); }
思路:法如其名,就像冒泡同樣,每次從數組中冒出一個最大的數
好比:2,4,1
第一次冒出4:2,1,4
第二次冒出2:1,2,4
function bubbleSort($arr){ // 獲取數組長度 $length = count($arr); // 第一層循環控制冒泡輪次 for ($i=0; $i < $length-1; $i++) { // 內層循環控制從第0個鍵值和後一個鍵值比較,每次冒出一個最大的數 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; }
思路:每次選擇一個相應的元素,而後將其放到指定的位置.使用雙重循環完成,外層控制輪數,當前的最小值,內層控制比較次數
function selectSort($arr){ // 獲取長度 $length = count($arr); for ($i=0; $i < $length - 1; $i++) { // 假設最小值的位置 $p = $i; // 使用假設的最小值和其餘值比較,找到當前的最小值 for ($j=$i+1; $j < $length; $j++) { // $arr[$p] 是已知的當前最小值 // 判斷當前循環值和已知最小值的比較,當發下更小的值時記錄下鍵,並進行下一次比較 if ($arr[$p] > $arr[$j]) { $p = $j; // 比假設的值更小 } } // 經過內部 for 循環找到了當前最小值的 key,並保存在 $p 中 // 判斷 當前 $p 中的鍵和假設的最小值的鍵不一致增將其互換 if ($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } // 返回最終結果 return $arr; }
優勢:
一、讀寫性能優異二、支持數據持久化,支持 AOF 和 RDB 兩種持久化方式
三、支持主從複製,主機會自動將數據同步到從機,能夠進行讀寫分離。
四、數據結構豐富:除了支持 string 類型的 value 外還支持 string、hash、set、sortedset、list等數據結構。
缺點:
一、 Redis 不具有自動容錯和恢復功能,主機從機的宕機都會致使前端部分讀寫請求失敗,須要等待機器重啓或者手動切換前端的 IP 才能恢復。二、 主機宕機,宕機前有部分數據未能及時同步到從機,切換IP後還會引入數據不一致的問題,下降了系統的可用性。
三、 redis 的主從複製採用
全量複製
,複製過程當中主機會 fork 出一個子進程對內存作一份快照,並將子進程的內存快照保存爲文件發送給從機,這一過程須要確保主機有足夠多的空餘內存。若快照文件較大,對集羣的服務能力會產生較大的影響,並且複製過程是在從機新加入集羣或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會形成主機和從機間的一次全量的數據複製,這對實際的系統運營形成了不小的麻煩。四、 Redis 較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。爲避免這一問題,運維人員在系統上線時必須確保有足夠的空間,這對資源形成了很大的浪費。
* 緩存——熱數據
計數器
* 命令:INCRBY
隊列
分佈式鎖與單線程機制
最新列表
排行榜
缺點
一、 不支持事務操做
二、 佔用空間過大
三、 MongoDB 沒有如 MySQL 那樣成熟的維護工具
四、 沒法進行關聯表查詢,不適用於關係多的數據
五、 複雜聚合操做經過 mapreduce 建立,速度慢
六、 模式自由,自由靈活的文件存儲格式帶來的數據錯誤優勢
一、 文檔結構的存儲方式,可以更便捷的獲取數據
二、 內置 GridFS,支持大容量的存儲
三、 內置 Sharding,分片簡單
四、 海量數據下,性能優越
五、 支持自動故障恢復(複製集)
參考:https://www.cnblogs.com/shiji...
內容爲本人收集整理,若有表達錯誤歡迎指正。