你好,是我琉忆。
继上周(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相关的面试知识、考题可以关注公众号获取:琉忆编程库

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

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

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

    你好,是我琉忆.继周一(2019.2-18)发布的"PHP面试常考内容之Memcache和Redis(1)"后,这是第二篇,感谢你的支持和阅读.本周(2019.2-18至2-22) ...

  2. PHP面试常考内容之面向对象(3)

    PHP面试专栏正式起更,每周一.三.五更新,提供最好最优质的PHP面试内容.继上一篇"PHP面试常考内容之面向对象(2)"发表后,今天更新面向对象的最后一篇(3).需要(1),(2 ...

  3. PHP面试常考内容之面向对象(2)

    PHP面试专栏正式起更,每周一.三.五更新,提供最好最优质的PHP面试内容.继上一篇"PHP面试常考内容之面向对象(1)"发表后,今天更新(2),需要(1)的可以直接点击文字进行跳 ...

  4. PHP面试常考内容之面向对象(1)

    PHP中面向对象常考的知识点有以下几点,我将会从以下几点进行详细介绍说明,帮助你更好的应对PHP面试常考的面向对象相关的知识点和考题. 整个面向对象文章的结构涉及的内容模块有: 一.面向对象与面向过程 ...

  5. PHP面试常考之会话控制

    你好,是我琉忆,欢迎您来到PHP面试专栏.本周(2019.2-25至3-1)的一三五更新的文章如下: 周一:PHP面试常考之会话控制周三:PHP面试常考之网络协议周五:PHP面试常考题之会话控制和网络 ...

  6. 前端面试常考知识点---CSS

    前端面试常考知识点---js 1.CSS3的新特性有哪些 点我查看 CSS3选择器 . CSS3边框与圆角 CSS3圆角border-radius:属性值由两个参数值构成: value1 / valu ...

  7. 面试常考的常用数据结构与算法(zz)

    数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...

  8. JAVA中值类型和引用类型的不同(面试常考)

    转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...

  9. Java面试常考知识点

    1.  什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Jav ...

随机推荐

  1. CentOS7中安装pip的方法

    1.安装epel-release [root@localhost ~]# yum -y install epel-release 2.安装python-pip [root@localhost ~]# ...

  2. mysql 连接表 内连接 inner

    字段去重  关键字distinct 去除重复记录 可配合分组函数使用 select distinct job,deptno from emp; 未使用 distinct之前 使用后: 笛卡尔积现象:当 ...

  3. SYCOJ2197三角形游戏

    题目-三角形游戏 (shiyancang.cn) 对于任意的一个数字,把他拆分为n个数字,使得其逐层和为该数字. 首先n很小,所以很可能是搜索.DFS,n回选择. #include<bits/s ...

  4. fis学习

    http://fis.baidu.com/docs/beginning/getting-started.html#md5 还是喜欢时间戳?没问题,FIS也可以满足你的需求,点击这里

  5. Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  6. Git 基本操作指南

    Git 基本操作指南 内容概要 这个作业属于哪个课程 2022面向对象程序设计 这个作业要求在哪里 2022面向对象程序设计寒假作业1 这个作业的目标 Git & Github 作业正文 如下 ...

  7. GIL全局解释器锁、死锁现象、python多线程的用处、进程池与线程池理论

    昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...

  8. How to mount Windows network disk in WSL

    Backgroud Mount samba directly in wsl like linux is difficult Password for root@//filesystem.domain/ ...

  9. 利用SelectPdf插件将网页生成PDF

    简介 适用于.NET Framework和.NET Core的HTML至PDF转换器 SelectPdf提供的在线html到pdf转换器使用.NET的Select.Pdf库中的html到pdf转换器. ...

  10. MyCms 开源自媒体系统,系统配置字段说明

    功能说明 站点名称:站点的简要描述名称,没有启用SEO插件时,将用此字段用作站点标题. 站点地址:站点的完整地址(包含 http/https),此字段有多处依赖用于生成链接,请正确填写. 站点logo ...