共计 4055 个字符,预计需要花费 11 分钟才能阅读完成。
你好,是我琉忆。继上周(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 相关的面试知识、考题可以关注公众号获取:琉忆编程库
对本文有什么问题或建议都可以进行留言,我将不断完善追求极致,感谢你们的支持。