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

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

一、什么是Memcache?
二、Memcache有什么特征?
三、Memcache的内存管理机制是什么样的?
四、Memcache和Memcached有什么区别?
五、如何操作Memcache?
六、如何使用Memcache做Session共享?
七、什么是Redis?
八、如何使用Redis?
九、使用Redis需要注意哪些问题?
十、Memcache和Redis常考的面试题

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



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


一、什么是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移除旧数据,放入这个新数据。


二、Memcache有什么特征?

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


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

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


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


四、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交互带给网络的


五、如何操作Memcache?

Memcached的操作命令可以分为存储命令、查找命令、统计命令等三大类。
第一类,Memcached的存储命令:

第二类,Memcached的查找命令:

第三类,Memcached的统计命令:

使用示例代码参考:

<?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的值
?>

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


六、如何使用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程序员面试笔试宝典》书籍,该书已在天猫京东当当等电商平台销售。

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

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

原文地址:https://www.cnblogs.com/leoyi330/p/10400284.html

时间: 2024-10-18 11:24:20

PHP面试常考内容之Memcache和Redis(1)的相关文章

计算机网络面试常考总结(二)

目录 简述DNS域名系统及其工作原理. 简述HTTP协议及其工作原理. HTTP报文的格式? HTTP请求报文中的方法有哪些? http1.1和http2.0的区别? http的返回码以及代表的意思? 简述https.https与http的区别? IP数据报格式? TCP数据报格式? UDP数据报格式? 以太网MAC帧格式? 怎么判断两台主机是否连接好? 简述RIP及其工作原理. 简述OSPF及其工作原理. 简述BGP及其工作原理. 写在最前面:本文章所有内容是本人从网络上以及<计算机网络第七版

Java面试常考到的东东

1.super与this的区别? super是我们在子类中想使用被子类隐藏的父类的成员变量或方法时,可以使用的关键字. this出现在类的实例方法中,代表使用该方法的当前对象.也可以出现在类的构造方法中,代表使用该构造方法所创建的对象. this()代表当前类对象,super()代表父类对象. 表示在子类访问父类的成员和行为,必须受到类继承规则的约束. 在子类的构造函数中,如果第一行没有写super(),编译器会自动插入.但是如果父类没有不带参数的构造函数,或这个构造函数被私有化了,此时必须加入

面试常考数据结构与算法

数据结构部分: 1.数组和链表的区别.(很简单,但是很常考,记得要回答全面) C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小.而在实际应用中,用户使用数组之前无法确定数组的大小,只能够将数组定义成足够大小,这样数组的空间可能不被使用,从而造成内存空间的浪费.链表是一种常见的数据组织形式,他采用动态分配内存的形式实现.需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费. 从逻辑结构上来看

HTTP协议详解(前端面试常考知识点)

分类:杂谈| 发布:佚名| 查看:70 | 发表时间:2014-2-17 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出.HTTP协议的主要特点可概括如下:1.支持客户/服务器模式.2.简单快速:客户向服务器请

面试常考HTTP协议知识点

协议简介 1. 应用层协议, 一般以TCP为基础,数据收发通过TCP实现: 2. 一次性连接.服务器与客户端的每次连接只处理一个请求,下次请求重新建立连接: 3. 无状态协议.服务器不保留与客户交易时的状态,减轻记忆负担,较快响应速度: 4. 默认端口号80,常用请求方法GET/POST: 工作过程 1. 客户与服务端建立连接:(基于TCP的连接) 2. 客户发起请求:(各种方法) 3. 服务器接受请求,返回相应资源: 4. 客户与服务器断开连接. 协议格式 GET/POST 请求的URL HT

Linux命令面试常考的简单汇总

1.显示日期与时间的命令:date 2.显示日历的命令:cal 3.简单好用的计算器:bc 4.热键“命令补全或文件补齐”:Tab 5.热键“中断目前程序”:Ctrl+C 6.热键“键盘输入结束(End of File)相当与输入exit”:Ctrl+D 7.在线求助:man [command]或 info [command],按q退出 8.数据同步写入磁盘:sync 9.关机命令:shutdown -h [now | 10(分钟) | 20:25] 10.重启命令:reboot 11.改变文件

Java面试常考知识点

1.  什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译.Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性. 2.  JDK和JRE的区别是什么? Java运行时环境(JRE)是将要执行Java程序的Java虚拟机.它同时也包含了执行app

[面试常考]排序算法总结

排序在各次面试的过程中问道的次数不少,冒泡排序和快速排序尤多.因此做一些总结,尤其是代码部分. 1. 冒泡排序 (1)思想 在一组数中,对当前未排好序的数,自上而下地对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的数往上冒. (2)复杂度 平均情况-O(n^2) 最坏情况-O(n^2)(逆序有序) 最好情况-O(n)(正序有序) 空间复杂度-O(1) (3)稳定性 稳定 (4)伪码 bubblesort(A) { for i=1 to length[A] // 排序的趟数 { for

面试常考各类排序算法总结.(c#)

一. 面试以及考试过程中必会出现一道排序算法面试题,为了加深对排序算法的理解,在此我对各种排序算法做个总结归纳. 1.冒泡排序算法(BubbleSort) 1 public Class SortDemo 2 { 3 public void BubbleSort(int arr) 4 { 5 int temp=0; 6 //需要走arr.Length-1 趟 7 for(int i=0;i<arr.Length-1;i++) 8 { 9 //每一趟需要比较次数 10 for(int j=0,j<