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

Memcache与Redis(三)

时间:2023-03-30 05:55:13 PHP

大家好,我是六一。今天是周五,再工作一天就是周末了。提前祝大家周末愉快。嘿嘿。本文是本周Memcache和Redis内存数据库的主题。周一周三更新的文章路径:PHP面试内容之Memcache和Redis(一)PHP面试内容之Memcache和Redis(二)本周(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.补充:Redis和Memcache有什么区别?11.补充:Redis是如何实现持久化的?12.Memcache和Redis共考面试题10和11),第三部分围绕第十二点展开。整理了一篇《PHP不同级别面试题有哪些?以下部分文字来自《PHP程序员面试笔试真题解析》书籍,转载请保留出处:12.Memcache和Redis常考的面试题【真题1】Memcache的工作原理是什么?答:Memcache的工作就是在专用的机器内存中维护一个庞大的哈希表,用来存放一些经常读写的文件和数据,从而大大提高网站的运行效率。Memcache程序运行在一台或多台服务器上。Memcache将所有数据存储在内存中。通过哈希表,每条数据都是由key/value组成的。它随时接受客户端的请求,然后返回结果。客户端与Memcache建立连接后,存储对象主要通过唯一键将值存储在内存中,在取数据时通过这个键从内存中获取对应的值。因为Memcache的数据是保存在内存中而不是缓存文件中,所以Memcache的访问速度更快,但是由于这些数据不是永久保存的,所以不建议将重要的数据保存在Memcache中,因为这些数据在重启服务器后就会丢失消失。【真题2】Memcache有什么优势?答:Memcache是??一个高性能的分布式内存对象缓存系统,主要在内存中维护一个庞大的哈希表,用于数据缓存。它主要是将数据存入内存,然后再从内存中读取数据,从而提高读取速度。它主要以key-value的形式存储各种数据,包括图片、视频、文件等。它有以下优点:(1)支持多台服务器使用Memcache。由于Memcache中存储数据的大小必须小于内存的大小,因此可以在多台服务器上使用Memcache来增加缓存容量;(2)支持均衡请求。当使用多台Memcache服务器时,可以均衡请求,避免所有请求进入一台Memcache服务器,避免因服务器故障导致数据丢失;(3)分布式的支持,可以解决缓存本身水平线性扩展的问题和大缓存并发下的自性能问题,避免缓存的单点故障;(4)支持局部容灾。如果多台服务器存储Memcache数据,其中一台Memcache挂掉,部分请求仍然可以在其他服务器的MemcacheHit中处理,争取时间修复挂掉的服务器。【真题3】如何合理使用Memcache?缓存数据量过大如何部署?(分布式,缓存时间,优化缓存数据)答:要想合理使用Memcache,需要注意以下几点:(1)因为Memcache支持最大存储对象大小为1M,合理使用Memcache时,它要求不要在Memcache中存储大于1MB的数据;(2)所有数据都存储在Memcache中,如果数据大小分布在各种chunk大小,从64B到1MB不等,会造成内存的极大浪费和Memcache异常。因此需要注意数据大小的分布范围;(3)密钥长度不能超过250个字符;(4)虚拟主机不允许运行Memcache服务,所以不能部署Memcache到虚拟主机;(5)由于Memcache可以很容易的被访问到,所以它可以在不安全的环境中运行。如果数据安全要求高,则需要考虑运行环境的安全;(6)因为Memcache中存放的数据是在内存中的,当服务器挂掉时,内存会被清空。所以缓存中的数据应该是丢失后影响不大的数据。如果缓存中的数据量过大,可以采取以下措施:(1)使用Memcache服务器集群的方式,首先将数据安排在不同的Memcache服务器上,可以在上面重新做Memcache服务器不同的硬件服务器。组成数据备份组,避免单点数据丢失问题;(2)缓存数据到数据库,首先在数据库中创建一个表来说明缓存数据在Memcache服务器集群中的存储逻辑,然后实现将缓存数据存储到数据库中,可以保证双向访问数据库和缓存中的数据。【真题4】Redis和Memcache有什么区别?答:Redis是一个完全开源免费的高性能key-value数据库,数据类型丰富,可以支持数据持久化,将内存中的数据保存在磁盘上,服务器重启时可以再次加载。Memcache是??一个高性能的分布式内存对象缓存系统,用于动态web应用中,帮助减轻数据库的负担,在内存中缓存数据和对象,减少每次访问数据时访问数据库的次数,从而提高访问速度。它们有以下区别:(1)Redis和Memcache最大的区别在于,虽然Memcache和Redis都是将数据存储在内存中,都是内存数据库,但是Redis存储的时候并不是所有的数据都一直存储在内存中,而Memcache存储的是所有的数据在记忆中;(2)数据安全问题,因为memecache是??将所有数据存储在内存中,服务器挂掉后,重启服务器时数据会丢失,而Redis可以定时将数据存入磁盘做持久化存储,可以加载使用需要的时候。对于容灾,Memcache挂掉后无法恢复数据,但是可以通过aof恢复Redis数据;(3)Redis支持多种数据结构存储,如list、set、hash等数据结构存储,而Memcache主要是在内存中维护一个统一的巨大哈希表来存储数据,只支持简单的key/value数据存储,但是Memcache可存储图片、视频、文件及数据库检索结果等;(4)数据备份问题,Redis支持数据备份,即主从模式的数据备份。Memcache不支持数据持久化,无法进行数据备份;(5)在内存占用方面,如果使用简单的key-value存储,Memcached的内存利用率更高,如果Redis使用hash结构进行key-Value存储,由于其联合压缩,内存利用率高于Memcached。具体与应用场景和数据特性相关;(6)与线程相比,Memcache支持多线程,而Redis只支持单线程,所以Memcache在CPU利用率上优于Redis;(7)自己的扩容需要做Cluster;实现方式:主从、Hash;(8)在数据读写方面,Redis和Memcache在写入性能上差别不大,而Memcache在读取性能,尤其是批量读取性能上要强一些。【真题5】Redis集群方案应该怎么做?有什么计划?答:1.twemproxy,大体的概念就是类似于一个代理方法,使用方法和普通的redis没什么区别。在其下设置多个redis实例后,使用时,在需要连接redis的地方连接twemproxy,它会作为代理接收请求并使用一致性哈希算法将请求传输到特定的redis,然后将结果返回给twemproxy。使用方便(相对redis只需要修改连接端口),老项目扩容的首选。问题:twemproxy自身单端口实例的压力,使用consistenthash后,redis节点数变化时,计算值变化时,数据无法自动移动到新节点。2.Codis,目前使用最多的集群方案,基本上和twemproxy效果一样,但是支持当节点数量变化时,可以将旧节点数据恢复到新的hash节点上。3、rediscluster3.0自带的集群,其特点是其分布式算法不是一致性哈希,而是哈希槽的概念,支持节点设置从节点。有关详细信息,请参阅官方文档。4.在业务代码层实现,启动几个不相关的redis实例,在代码层对key进行hash计算,然后去对应的redis实例操作数据。这种方式对哈希层代码要求比较高,考虑因素包括节点故障后的备选算法方案、数据震荡后脚本自动恢复、实例监控等。整理了一篇《PHP不同级别面试题有哪些?【真题6】Redis适用的场景有哪些?答:(1)、会话缓存(SessionCache)使用Redis最常用的场景就是会话缓存(sessioncache)。使用Redis缓存会话相对于其他存储(例如Memcached)的优势在于Redis提供了持久性。当维护一个不严格一致的缓存时,如果用户的所有购物车信息都丢失了,大多数人都会不高兴。现在,他们会吗?幸运的是,随着Redis多年来的改进,很容易找到有关如何正确使用Redis进行会话缓存的文档。甚至著名的商业平台Magento也为Redis提供了一个插件。(2)、FullPageCache(FPC)除了基本的sessiontoken,Redis还提供了一个非常简单的FPC平台。回到一致性问题,即使Redis实例重启,用户也不会因为磁盘持久化而看到页面加载速度下降。这是一个很大的改进,类似于PHP的本地FPC。再次以Magento为例,Magento提供了一个插件来使用Redis作为全页缓存后端。另外,对于WordPress用户,Pantheon有一个非常不错的插件wp-redis,可以帮助你以最快的速度加载你访问过的页面。(3)、QueueReids在内存存储引擎领域的优势之一是它提供了list和set操作,这使得Redis成为一个很好用的消息队列平台。Redis作为队列的操作类似于本地编程语言(如Python)对列表的push/pop操作。如果您在Google上快速搜索“Redis队列”,您会立即找到大量旨在使用Redis创建非常好的后端工具以满足各种队列需求的开源项目。比如Celery有后台使用Redis作为broker,可以从这里查看。(4)、排行榜/计数器Redis非常擅长在内存中递增或递减数字。Sets和SortedSets也让我们执行这些操作变得非常简单。Redis只是提供了这两种数据结构。所以,我们想要从排序的集合中得到前10名的用户——我们称之为“user_scores”,我们只需要这样做:当然,这假设你是根据你的用户的分数进行增量排序。如果你想返回用户和用户的分数,你需要这样执行:ZRANGEuser_scores010WHITSCORESAAgoraGames是一个很好的例子,用Ruby实现,它的排行榜使用Redis存储数据,你可以在这里看到.(5)、Publish/SubscribeLast(但肯定不是最不重要的)是Redis的发布/订阅特性。发布/订阅确实有很多用例。我见过人们在社交网络连接中使用它,作为基于发布/订阅的脚本的触发器,甚至使用Redis的发布/订阅功能来构建聊天系统!(不是,是真的,你可以去查一下)。【真题7】如何扩展Redis的持久化数据和缓存?答:如果使用Redis作为缓存,使用一致性哈希实现动态扩缩容。如果使用Redis作为持久化存储,则必须使用固定的key-to-nodes映射关系,并且节点数量一旦确定就不能更改。否则(即当Redis节点需要动态变化时),必须使用可以在运行时重新平衡数据的系统,目前只有Redis集群可以做到这一点。【真题8】Redis的回收过程是如何进行的?答案:客户端运行新命令,添加新数据。Redi检查内存使用情况,如果大于maxmemory的限制,就会按照设定的策略进行回收。执行新命令等。所以我们不断地越过内存限制的边界,不断地到达边界,然后不断地回收到边界以下。如果一个命令的结果导致大量内存被使用(比如将非常大的集合的交集保存到一个新的键),用不了多久就会被这个内存使用量超过内存限制。【真题9】减少Redis内存占用的方法有哪些?答:如果你使用的是32位的Redis实例,可以利用好Hash、list、sortedset、set等集合类型的数据,因为通常很多小的Key-Values可以一起存储在一种更紧凑的方式。【真题10】你知道Redis的分区实现方案有哪些吗?答:客户端分区是指客户端已经决定了数据存储在哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。代理分区是指客户端向代理发送请求,由代理决定向哪个节点写入或读取数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis响应返回给客户端。redis和memcached的一个代理实现是Twemproxy查询路由(Queryrouting),意思是客户端随机请求任意一个redis实例,然后Redis将请求转发给正确的Redis节点。RedisCluster实现了一种混合形式的查询路由,但不是直接将请求从一个redis节点转发到另一个,而是借助客户端直接重定向到正确的redis节点。根据不同级别的PHP面试,会问到哪些PHP常见考试的知识点,整理成一篇文章。曾经整理过一篇文章《PHP不同级别的面试题有哪些?》编程库”,回复:“水平”,我发给你。更多相关面试题,可以阅读《PHP程序员面试笔试真题解析》。预测:下周(2019.2.25至2019.3.1)135更新主题:PHP面试会话控制,网络协议,以及相关面试题,以上内容节选自本书《PHP程序员面试笔试真题解析》,已在天猫、京东、当当等电商平台销售,更多PHP相关面试知识和考题,请关注公众号获取:六一编程库,对本文有什么问题或者建议可以留言,我会不断完善,追求极致,感谢大家的支持。