php-面试第三篇

42、PHP缓存技术有哪些?1)、全页面静态化缓存2)、页面部分缓存3)、数据缓存4)、查询缓存5)、按内容变更进行缓存6)、内存式缓存7)、apache缓存模块8)、php APC缓存扩展9)、Opcode缓存43、PHP7的新特性有哪些?1),PHP 标量类型与返回值类型声明2),PHP NULL 合并运算符3),PHP 太空船运算符(组合比较符)4),PHP 常量数组5),PHP 匿名类6),PHP Closure::call()7),PHP 过滤 unserialize()8),PHP IntlChar()9),PHP CSPRNG10),PHP 7 异常11),PHP 7 use 语句12),PHP 7 错误处理13),PHP intdiv() 函数14),PHP 7 Session 选项15),PHP 7 废弃特性16),PHP 7 移除的扩展17),PHP 7 移除的 SAPI18),0成本断言44、如何实现商品的无限分类?递归函数的编写。45、什么是匿名函数?匿名函数也叫什么函数?通常在什么情况下使用?php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数。最常用的就是回调函数的参数值。46、PHP 命名空间是为了解决什么问题? 在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题: 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。47、说出几个PHP常用加密码方法?md5,sha1,base64_encode,rsa48、请写一段PHP代码,确保多个进程同时写入同一个文件成功function writeData($filepath, $data) { $fp = fopen($filepath,'a'); do{ usleep(100); }while (!flock($fp, LOCK_EX)); //LOCK_EX 取得独占锁定(写入的程序)进行排它型锁定 获取锁 有锁就写入,没锁就得 $res = fwrite($fp, $data."\n"); flock($fp, LOCK_UN); //LOCK_UN 释放锁定(无论共享或独占)。 fclose($fp); return $res; } 方案二可以借助Redis setnx49、使用两种方法获取一个文件的扩展名。pathinfoparse_url50、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。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; } }51、写出一个能创建多级目录的PHP函数 function createDir($path,$mode) { , if (is_dir($path)) echo "路径已经存在"! else { $re = mkdir($path,$mode,true); if ($re) echo "目录创建成功"; else echo "目录创建失败"; }}$path = /a/b/c/d; $mode = 0777;createDir($path,$mode);52、写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉)

$script=” 以下内容不显示:alert(‘cc’);”;

echo preg_replace(“/].*?>.*?<\/script>/si”, “替换内容”, $script);七、mysql 部分1、优化mysql数据库的方法(至少5种)。1). 为查询缓存优化你的查询2). EXPLAIN 你的 SELECT 查询3). 当只要一行数据时使用 LIMIT 14). 为搜索字段建索引5). 在Join表的时候使用相当类型的例,并将其索引6). 千万不要 ORDER BY RAND()7). 避免 SELECT *8). 永远为每张表设置一个ID9). 使用 ENUM 而不是 VARCHAR10). 从 PROCEDURE ANALYSE() 取得建议11). 尽可能的使用 NOT NULL12). Prepared Statements13). 无缓冲的查询14). 把IP地址存成 UNSIGNED INT15). 固定长度的表会更快16). 垂直分割17). 拆分大的 DELETE 或 INSERT 语句18). 越小的列会越快19). 选择正确的存储引擎20). 使用一个对象关系映射器(Object Relational Mapper)21). 小心“永久链接”2、简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)。索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。3、数据库中的事务是什么?事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。4、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:a)、索引的目的是什么?  1. 快速访问数据表中的特定信息,提高检索速度  2. 创建唯一性索引,保证数据库表中每一行数据的唯一性。  3. 加速表和表之间的连接  4. 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间b)、索引对数据库系统的负面影响是什么?创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。c)、为数据表建立索引的原则有哪些?  1. 在最频繁使用的、用以缩小查询范围的字段上建立索引。  2. 在频繁使用的、需要排序的字段上建立索引d)、什么情况下不宜建立索引?  1. 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。  2. 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。5、简述在MySQL数据库中MyISAM和InnoDB的区别。区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。InnoDB与MyISAM的区别:InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。特点:  ● 行锁设计、支持外键;  ● 支持类似于Oracle风格的一致性非锁定读(即:默认情况下读取操作不会产生锁);  ● InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MySQL4.1版本开始,可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;  ● InnoDB通过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来获得高并发性,并且实现了SQL标准的4种隔离级别(默认为REPEATABLE级别);  ● InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;  ● InnoDB采用了聚集(clustered)的方式来存储表中的数据,每张标的存储都按主键的顺序存放(如果没有显式的在建表时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键);  ● InnoDB表会有三个隐藏字段:除了上面提到了6字节的DB_ROW_ID外,还有6字节的DB_TX_ID(事务ID)和7字节的DB_ROLL_PTR(指向对应回滚段的地址)。这个可以通过innodb monitor看到;MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。特点:  ● 不支持事务,支持表所和全文索引。操作速度快;  ● MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成;MySQL5.0版本开始,MyISAM默认支持256T的单表数据;6、解释MySQL外连接、内连接与自连接的区别。先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。7、写出三种以上MySQL数据库存储引擎的名称。MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎8、Myql中的事务回滚机制概述。事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。9、MySQL的复制原理以及流程。1)在Slave 服务器上执行sart slave命令开启主从复制开关,开始进行主从复制。2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容3)Master服务器接收到来自Slave服务器的IO线程的请求后,二进制转储IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容5)Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点10、drop, delete truncate的区别。三者都是删除的意思,但是三者个有些区别  ● delete和truncate只删除表的数据不删除表的结构  ● 速度 drop > truncate > delete  ● 想删除部分数据时, delete 删除时要带上where语句  ● 保留表而想删除所有的数据时用truncate11、写出数据库的三大范式。第一范式  字段具有原子性,不可再分第二范式  表中的每列都和主键相关第三范式  每列都和主键列直接相关,而不是间接相关12、数据库中的乐观锁和悲观锁。根据不同类型可以对数据设置不同的锁权限** 乐观 悲观 锁 主要是作用在并发访问控制**  ● 悲观锁 假定会发生并发冲突,屏蔽任何违反数据完整的操作  ● 乐观锁 假定不会发生冲突,只有在提交操作时检查是否违反数据的完整性13、什么是存储过程,及其优缺点。存储过程是一些编译好的SQL语句因为系统在调用SQL的时候比较浪费时间,所以之前先将一些基本的额SQL语句代码进行编译(对单表或多表的增删改查),然后再给代码取一个名字,在需要这个功能时去调用它就可以了。优点:1. 运行速度:对于很简单的sql,存储过程没有什么优势。对于复杂的业务逻辑,因为在存储过程创建的时候,数据库已经对其进行了一次解析和优化。存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,所以执行速度会比普通sql快。      2.  减少网络传输:存储过程直接就在数据库服务器上跑,所有的数据访问都在数据库服务器内部进行,不需要传输数据到其它服务器,所以会减少一定的网络传输。但是在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。而且我们的应用服务器通常与数据库是在同一内网,大数据的访问的瓶颈会是硬盘的速度,而不是网速。  3. 可维护性:的存储过程有些时候比程序更容易维护,这是因为可以实时更新DB端的存储过程。  有些bug,直接改存储过程里的业务逻辑,就搞定了。   4. 增强安全性:提高代码安全,防止 SQL注入。这一点sql语句也可以做到。  5. 可扩展性:应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和DBA维护优化。缺点:1. SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。2. 如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。3. 开发调试复杂,由于IDE的问题,存储过程的开发调试要比一般程序困难。    4. 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。5. 不支持群集,数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。总结:1. 适当的使用存储过程,能够提高我们SQL查询的性能,2. 存储过程不应该大规模使用,滥用。3. 随着众多ORM 的出现,存储过程很多优势已经不明显。4. SQL最大的缺点还是SQL语言本身的局限性——SQL本身是一种结构化查询语言,我们不应该用存储过程处理复杂的业务逻辑——让SQL回归它“结构化查询语言”的功用。复杂的业务逻辑,还是交给代码去处理吧。14、Innodb是行锁,那什么时候会产生行锁,什么情况下会变成表锁?一般情况下,innodb只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的,因此,这时候innodb加的就是行锁;但是,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”。 15、大批量插入数据,如何提高insert的性能?有如下方法:1)合并多条 insert 为一条,即: insert into t values(a,b,c),  (d,e,f) ,,,原因分析:主要原因是多条insert合并后日志量(MySQL的binlog和innodb的事务让日志) 减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。2)修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;3)设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;      (备注:innodb_flush_log_at_trx_commit 参数对 InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:    0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file  的刷新或者文件系统到磁盘的刷新操作;    1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;    2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。        )4)手动使用事务  因为mysql默认是autocommit的,这样每插入一条数据,都会进行一次commit;所以,为了减少创建事务的消耗,我们可用手工使用事务,即START TRANSACTION;insert 。。,insert。。 commit;即执行多个insert后再一起提交;一般1000条insert 提交一次。 16、如果发现CPU,或者IO压力很大,怎么定位问题?  1)、首先我会用top命令和iostat命令,定位是什么进程在占用cpu和磁盘io;    2)、如果是mysql的问题,我会登录到数据库,通过show full processlist命令,看现在数据库在执行什么sql语句,是否有语句长时间执行使数据库卡住;  3)、执行show innodb engine status命令,查看数据库是否有锁资源争用;  4)、查看mysql慢查询日志,看是否有慢sql;  5)、找到引起数据库占用资源高的语句,进行优化,该建索引的建索引,索引不合适的删索引,或者根据情况kill掉耗费资源的sql语句等17、innodb有多少种日志?分别是什么。错误日志(error log): log-err查询日志(general  query log): log慢查询日志: -log-slow-queries      二进制日志 (binary log): log-bin中继日志( relay log)18、请列举除mysql外,PHP可以连接的其它关系数据库(至少2个)。sqlserver,postgresql,oracle,db219、写出常用5种数据库函数。concat(),find_in_set(),now(),from_unixtime(),unix_timestamp()20、编写SQL语句:(1)创建一张学生表student,包含学号student_id,姓名studen_name,性别sex,年龄age,家庭住址address,联系电话tel信息?(2)修改学生表结构,增加学历字段?(3)随机插入3条学生信息?(4)查询出年龄小于20岁,学历为本科的所有学员信息?(5)统计所有学生的男女人数?(6)统计学生年龄在15-20,20-25,25-30三个区间的人数分别为多少?八、nosql部分1、使用redis有哪些好处?(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)(2) 支持丰富数据类型,支持string,list,set,sorted set,hash(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除2. redis相比memcached有哪些优势?(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型(2) redis的速度比memcached快很多,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)(3) redis可以持久化其数据3、redis常见性能问题和解决方案?(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内(4) 尽量避免在压力很大的主库上增加从库(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。4、redis的并发竞争问题如何解决?Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:  1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。  2.服务器角度,利用setnx实现锁。  对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。5、redis持久化有几种方式,各有什么优缺点? 1)、快照(snapshots)优点:    RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。    RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。    RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。    RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快缺点:    如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你。 虽然 Redis 允许你设置不同的保存点(save point)来控制保存 RDB 文件的频率, 但是, 因为RDB 文件需要保存整个数据集的状态, 所以它并不是一个轻松的操作。 因此你可能会至少 5 分钟才保存一次 RDB 文件。 在这种情况下, 一旦发生故障停机, 你就可能会丢失好几分钟的数据。    每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时, fork()可能会非常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。 虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失。 2)、AOF优点:    使用 AOF 持久化会让 Redis 变得非常耐久(much more durable):你可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据( fsync 会在后台线程执行,所以主线程可以继续努力地处理命令请求)。    AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题。    Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。    AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。缺点:    对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。    根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。    AOF 在过去曾经发生过这样的 bug : 因为个别命令的原因,导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样。 (举个例子,阻塞命令 BRPOPLPUSH 就曾经引起过这样的 bug 。) 测试套件里为这种情况添加了测试: 它们会自动生成随机的、复杂的数据集, 并通过重新载入这些数据来确保一切正常。 虽然这种 bug 在 AOF 文件中并不常见, 但是对比来说, RDB 几乎是不可能出现这种 bug 的6、mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据? redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰no-enviction(驱逐):禁止驱逐数据7、请列举5种以上redis 最适合的场景。(1)、会话缓存(Session Cache)(2)、全页缓存(FPC)(3)、队列(4),排行榜/计数器(5)、发布/订阅8、Memcache与Redis的区别都有哪些?1)、存储方式Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis有部份存在硬盘上,这样能保证数据的持久性。2)、数据支持类型Memcache对数据类型支持相对简单。Redis有复杂的数据类型。3)、使用底层模型不同它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。4),value大小redis最大可以达到1GB,而memcache只有1MB9、简单的描述一下Memcache的工作原理。Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多对的哈希表。通过key,可以存储或查询任意的数据。

客户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。

举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C:

Client 1想把数据”barbaz”以key “foo”存储。Client 1首先参考节点列表(A, B, C),计算key “foo”的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key “foo”把数据”barbaz”存储进去。  Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。

于是,经过相同的哈希计算(阶段一),Client 2计算出key “foo”在memcached B上,然后它直接请求memcached B,得到数据”barbaz”。

各种客户端在memcached中数据的存储形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的。

最后,从实现的角度看,memcached是一个非阻塞的、基于事件的服务器程序。这种架构可以很好地解决C10K problem ,并具有极佳的可扩展性。

可以参考A Story of Caching ,这篇文章简单解释了客户端与memcached是如何交互的。

10、memcached的cache机制是怎样的?

Memcached主要的cache机制是LRU(最近最少用)算法+超时失效。

当您存数据到memcached中,可以指定该数据在缓存中可以呆多久Which is forever, or some time in the future。

如果memcached的内存不够用了,过期的slabs会优先被替换,接着就轮到最老的未被使用的slabs。

11、memcached最大能存储多大的单个item,为什么?

1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。

12、memcached最大的优势是什么?

Memcached最大的好处就是它带来了极佳的水平可扩展性,特别是在一个巨大的系统中。由于客户端自己做了一次哈希,那么我们很容易增加大量memcached到集群中。memcached之间没有相互通信,因此不会增加 memcached的负载;没有多播协议,不会网络通信量爆炸(implode)。memcached的集群很好用。内存不够了?增加几台 memcached吧;CPU不够用了?再增加几台吧;有多余的内存?在增加几台吧,不要浪费了。

基于memcached的基本原则,可以相当轻松地构建出不同类型的缓存架构。除了这篇FAQ,在其他地方很容易找到详细资料的。

看看下面的几个问题吧,它们在memcached、服务器的local cache和MySQL的query cache之间做了比较。这几个问题会让您有更全面的认识。

13、memcached能接受的key的最大长度是多少?

key的最大长度是250个字符。

需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持”key的前缀”或类似特性,

那么key(前缀+原始key)的最大长度是可以超过250个字符的。

我们推荐使用使用较短的key,因为可以节省内存和带宽。

14、memcached对item的过期时间有什么限制?为什么?

过期时间最大可以达到30天。

memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。

这是一个简单但obscure的机制。

九、服务器架构

1,假设给你5台服务器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV300万左右的中型网站?

1台做负载,2台做应用,2台做数据库主从

十、其它

1:git的使用命令,例如:写出版本回退命令。

git reset --hard head^

2:git与svn的区别。

1) 最核心的区别Git是分布式的,而Svn不是分布的。

2) Git把内容按元数据方式存储,而SVN是按文件:

3) Git没有一个全局版本号,而SVN有:

4) Git的内容的完整性要优于SVN:

5) Git下载下来后,在OffLine状态下可以看到所有的Log,SVN不可以。

6) 分支合并git比svn列少出现错误。

3:如何进行多分支开发,包括多人开发协同,分段测试,上线。

参考:GIT版本管理:Git Flow模型

你可能感兴趣的:(php-面试第三篇)