当前位置: 首页 > 后端技术 > PHP

Memcache与Redis(一)

时间:2023-03-30 03:27:46 PHP

大家好,我是刘义。继上周(2019.2-11至2-15)发布的题目《PHP面向对象面试目录》之后,发布第二题,感谢阅读。本周(2019.2-18至2-22)文章内容如下,更新时间为每周一、三、五。可以关注本专栏,持续关注。感谢您的支持。1.什么是内存缓存?2、Memcache有什么特点?3、Memcache的内存管理机制是什么?4、Memcache和Memcached有什么区别?5、如何操作Memcache?6、如何使用Memcache进行Session共享?7.什么是Redis?8.如何使用Redis?9、使用Redis需要注意哪些问题?10.Memcache和Redis共考面试题十点。以下部分文字来自《PHP程序员面试笔试宝典》书籍,转载请保留出处:1.什么是Memcache?Memcache是一个开源的、免费的、高性能的分布式对象缓存系统,它基于存储键/值对的hashmap将数据存储在内存中。它的作用是减少对数据库的读取,提高web应用的性能。虽然它的守护进程是用C语言实现的,但客户端可以用任何语言编写,通过Memcache协议与守护进程通信。需要注意的是,当服务器停止运行或崩溃时,服务器上存储的所有键/值对都将丢失。Memcache的服务器端不提供分布式功能,各个Memcache应用程序之间不通信共享信息。要实现分布式通信,可以构建多个Memcache应用,通过算法实现这种效果。下面介绍Memcache的两个重要概念。slab:为了防止内存碎片,Memcache服务器会将数据空间预先划分为一系列的slab;比如现在有一个100立方米的房间,为了合理规划房间放东西,这个房间里会放30个1立方米的箱子,20个1.25立方米的箱子,15个1.5立方米的箱子……这些箱子就是板材。LRU:最近最少使用算法;当同一个slab的grid满了,此时需要增加一个新的值,新的数据不会被认为放在比当前slat大的idleslab中,而是使用LRU移除旧的数据,把这个新数据。2、Memcache有什么特点?Memcache的特点如下:1)协议简单。2)基于libevent的事件处理。3)内置记忆存储方式。4)Memcached是分布式的,彼此之间不通信。Memcache的特点如下:(1)单项最大数据为1MB。(2)单个进程最大使用内存为2GB,需要更多内存时可以开启多个端口。(3)Memcached是多线程、非阻塞io多路复用网络模型,Redis是单线程。(4)最大密钥长度为250字节。3、Memcache的内存管理机制是什么?Memcache将内存分成大小不一的块(chunks),将相同大小的块分成组(chunks的集合)。page是分配给slab的内存空间,默认1MB,根据slab的大小分成chunk,chunk是用户缓存记录的内存空间,slabclass是具体chunk的组。在存储数据时,Memcache会压缩数据的大小进行存储。一般压缩后的数据约为原始数据大小的30%,从而节省70%的传输性能消耗。如果存储的数据是小于100字节的键值对,压缩后可能会造成膨胀,但是Memcache是??以固定大小的块存储的,最小尺寸为88B,所以小数据造成的压缩膨胀不会有什么影响影响。具体过程如下图所示。我整理了一篇《如何解决Memcache的缓存雪崩现象?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使用了二级哈希,通过一个大的哈希表来维护。Memcached由两个核心组件组成:服务器(Server)和客户端(Client)。在memcached查询中,客户端首先通过计算key的hash值来确定kv对所在服务器的位置。当Server确定后,client会向对应的Server发送查询请求,让它找到准确的数据。因为它们之间没有交互和多播协议,memcached交互给网络带来。5、如何操作Memcache?Memcached的操作命令可以分为三类:存储命令、搜索命令和统计命令。第一种,Memcached存储命令:第二种,Memcached搜索命令:第三种,Memcached统计命令:使用示例代码参考:addServer("127.0.0.1",11211);//连接Memcache服务器$m->set("mkey","123",600);//设置一个名为mkey的key,值为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=memcachesession.save_path="tcp://127.0.0.1:11211"也可以使用网站目录下的.htaccess文件:php_valuesession.save_handler"memcache"php_valuesession.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://:11211?persistent=1&weight=1&timeout=1&retry_interval=15,udp://:11211";如果你想使用udp支持,你需要确保你的memcached服务器是开启的,还要确保web服务器正常连接到memcache服务器端口。重启Apache后,它会开始使用memcache来存储PHP会话。测试用例:";echosession_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(二)将于本周三(2019.2-20)更新。以上内容节选自本书《PHP程序员面试笔试宝典》,已在天猫、京东、当当网等电商平台销售。更多PHP相关面试知识和试题,请关注公众号获取:六一编程库,对本文有任何问题或建议可以留言。我会不断改进,追求极致,谢谢大家的支持。