深信服
最大公约数算法
最小公倍数
堆排序
- 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+树的设计可以允许数据分批加载,同时树的高度较低,提高查找效率