PHP面试题(2021版)

如果你正在寻找PHP开发的工作,那么提前掌握最新的PHP面试题技巧,必然能使你在求职过程中事半功倍。博主还整理了最全面的PHP面试题,包括PHP基础面试题、PHP高级面试题以及PHP常见面试题!

关注微信公众号PHP大神” 回复“面试题”可以免费下载更多php相关面试题 ,整理不易请多关注,如有错误请多包涵哈!

1、__FILE__表示什么意思?

文件的完整路径和文件名。如果用在包含文件中,则返回包含文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径,而在此之前的版本有时会包含一个相对路径。

2、如何获取客户端的IP地址?

$_SERVER[‘REMOTE_ADDR’]

3、写出使用header函数跳转页面的语句

Header(‘location:index.php’);

4、$str是一段html文本,使用正则表达式去除其中的所有js脚本

$pattern = ‘/\.+<\/script>/’;

Preg_replace($pattern,’’,$str);

5、写出将一个数组里的空值去掉的语句

$arr = array(‘’,1,2,3,’’,19);

第一种方法:

$array1 = array('  ',1,'',2,3);

print_r(array_filter($array1, "del"));

function del($var)

{

       return(trim($var));

}

 

第二种方法:

$arr=array("",1,2,3,"");

$ptn="/\S+/i";

print_r(preg_grep($ptn,$arr));

6、写出获取当前时间戳的函数,及打印前一天的时间的方法(格式:年-月-日 时:分:秒)

Time();

Date(“Y-m-d H:i:s”,Strtotime(“-1 day”));

7、写出php进行编码转换的函数

Iconv(‘utf-8’,’gb2312’,$str);

8、$str = “1,3,5,7,9,10,20”,使用什么函数可以把字符串str转化为包含各个数字的数组?

$arr = explode(“,”,$str);

9、serialize() /unserialize()函数的作用

serialize()和unserialize()在php手册上的解释是:
serialize — 产生一个可存储的值的表示,返回值为字符串,此字符串包含了表示 value 的字节流,不丢失其类型和结构,可以存储于任何地方。
unserialize — 从已存储的表示中创建 PHP 的值
具体用法:

$arr = array(“测试1″,”测试2″,”测试3″);//数组

$sarr = serialize($arr);//产生一个可存储的值(用于存储)

//用任意方法(例如:你要是吧$sarr存在一个文本文件中你就可以用file_get_contents取得)得到存储的值保存在$newarr中;

$unsarr=unserialize($newarr);//从已存储的表示中创建 PHP 的值

10、写出一个函数,参数为年份和月份,输出结果为指定月的天数

Function day_count($year,$month){

Echo date(“t”,strtotime($year.”-”.$month.”-1”));

}

11、一个文件的路径为/wwwroot/include/page.class.php,写出获得该文件扩展名的方法

$arr = pathinfo(“/wwwroot/include/page.class.php”);

$str = substr($arr[‘basename’],strrpos($arr[‘basename’],’.’));

12、你使用过哪种PHP的模板引擎?

Smarty,thinkphp自带的模板引擎

13、请简单写一个类,实例化这个类,并写出调用该类的属性和方法的语句

Class myclass{

Public $aaa;

Public $bbb;

Public function myfun(){

Echo “this is my function”;

}

}

$myclass = new myclass();

$myclass->$aaa;

$myclass->myfun();

 

 

14、本地mysql数据库db_test里已建有表friend,数据库的连接用户为root,密码为123。friend表字段为:id,name,age,gender,phone,email,请使用php连接mysql,选择出friend表里age > 20的所有记录打印结果,并统计出查询出的结果总数。

 

$link = Mysql_connect(“localhost”,”root”,”123”) or die(“数据库连接失败!”);

Mysql_select_db(“db_test”,$link) or die(“选择数据库失败!”);

$sql = “select id,name,age,gender,phone,email from friend where age>20”;

$result = mysql_query($sql);

$count = mysql_num_rows($result);

While($row = mysql_fetch_assoc($result)){

Echo $row[‘id’];

….

}

 

15、以下有两个表

user表 字段id (int),name (varchar)
score表 字段uid (int),subject (varchar) ,score (int)
score表的uid字段与user表的id字段关联
要求写出以下的sql语句
1)在user表里新插入一条记录,在score表里插入与新加入的记录关联的两条记录
2)获取score表里uid为2的用户score最高的5条记录
3)使用联合查询获取name为“张三”的用户的总分数
4)删除name为“李四”的用户,包括分数记录
5)清空score表
6)删除user表

 

1). mysql_query(“insert into user(name) values(‘test’)”);

$id = mysql_insert_id();

Mysql_query(“insert into score(uid,subjext,score) values(“.$id.”,’english’,’99’)”);

2).$sql = select uid,sunjext,score from score where uid=2 order by score desc limit 0,5;

3).select s.score from score s RIGHT JOIN user u ON u.id=s.uid where u.name=’张三;

4).delete from score where uid in(select id from user where name=’李四’);

Delete from user where name=’李四’;

5).delete from score;

6).drop table user;

 

16. 什么是面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

17. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
2、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。
禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

18. HTTP 状态中302、403、 500代码含义?

一二三四五原则: 一. 消息系列 二 成功系列 三. 重定向系列 四. 请求错误系列 五. 服务器端错误系列
302:临时转移成功,请求的内容已转移到新位置 403:禁止访问 500:服务器内部错误 401代表未授权。

19. Linux 下建立压缩包,解压缩包的命令

Tar.gz:
打包: tar czf file.tar.gz file.txt
解压: tar xzf file.tar.gz
Bz2:
打包: bzip2 [-k] 文件
解压: bunzip2 [-k] 文件
Gzip(只对文件,不保留原文件)
打包: gzip file1.txt
解压: gunzip file1.txt.gz
Zip: -r 对目录
打包: zip file1.zip file1.txt
解压: unzip file1.zip

20. 请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?

Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型 Varchar 与char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。 Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

21. MyISAM 和 InnoDB 的基本区别?索引结构如何实现?

MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。

创建索引:alert table tablename add index (`字段名`)

22. 不使用cookie向客户端发送一个cookie.

理解:session_start()开启时,生成一个常量 SID,当COOKIE开启时,这个常量为空,当COOKIE关闭时,这个常量中存储了PHPSESSID的值。通过在URL后加一个SID参数来传递SESSIONID的值,从而使客户端页面可以使用SESSION里面的值。 当客户端开启COOKIE和服务器端开启SESSION时。 浏览器第一次请求,服务器会向浏览器端发送一个COOKIE里面存储SESSIONID. 当浏览器第二次请求时,会把已存在

23. isset() 和 empty() 区别

Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。

24. 写出匹配URL的正则表达式.

‘/^(https?|ftps?):\/\/(www)\.([^\.\/]+)\.(com|cn|org)(\/[\w-\.\/\?\%\&\=]*)?/i’

25.请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。

常见的排序算法: 冒泡排序法、快速排序法、简单选择排序法、堆排序法、直接插入排序法、希尔排序法、合并排序法。
冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就象气泡在水中向上浮一样,所以该算法也称为气泡排序法。

 

// 冒泡排序法

Function mysort($arr){

 For($i=0; $i
  For($j=0; $j
   If($arr[$j] > $arr[$j+1]){

    $tmp=$arr[$j];

    $arr[$j]=$arr[$j+1];

    $arr[$j+1]=$tmp;

            }

        }

    }

 Return $arr;

}

$arr=array(3,2,1);

print_r(mysort($arr));

 

26.请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?

按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

27.请用正则表达式(Regular Expression)写一个函数验证电子邮件的格式是否正确。

 

if(isset($_POST['action']) && $_POST['action']==’submitted’){

 $email=$_POST['email'];

 if(!preg_match(“/^[0-9a-zA-Z-]+@[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+){1,3}$/”,$email)){

  echo “电子邮件检测失败”;

 }else{

  echo “电子邮件检测成功”;

 }

}

 

28.使用PHP描述快速排序算法,对象可以是一个数组吗?

原理:快速排序使用分治策略来把待排序数据序列分为两个子序列,具体步骤为:
(1)从数列中挑出一个元素,称该元素为“基准”。
(2)扫描一遍数列,将所有比“基准”小的元素排在基准前面,所有比“基准”大的元素排在基准后面。
(3)通过递归,将各子序列划分为更小的序列,直到把小于基准值元素的子数列和大于基准值元素的子数列排序。

 

//快速排序(数组排序)

function QuickSort($arr){

 $num = count($arr);

 $l=$r=0;

 for($i=1;$i<$num;$i++){

  if($arr[$i] < $arr[0]){

   $left[] = $arr[$i];

   $l++;

  }else{

   $right[] = $arr[$i];

   $r++;

  }

 }

 if($l > 1){

  $left = QuickSort($left);

 }

 $new_arr = $left;

 $new_arr[] = $arr[0];

 if($r > 1){

  $right = QuickSort($right);

 }

 for($i=0;$i<$r;$i++){

  $new_arr[] = $right[$i];

 }

 return $new_arr;

}

 

使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

 

//二分查找(数组里查找某个元素)

function bin_sch($array, $low, $high, $k){

 if ($low <= $high){

  $mid = intval(($low+$high)/2);

  if ($array[$mid] == $k){

   return $mid;

  }elseif ($k < $array[$mid]){

   return bin_sch($array, $low, $mid-1, $k);

  }else{

   return bin_sch($array, $mid+1, $high, $k);

  }

 }

 return -1;

}

//顺序查找(数组里查找某个元素)

function seq_sch($array, $n, $k){

 $array[$n] = $k;

 for($i=0; $i<$n; $i++){

  if($array[$i]==$k){

   break;

  }

 }

 if ($i<$n){

  return $i;

 }else{

  return -1;

 }

}

 

29.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数(array_multisort())

 

//二维数组排序, $arr是数据,$keys是排序的健值,$order是排序规则,1是升序,0是降序

function array_sort($arr, $keys, $order=0) {

 if (!is_array($arr)) {

  return false;

 }

 $keysvalue = array();

 foreach($arr as $key => $val) {

  $keysvalue[$key] = $val[$keys];

 }

 if($order == 0){

  asort($keysvalue);

 }else {

  arsort($keysvalue);

 }

 reset($keysvalue);

 foreach($keysvalue as $key => $vals) {

  $keysort[$key] = $key;

 }

 $new_array = array();

 foreach($keysort as $key => $val) {

  $new_array[$key] = $arr[$val];

 }

 return $new_array;

}

 

30.windows平台, Apache Http Server启动失败, 排错思路是什么?

检查apache使用的80端口是否被占用,如果被占用,先停止占用80端口的服务,然后启动apache服务器

31.PHP session扩展默认将session数据储存在哪里? D

 

A) SQLite Database

B) MySQL Database

C) Shared Memory

D) File System

E) Session Server

32.如果你想要自动加载类,下面哪种函数声明是正确的 C

A) function autoload($class_name)

B) function __autoload($class_name, $file)

C) function __autoload($class_name)

D) function _autoload($class_name)

E) function autoload($class_name, $file)

33.PHP程序使用utf-8编码, 以下程序输出结果是什么? B

$str = ’hello你好世界’;

echo strlen($str);

?>
A) 9
B) 13(gbk)
C) 18
D) 17(utf8)

34.你所知道的php数组相关的函数?

array()----创建数组

array_combine()----通过合并两个数组来创建一个新数组

range()----创建并返回一个包含指定范围的元素的数组

compact()----建立一个数组

array_chunk()----将一个数组分割成多个

array_merge()----把两个或多个数组合并成一个数组

array_slice()----在数组中根据条件取出一段值

array_diff()----返回两个数组的差集数组

array_intersect()----计算数组的交集

array_search()----在数组中搜索给定的值

array_splice()----移除数组的一部分且替代它

array_key_exists()----判断某个数组中是否存在指定的key

shuffle()----把数组中的元素按随机顺序重新排列

array_flip()----交换数组中的键和值

array_reverse()----将原数组中的元素顺序翻转,创建新的数组并返回

array_unique()----移除数组中重复的值

35.php读取文件内容的几种方法和函数?

打开文件,然后读取。Fopen() fread()
打开读取一次完成 file_get_contents()

36.说说你对缓存技术的了解?

缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
使用memcache可以做缓存。

37.你所知道的设计模式有哪些?

工厂模式、策略模式、单元素模式、观察者模式、命令链模式

38.说说你对代码管理的了解? 常使用那些代码版本控制软件?

通常一个项目是由一个团队去开发,每个人将自己写好的代码提交到版本服务器,由项目负责人按照版本进行管理,方便版本的控制,提高开发效率,保证需要时可以回到旧版本。
常用的版本控制器:SVN

39.说说你对SVN的了解?简述优缺点?

SVN是一种版本控制器,程序员开发的代码递交到版本服务器进行集中管理。
SVN的优点:代码进行集中管理,版本控制容易,操作比较简单,权限控制方便。
缺点:不能随意修改服务器项目文件夹。

40.你常用到的mysql命令?

Show databases

Show tables

Insert into 表名() values()

Update 表名 set 字段=值 where ...

Delete from 表名 where ...

Select * from 表名 where 条件 order by ... Desc/asc limit ... Group by ... Having ...

41. 简述Cookie的设置及获取过程

设置COOKIE的值:
Setcookie(名称,值,保存时间,有效域);
获取值:$_COOKIE['名称'];

42.对于大流量的网站,你采用什么样的方法来解决访问量问题?

优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:
1)确定当前服务器设备是否满足流量需求。
2)使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
3)禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
4)控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
5)使用不同的主机分流主要流量,使服务器均衡负载。
6)使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

43.mysql_fetch_row() 和mysql_fetch_array之间有什么区别?

Mysql_fetch_row()是从结果集中取出一行作为枚举数组,mysql_fetch_array()是从结果集中取出一行作为索引数组或关联数组或两种方式都有。

44.用PHP写出显示客户端IP与服务器IP的代码

获取客户端IP:$_SERVER(“REMOTE_ADDR”);
获取服务器端IP:$_SERVER["SERVER_ADDR"];

45.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

 

function my_scandir($dir){

     $files = array();

     if ( $handle = opendir($dir) ){

         while ( ($file = readdir($handle)) !== false ) {

             if ( $file != ".." && $file != "." ) {

             if ( is_dir($dir . "/" . $file) ) {

                     $files[$file] = scandir($dir . "/" . $file);

                 }else {

                     $files[] = $file;

                 }

             }

         }

         closedir($handle);

         return $files;

     }

}

46.数据库索引有几类,分别是什么?什么时候该用索引?

普通索引、主键索引、唯一索引
并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。

47.$_REQUEST、$_POST、$_GET、$_COOKIE、$_SESSION、$_FILES的意思是什么?

它们都是PHP预定义变量

$_REQUEST用来获取post或get方式提交的值

$_POST用来获取post方式提交的值

$_GET用来获取get方式提交的值

$_COOKIE用来获取cookie存储的值

$_SESSION用来获取session存储的值

$_FILES用来获取上传文件表单的值

48.框架中什么是单一入口和多入口,单一入口的优缺点?

1)多入口就是通过访问不同的文件来完成用户请求。
单一入口指web程序所有的请求都指向一个脚本文件的。
2)单一入口更容易控制权限,方便对http请求可以进行安全性检查。
缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。

49.如何快速下载一个远程http服务器上的图片文件到本地?

 

$file=”";

$fp=fopen($file,’rb’);

$img=fread($fp,10000);

$dir=”./”;

$local=fopen($dir.’/’.basename($file),’w');

Fwrite($local,$img);

50.了解XSS攻击吗? 如何防止 ?

XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。

51.SQL注入漏洞产生的原因 ? 如何防止?

SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入:
1)开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置
2)执行sql语句时使用addslashes进行sql语句转换
3)Sql语句书写尽量不要省略小引号和单引号
4)过滤掉sql语句中的一些关键字:update、insert、delete、select、*
5)提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
6)Php配置文件中设置register_globals为off,关闭全局变量注册
7)控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。

52.在PHP中error_reporting这个函数有什么作用?

error_reporting() 设置 PHP 的报错级别并返回当前级别。

53.smarty是什么,有什么作用?

回答一:smarty是用php写出来的模板引擎,也是目前业界最著名的php模板引擎之一
它分离了逻辑代码和外在的显示,提供了一种易于管理和使用的方法,用来将混杂的php逻辑代码与html代码进行分离
回答二:smarty是php中最著名的引擎框架之一,我们公司使用的是TP框架,已经封装好了smarty模板,所以没有单独使用过
回答三: smarty是个模板引擎,最显著的地方就是有可以把模板缓存起来。一般模板来说,都是做一个静态页面,然后在里面把一些动态的部分用一切分隔符切开,然后在PHP里打开这个模板文件,把分隔符里面的值替换掉,然后输出来,你可以看下PHPLib里面的template部分。
而smarty设定了缓存参数以后,第一次运行时候会把模板打开,在php替换里面值的时候把读取的html和php部分重新生成一个临时的php文件,这样就省去了每次打开都重新读取html了。如果修改了模板,只要重新刷下就行了。

54.TP的特性有哪些?

1).多表查询非常方便,在model中几句代码就可以完成对多表的关联操作
2).融合了smarty模板,使前后台分离
3).支持多种缓存技术,尤其对memcache技术支持非常好
4).命名规范,模型,视图,控制器严格遵循命名规则,通过命名一一对应
5).支持多种url模式
6).内置ajax返回方法,包括xml,json,html等
7).支持应用扩展,类库扩展,驱动扩展等

55.TP框架中的大字母函数?

U:对url的组装
A:内部实例化控制器
S:缓存处理
R:调用某个控制器的操作方法
D:实例化自定义模型类
M:实例化基础模型类
I:获取参数
L:设置或者获取当前语言
C:设置或获取,保存配置

56.laravel有那些特点?

回答一:

1).强大的rest router:用简单的回调函数就可以调用,快速绑定controller和router
2).artisan:命令行工具,很多手动的工作都自动化
3).可继承的模板,简化view的开发和管理
4).blade模板:渲染速度更快
5).ORM操作数据库
6).migration:管理数据库和版本控制
7).测试功能也很强大
8).composer也是亮点

回答二: laravel框架引入了门面,依赖注入,Ioc模式,以及各种各样的设计模式等

57.如何解决异常处理?

答: 抛出异常:使用try…catch,异常的代码放在try代码块内,如果没有触发异常,则代码继续执行,如果异常被触发,就会 抛出一个异常。Catch代码块捕获异常,并创建一个包含异常信息的对象。$e->getMessage(),输出异常的错误信息。
解决异常:使用set_error_handler函数获取异常(也可以使用try()和catch()函数),然后使用set_exception_handler()函数设置默认的异常处理程序,register_shutdown_function()函数来执行,执行机制是,php要把调入的函数调入到内存,当页面所有的php语句都执行完成时,再调用此函数

58.redis消息队列先进先出需要注意什么?

答:通常使用一个list来实现队列操作,这样有一个小限制,所以的任务统一都是先进先出,如果想优先处理某个任务就不太好处理了,这就需要让队列有优先级的概念,我们就可以优先处理高级别的任务,实现方式有以下几种方式:
1)单一列表实现:队列正常的操作是 左进右出(lpush,rpop)为了先处理高优先级任务,在遇到高级别任务时,可以直接插队,直接放入队列头部(rpush),这样,从队列头部(右侧)获取任务时,取到的就是高优先级的任务(rpop)
2)使用两个队列,一个普通队列,一个高级队列,针对任务的级别放入不同的队列,获取任务时也很简单,redis的BRPOP命令可以按顺序从多个队列中取值,BRPOP会按照给出的 key 顺序查看,并在找到的第一个非空 list 的尾部弹出一个元素,redis> BRPOP list1 list2 0

list1 做为高优先级任务队列
list2 做为普通任务队列
这样就实现了先处理高优先级任务,当没有高优先级任务时,就去获取普通任务
方式1最简单,但实际应用比较局限,方式3可以实现复杂优先级,但实现比较复杂,不利于维护
方式2是推荐用法,实际应用最为合适

59.数组内置的排序方法有哪些?

sort($array); //数组升序排序
rsort($array); //数组降序排序
asort($array);  //根据值,以升序对关联数组进行排序
ksort($array);  //根据建,以升序对关联数组进行排序
arsort($array);   //根据值,以降序对关联数组进行排序
krsort($array);  // 根据键,以降序对关联数组进行排序

60.redis 和 memache 缓存的区别

总结一:
1).数据类型
Redis数据类型丰富,支持set list等类型
memcache支持简单数据类型,需要客户端自己处理复杂对象
2).持久性
redis支持数据落地持久化存储
memcache不支持数据持久存储
3).分布式存储
redis支持master-slave复制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
4).数据一致性不同
redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作
5).cpu利用
redis单线程模型只能使用一个cpu,可以开启多个redis进程
总结二:
1).Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2).Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3).Redis支持数据的备份,即master-slave模式的数据备份。
4).Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存
总结三:
redis和memecache的不同在于:
1)、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
2)、数据支持类型:
redis在数据支持上要比memecache多的多。
3)、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4)、运行环境不同:
redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
memcache只能当做缓存,cache
redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave

未完待续~~~~~~

题型还有很多,希望大家在学习过程中,慢慢的去发现和慢慢的提升自己的学习技能,最后祝大家学习愉快,找到最适合自己的工作!

有需要的还可以关注微信公众号“PHP大神”回复“面试题”即可免费下载更多面试题

image.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值