深信服
最大公約數算法
最小公倍數
堆排序
- nginx調度算法
-
輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。 -
weight
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
} -
ip_hash (取餘%的運用)
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
} -
fair(第三方)
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
server server1;
server server2;
fair;
} -
url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
加權輪詢
函數指針
哈希表
哈希分配
sort函數
nginx爲什麼用反向代理不用正向代理
字節對齊
動態規劃
-
strcpy和memcpy都是標準C庫函數,它們有下面的特點。
strcpy提供了字符串的複製。即strcpy只用於字符串複製,並且它不僅複製字符串內容之外,還會複製字符串的結束符。已知strcpy函數的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般內存的複製。即memcpy對於需要複製的內容沒有限制,因此用途更廣。
void *memcpy( void *dest, const void *src, size_t count );char
*
strcpy
(
char
* dest,
const
char
* src)
// 實現src到dest的複製
{
if
((src == NULL) || (dest == NULL))
//判斷參數src和dest的有效性
{
return
NULL;
}
char
*strdest = dest;
//保存目標字符串的首地址
while
((*strDest++ = *strSrc++)!=
'\0'
);
//把src字符串的內容複製到dest下
return
strdest;
}
void
*
memcpy
(
void
*memTo,
const
void
*memFrom,
size_t
size)
{
if
((memTo == NULL) || (memFrom == NULL))
//memTo和memFrom必須有效
return
NULL;
char
*tempFrom = (
char
*)memFrom;
//保存memFrom首地址
char
*tempTo = (
char
*)memTo;
//保存memTo首地址
while
(size -- > 0)
//循環size次,複製memFrom的值到memTo中
*tempTo++ = *tempFrom++ ;
return
memTo;
}
strcpy和memcpy主要有以下3方面的區別。
1、複製的內容不同。strcpy只能複製字符串,而memcpy可以複製任意內容,例如字符數組、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定複製的長度。
3、用途不同。通常在複製字符串時用strcpy,而需要複製其他類型數據時則一般用memcpy -
紅黑樹
二叉排序樹:左邊比根節點小,右邊比根節點大,並且左右子樹都是二叉排序樹在插入序列有序時,會出現退化成鏈表的情況,所以纔要用平衡樹,在插入的時候同時調整這棵樹,讓它的節點儘可能均勻分佈(紅黑樹也是平衡樹的一種,它的複雜的定義和規則,最後都是爲了保證樹的平衡性)
爲什麼要保證樹的平衡?因爲樹的查找性能取決於樹的高度,讓樹儘可能平衡,就是爲了降低樹的高度,java中有一個數據結構底層就是紅黑樹,TreeSet
-
B樹
B樹是一種多路搜索樹,它的每個節點可以擁有多於兩個孩子的節點,M路的B樹最多能擁有M個孩子節點設計成多路,是爲了進一步降低樹的高度,路數越多,樹的高度越低。若設計成無限多路,B樹就退化成一個有序數組了
B樹做文件系統索引比較多,因爲文件系統和數據庫的索引都是存在硬盤上的,並且如果數據量大的話,不一定能一次性加載到內存中(要考慮運行時的內存)
如果一棵樹都無法一次性加載進內存,B樹多路存儲威力就顯現了,可以每次加載B樹的一個結點,然後一步步往下找,
假設內存一次性只能加載2個數,這麼長的有序數組是無法一次性進內存的,我們把它組織爲一棵三路的B樹,這樣每個節點最多有2個數,查找的時候,每次載入一個節點進內存就行。
如果在內存中,紅黑樹比B樹效率更高,但是涉及到磁盤操作,B樹就更優了,B+樹是在B樹的基礎上進行改造,它的數據都在葉子結點,同時葉子結點之間還加了指針形成鏈表。
B+樹之所以這樣設計,是因爲數據庫中select數據,不一定只選一條,很多時候會選多條,比如按照id排序後選10條,對B樹來說需要做局部的中序遍歷,可能要跨層訪問,而B+樹由於所有數據都在葉子結點,不用跨層,同時由於有鏈表結構,只需要找到首尾,通過鏈表就能把所有數據取出來了。
在Mysql中如果只選一個數據,hash更快,但在數據庫中經常會選擇很多條,這時候由於B+樹索引有序,並且又有鏈表相連,它的查詢效率比hash就快很多了,而且數據庫中的索引一般是在磁盤上,數據量大的情況可能無法一次裝入內存,B+樹的設計可以允許數據分批加載,同時樹的高度較低,提高查找效率