PHP面试常考内容之Memcache和Redis(1)

你好,是我琉忆。
继上周(2019.2-11至2-15)发布的“PHP面试常考内容之面向对象”专题后,发布的第二个专题,感谢你的阅读。
本周(2019.2-18至2-22)的文章内容点为如下几点,更新时间为每周一三五,能够关注本栏持续关注,感谢你的支持。php

1、什么是Memcache?
2、Memcache有什么特征?
3、Memcache的内存管理机制是什么样的?
4、Memcache和Memcached有什么区别?
5、如何操做Memcache?
6、如何使用Memcache作Session共享?
7、什么是Redis?
8、如何使用Redis?
9、使用Redis须要注意哪些问题?
10、Memcache和Redis常考的面试题

本章节的内容将会被分为三篇文章进行讲解完整块内容,第一篇主要讲解一到六,第二篇主要讲解七到九,第三篇围绕第十点。html


如下正文的部份内容来自《PHP程序员面试笔试宝典》书籍,若是转载请保留出处:程序员


1、什么是Memcache?

Memcache是一个开源、免费、高性能的分布式对象缓存系统,它基于一个存储键/值对的hashmap来存储数据到内存中。它的做用是减小对数据库的读取以提升Web应用的性能。虽然它的守护进程(daemon )是用 C语言实现的,可是客户端能够用任何语言来编写,并经过Memcache协议与守护进程通讯。须要注意的是,当某个服务器中止运行或崩溃了,全部存放在该服务器上的键/值对都将丢失。Memcache的服务器端没有提供分布式功能,各个Memcache应用不会互相通讯以共享信息。想要实现分布式通讯,能够搭建几个Memcache应用,经过算法实现此效果。
下面介绍Memcache的两个重要概念。slab:为了防止内存碎片化,Memcache服务器端会预先将数据空间划分为一系列slab;举个例子,如今有一个100m3的房间,为了合理规划这个房间放置东西,会在这个房间里放置30个1m3的盒子、20个1.25m3的盒子、15个1.5m3的盒子……这些盒子就是slab。
LRU:最近最少使用算法;当同一个slab的格子满了,这时须要新加一个值时,不会考虑将这个新数据放到比当前slat更大的空闲slab,而是使用LRU移除旧数据,放入这个新数据。web


2、Memcache有什么特征?

Memcache的特征以下:
1)协议简单。
2)基于libevent的事件处理。
3)内置内存存储方式。
4)Memcached不互相通讯的分布式。
Memcache的特性以下:
(1)单个item 最大的数据为1MB。
(2)单进程最大的使用内存为2GB,须要更多内存时可开多个端口。
(3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。
(4)键长最大为250字节。面试


3、Memcache的内存管理机制是什么样的?

Memcache将内存分割成各类尺寸的块(chunk),并把尺寸相同的块分红组(chunk的集合)。page是分配给slab的内存空间,默认是1MB,根据slab大小切分红chunk,chunk是用户缓存记录的内存空间,slab class是特定chunk的组。
在存储数据时,Memcache会压缩数据的大小进行存储,通常压缩后的数据为原数据大小的30%左右,从而节省了70%的传输性能消耗。若是存储的数是小于100字节的键值对,那么压缩后可能带来膨胀,但Memcache都是按照固定大小分块存储的,最小也有88B,因此小数据带来的压缩膨胀也并不会有什么影响。
具体流程以下图所示。算法

clipboard.png

本身整理了一篇“ 如何解决Memcache的缓存雪崩现象?”的文章,关注公众号:“ 琉忆编程库”,回复:“ me”,我发给你。

4、Memcache和Memcached有什么区别?

其实 memcache 和 memcached 说的是 PHP 的扩展。
Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。它能够应对任意多个链接,使用非阻塞的网络IO。因为它的工做机制是在内存中开辟一块空间,而后创建一个Hash表,Memcached自管理这些Hash表。
Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d能够理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接受客户端的链接操做,使用共享内存存取数据。
Memcached处理的原子是每个(key,value)对(如下简称kv对),key会经过一个hash算法转化成hash-key,便于查找、对比以及作到尽量的散列。同时,memcached用的是一个二级散列,经过一张大hash表来维护。
Memcached有两个核心组件组成:服务端(Server)和客户端(Client),在一个memcached的查询中,Client先通 过计算key的hash值来肯定kv对所处在的Server位置。当Server肯定后,客户端就会发送一个查询请求给对应的Server,让它来查找确 切的数据。由于这之间没有交互以及多播协议,因此 memcached交互带给网络的数据库


5、如何操做Memcache?

Memcached的操做命令能够分为存储命令、查找命令、统计命令等三大类。
第一类,Memcached的存储命令:编程

clipboard.png

第二类,Memcached的查找命令:segmentfault

clipboard.png

第三类,Memcached的统计命令:缓存

clipboard.png

使用示例代码参考:

<?php
    $m = new Memcached(); 
    $m->addServer("127.0.0.1",11211); //链接Memcache服务器
    $m->set("mkey","123",600);//设置一个键名为mkey,值为123,600s过时,0为永久有效
    echo $m->get("mkey");//输出123,get能够获取键名为mkey的值
    $m->delete("mkey");//删除键名为mkey的值
?>

具体所有的使用方法不在此一一罗列,可根据上面的方法表和参考示例进行模仿使用。


6、如何使用Memcache作Session共享?

默认状态下,PHP使用文件方式作Session存储,磁盘的I/O性能确定没有内存中存取快,所以改用memcache来存储Session在读写速度上会快不少,并且在多台服务器集群时,使用memcahced可以有效地解决Session共享的问题。
咱们配置好memcached服务器后,修改php.ini配置文件的代码:

session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211”

也可使用在网站目录下放置Apache的.htaccess文件:

php_value session.save_handler “memcache”
php_value session.save_path “tcp://127.0.0.1:11211”

执行PHP脚本时写入如下两行:

ini_set(“session.save_handler”,”memcache”);
ini_set(“session.save_path”,”tcp://127.0.0.1:11211”);

能够在使用多个memcached服务器时用都好隔开,还能够额外带参数:persistent、weight、timeout、retry_interval等。例如:

$session_save_path = “tcp://<memcache_server1>:11211?persistent=1&weight=1&timeout=1&retry_interval=15,udp://<memcache_server2>:11211”;

若是想使用udp支持,须要确保你的memcached服务器启用,也确保Web服务器链接到memcache服务器端口正常。从新启动Apache后,将开始使用的memcache存储PHP的Session。
测试案例:

<?php
    Session_start();
    $_SESSION[‘test’] = time();
    echo $_SESSION[‘test’].”<br>”;
    echo session_id();
?>

测试memcache是否已存储成功,经过sessionid去取对应的数据:

$m = memcache_connect(‘localhost’,11211);
echo $m->get(“13765595df9dsa8f9dsa8fa9sf8saf865”);

获得结果:

17559898989

若是使用memcached做为Session存储,要确保memcached的服务正常工做,不然Session相关功能将不起做用,这样PHP的处理就多了一层外面的依赖。由于memcached是使用内存的,这样当用户量比较大时,就可能因为内存方面缘由致使Session时长上的问题,Session的实际失效时长达不到设定的失效时长(由memcached在内存不够时的处理机制决定)。

Memcache可扩展考察的内容有不少,因为整理的篇幅内容不少,在此只是罗列了广泛遇到的Memcache相关的知识考点。额外的考点还有:
(1)Memcache的工做流程是什么样的?
(2)Memcache如何实现分布式?
(3)Memcache的分布式算法有哪些?
(4)使用Memcache有哪些技术限制?
(5)Memcache和Redis有什么相同和区别的地方?

更多相关面试知识点能够阅读《PHP程序员面试笔试宝典》


预告:PHP面试常考内容之Memcache和Redis(2)将于本周三(2019.2-20)更新。
以上内容摘自《PHP程序员面试笔试宝典》书籍,该书已在天猫京东当当等电商平台销售。

clipboard.png

更多PHP相关的面试知识、考题能够关注公众号获取:琉忆编程库

clipboard.png

对本文有什么问题或建议均可以进行留言,我将不断完善追求极致,感谢大家的支持。

相关文章
相关标签/搜索