2020-06-05 11:25:12     分类: Php
摘要: 架构

一、在PHP中memcache和memcached有什么区别 1.目前大多数PHP生产环境都是不带d的memcache版本,这是一个老的原生版本,完全是在php框架内开发的。memcached是建立在libmemcached基础上的,相对来说,memcached功能更全一些。 2.memcache是原生实现,支持OO和非OO两套接口并存。而libmemcached是使用libmemcached,只支持OO接口 3.memcached的flag可以在非操作时使用setOption设置,memcached实现了更多的memecached协议。 4.memcached支持Binary Protocol,所以memcached有更高的性能,不过目前memcached还不支持长连接。

二、Memcached支持哪几种传输协议 两种官方,1种第三方 1.text protocol 文本传输协议 文本传输协议的时候,序列化会产生大量的冗余内容。例如255,会使用3个字节。但是调试方便,在服务器端可以清晰的看到文本内容。

2.binary protocol 二进制传输协议 二进制传输协议的时候,学历恶化产生的内容较少。内容紧凑,比如255,则使用1个字节。但是调试的时候,在服务器上命令行查看内容,不容易调试。

3.kestrel protocol 第三方服务器 先入先出队列,适用于异步消息传输。基本参照memcached协议,可恢复,确保服务重启后可以保存重启前的消息队列,不会丢消息,依靠memcached, 可以做kestrel集群, 分布式扩展kestrel服务。

三、Memcached只能存储字符串和数字类型,这个说法对吗? 错,memcached的值是二进制安全的,所以可以存储很多类型,包含二进制、对象等。

四、请说一说Memcached过期策略 1.如果对键值对设置过期时间,最大只能是30天,如果超过,存储会成功,但是取不到值。 2.如果失效值为0,则此键值对永不过期,但是不能确保服务端为了其它新元素分配空间而删除。 3.Memcached缓存失效策略是LRU(最近最少使用)+到期失效策略,最先替换已失效的的数据,其次是最近使用很少的数据。

五、Memcached每组键值对最大能存储多少数据。 Key默认是不超过250k, Value默认不超过1M,但是key+value默认不超过1m, 这是由page决定的,page默认就是1m,但是可以在启动时使用-I参数来修改page的大小。

六、下面哪个是最终存储Memcached item的结构 A.value B.page C.slab D.chunk 答案是D, chunk是一系列固定内存空间,存储键值对数据,slab用于管理chunk,相同大小范围的chunk放在同一个slab中,page是memcached内存分配的主单位。

七、如何避免Memcached缓存雪崩 当Memcached缓存服务器重启或数据未加载到缓冲中或者大量缓存在同一时间段内大面积失效,这样就会导致所有请求都直接从数据库中查找数据。从而导致服务器的CPU和内存负载过高,大并发有可能会导致数据库服务器崩溃,这就是缓存雪崩。 避免方法: 1.分析用户行为,尽量让失效时间点均匀分布。尽量避免缓存雪崩的出现。 2.使用多台缓存服务器,做主从备份,一台崩溃,就自动移到另一台。 3.增大数据库服务器负载能力 4.采用一致性哈希算法。

八、如何避免Memcached缓存穿透 一般的缓存系统,都是按key去查询缓存,如果不存在对应的Value,就去后端系统查找。如果key对应value一定不存在的,并且对该key的并发请求很大,就会对后端系统的负载压力很大,这就是缓存穿透。 避免方法: 1.对查询结果为空的情况也进行缓存,缓存设置时间短一点。或者该key对应的数据insert之后清理缓存。 2.对一定不存在的key进行过滤,可以把所有可能存在的key放到一个大的bigmap中,查询时通过该bitmap过滤。

九、PHP Memcached支持几种分布式算法,请分别说明 支持两种分布式算法,余数分布式算法和一致Hash算法,默认为余数分布算法; 1.余数分布算法 默认就是余数分布算法,设置 php.ini : memcache.hash_strategy = modula 运行时: $memcached->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_MODULA); 余数分布算法是根据服务器台数的余数进行分散。求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器。 优缺点:余数计算的方法简单,数据的分散性也相当优秀。缺点是当添加或移除服务时,缓存重组的代价相当大巨大。添加服务器后,余数就会产生巨变,这样就无法获取与保存时相同的服务器,从而影响缓存的命中率。

2.一致性Hash分布算法 设置: php.ini : memcache.hash_strategy = consitent 运行时: $memcached->setOption(Mmemcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSTITENT); 一致性哈希算法首先求出memcached服务器的哈希值,并将其配置到0-232的圆上。然后用同样的方法求出键的hash值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一台服务器上。如果超过232仍然找不到,就保存到第一天服务器上。 优缺点:一致哈希算法最大限度的抑制了键的重新分布。而且有的一致哈希算法还采用了虚拟节点的思想,更大程度的抑制了键的部分不均匀。

十、如何计算Memcached的命中率 先用stats命令查出数据 缓存命中率 = (总命中次数/总请求次数)*100%

十一、如何提高memcached的缓存命中率 1.提高服务获取的内存总量 2.提高空间利用率 3.应用一级别上再来一LRU 4.对于整理命中率,可以采取有效的冗余策略,减少分布式服务时某个服务器发生抖动的情况。 5.预估value代表并适当的调整内存页大小和增长因子

十二、Memcached是如何工作的 Memcahed的神奇来自两段hash。Memcached就像一个巨大的,存储了很多<key,value>键值对的哈希表,通过key可以存储或查询任何数据。 Memcached可以存储在多台服务器上,通过计算key的整数哈希值以及服务器的哈希值,就能将数据分布式的存储在每台服务器上。

十三、Memcached能接受的key最大长度是多少 key的最大长度是250个字符。需要注意的是,250是memcached服务器端内部的限制,如果您使用的客户端支持”key的前缀”或类似特性,那么key(前缀+原始key)的最大长度是可以超过250个字符的。我们推荐使用使用较短的key,因为可以节省内存和带宽。

十四、Memcached对item过期时间有什么限制。 过期时间最大可以达到30天。memcached把传入的过期时间(时间段)解释成时间点后,一旦到了这个时间点,memcached就把item置为失效状态。这是一个简单但obscure的机制。

十五、Memcached最大能存储多大的单个item 1MB。如果你的数据大于1MB,可以考虑在客户端压缩或拆分到多个key中。

十六、Memcached是原子的吗 Memcached当然是原子的,

十七、Memcached最大的优势是什么 memcached有.极佳的水平扩展性 a.由于是在客户端做了一次哈希计算,所以就很容易的增加大量数据到缓存集群中,而不会增加服务器的负载 b.由于memcached之间不会相互通信,没有多播协议,所以不会有网络通信量爆炸; c.只要钱够,就可以随意的扩展集群,增加硬件

十八、Memcached和Mysql 的 query缓存相比,有什么优缺点 1.query缓存是集中式的,一次引入多次受益。memcached需要一定工作量。 2.当修改表时,query缓存立刻刷新。memcached有一定时间差。此外写操作频繁时,query缓存压力较大。 3.query缓存只能缓存查询语句和结果集,memcached缓存可以存储任意数据。 4.query缓存收到mysql服务器空余内存限制,而memcached只要有足够内存,就可以任意增加规模;

十九、Memcached缓存如何实现冗余机制 不实现。Memcached是应用的缓存层,它的设计本身就不带任何冗余机制。一旦某个节点失去所有数据,就要重新从数据源再次获得所有数据,可以采用多节点、一次性哈希算法、热备节点等方法来避免。

二十、Memcached是如何处理容错的 Memcached不处理任何容错,在节点失效的情况下,集群没有必要做任何容错处理。如果发生节点失效,应对取决于用户,处理方法有: 1.忽略失效节点,在失效节点失效或替换前,还有很多其它节点可以应对节点失效带来的影响。 2.把失效的节点从节点列表中移除。但做这个操作要十分小心,在默认情况下,客户端添加或移除节点,会导致所有缓存数据不可用。因为哈希惨遭的节点变化了,大部分key因为hash值的改变而被从新映射到与原来不同的节点上。 3.启动热备节点,接管失效节点所占用的IP。这样可以防止哈希紊乱。 4.如果希望添加和移除节点,而不影响原先的哈希结果。可以使用一致性哈希算法。 5.使用两次哈希算法。

二十一、如何将Memcached的item批量导入导出 您不应该这样做!Memcached是一个非阻塞的服务器。任何可能导致memcached暂停或瞬时拒绝服务的操作都应该值得深思熟虑。向 memcached中批量导入数据往往不是您真正想要的!想象看,如果缓存数据在导出导入之间发生了变化,您就需要处理脏数据了;如果缓存数据在导出导入之间过期了,您又怎么处理这些数据呢?

因此,批量导出导入数据并不像您想象中的那么有用。不过在一个场景倒是很有用。如果您有大量的从不变化的数据,并且希望缓存很快热(warm)起来,批量导入缓存数据是很有帮助的。虽然这个场景并不典型,但却经常发生,因此我们会考虑在将来实现批量导出导入的功能。

Steven Grimm,一如既往地,,在邮件列表中给出了另一个很好的例子:http://lists.danga.com/pipermail/memcached/2007-July/004802.html 。 但是我确实需要把memcached中的item批量导出导入,怎么办??

好吧好吧。如果您需要批量导出导入,最可能的原因一般是重新生成缓存数据需要消耗很长的时间,或者数据库坏了让您饱受痛苦。

如果一个memcached节点down了让您很痛苦,那么您还会陷入其他很多麻烦。您的系统太脆弱了。您需要做一些优化工作。比如处理”惊群”问题(比如 memcached节点都失效了,反复的查询让您的数据库不堪重负…这个问题在FAQ的其他提到过),或者优化不好的查询。记住,Memcached 并不是您逃避优化查询的借口。

如果您的麻烦仅仅是重新生成缓存数据需要消耗很长时间(15秒到超过5分钟),您可以考虑重新使用数据库。这里给出一些提示:

  • 使用MogileFS(或者CouchDB等类似的软件)在存储item。把item计算出来并dump到磁盘上。MogileFS可以很方便地覆写 item,并提供快速地访问。您甚至可以把MogileFS中的item缓存在memcached中,这样可以加快读取速度。 MogileFS+Memcached的组合可以加快缓存不命中时的响应速度,提高网站的可用性。
  • 重新使用MySQL。MySQL的InnoDB主键查询的速度非常快。如果大部分缓存数据都可以放到VARCHAR字段中,那么主键查询的性能将更好。从 memcached中按key查询几乎等价于MySQL的主键查询:将key 哈希到64-bit的整数,然后将数据存储到MySQL中。您可以把原始(不做哈希)的key存储都普通的字段中,然后建立二级索引来加快查询…key被动地失效,批量删除失效的key,等等。

上面的方法都可以引入memcached,在重启memcached的时候仍然提供很好的性能。由于您不需要当心”hot”的item被 memcached LRU算法突然淘汰,用户再也不用花几分钟来等待重新生成缓存数据(当缓存数据突然从内存中消失时),因此上面的方法可以全面提高性能。

二十二、Memcached是如何实现身份验证的 没有身份认证机制。memcached是应用下层的软件,身份认证应该是应用上层的职责。 memcached的客户端和服务器端之所以是轻量级的,部分原因就是完全没有实现身份验证机制。这样,memcached可以很快地创建新连接,服务器端也无需任何配置。 如果您希望限制访问,您可以使用防火墙,或者让memcached监听unix domain socket。

二十三、Memcached是多线程的吗?如何使用它们? memcached 1.2及更高版本拥有了多线程模式。多线程模式允许memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据。memcached使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个memcached实例,这种方式能够更有效地处理multi gets。 如果您的系统负载并不重,也许您不需要启用多线程工作模式。如果您在运行一个拥有大规模硬件的、庞大的网站,您将会看到多线程的好处。 memcached 1.2及更高版本拥有了多线程模式。多线程模式允许memcached能够充分利用多个CPU,并在CPU之间共享所有的缓存数据。memcached使用一种简单的锁机制来保证数据更新操作的互斥。相比在同一个物理机器上运行多个memcached实例,这种方式能够更有效地处理multi gets。 如果您的系统负载并不重,也许您不需要启用多线程工作模式。如果您在运行一个拥有大规模硬件的、庞大的网站,您将会看到多线程的好处。

二十四、使用Redis有哪些好处 1.速度快,因为数据存在内存中,类似于Hashmap,hashmap的优势就是查找和操作复杂度嗾使0; 2.支持丰富的数据类型,支持string, list, set, stored set, hash 3.支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。

二十五、redis相比memcached有哪些优势 1.memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 2.redis的速度比memcached快很多 3.redis支持持久化其数据

二十六、Memcache与Redis的区别都有哪些 1.存储方式 memecache把数据全部存在内存中,断电后会挂掉,数据不能超过内存的大小 redis有部分数据存在硬盘上,这样能保证数据的持久性。

2.数据支持类型 memcache对数据类型支持相对简单,redis有复杂的数据类型。

3.使用底层模型不同 他们之间底层实现方式以及客户端之间通信的应用协议不一样。 redis直接自己构建了VM机制,因为一般的系统调用系统函数的化,会浪费一定的时间去移动和请求。

二十七、请说出memcache、redis、mysql、ftp、ssh的默认端口号 分别是11211, 6379, 3306, 21 ,22

二十八、Redis有哪些常见性能问题,并说明解决方案 1.Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 2.如果数据比较重要,某个Slave开启AOF数据备份,策略设置为每秒同步一次 3.为了主从复制速度和连接的稳定性,Master和Slave最好在同一局域网中 4.尽量避免在压力很大的主库上增加从库 5.主从复制不要用图状结构,用单向链表更为稳定些。

二十九、Redis都使用哪些过期策略 volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰 allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据

三十、Redis适合哪些场景 1、会话缓存(Session Cache) 最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗? 幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。 2、全页缓存(FPC) 除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。 再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。 此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。 3、队列 Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。 如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。 4,排行榜/计数器 Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可: 当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行: ZRANGE user_scores 0 10 WITHSCORES Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。 5、发布/订阅 最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。 Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。

三十一、Redis、MongoDB和MySQL读写数据的区别 1.Redis Redis是存放在服务器内存,当内存用满了后需要扩容,就只能用Redis分布式方案。为了防止断电或者Redis程序重启造成内存数据的丢失,可调整Redis配置文件,按照一定的策略把数据持久化到硬盘。

2.MongoDB MongoDB同时使用了硬盘和内存,其使用了操作系统提供的MMP(内存文件映射)机制进行数据文件的读写,MMAP可以把文件映射到进程的内存空间中,这样文件就会在内存中有对应的地址。这时对文件的读写是通过操作内存进行的,而不需要传统如fread 、fwrite文件操作方式。

3.Mysql Mysql的数据虽然是存储在硬盘中,虽然Mysql也有缓存,但Mysql缓存的四查询的结果,而不是缓存数据。

三十二、Redis、MonngoDB、Mysql查找数据的区别 Redis的数据是基于'键值对'存储,键相当于门牌号,值相当于房间。Redis查找数据都是直奔目标,速度当然快。

MongoDB和Mysql中查找数据,每组数据都有一个id(或者可以为每组数据建立索引),这个id或索引号就相当于门牌号。

三十三、Redis、MongoDB、Mysql适用的场景。 1.Redis 由于读写速度快,但存储在内存中,需要的成本高,所以适合存储读写频率较高的数据。例如身份验证信息。

2.MongoDB a.网站数据:MongoDB非常适合实时插入、更新与查询,并具备网站实时数据存储所需的复制及高速伸缩性。 b.大尺寸、低价值数据: 使用传统关系数据库存储一些数据时可能会比较贵。 c高伸缩性场景:MongoDB非常适合由数十或者数摆台服务器组成的数据库 d.存储地理坐标的数据:MongoDB的地理坐标查询功能非常强大。

不适用场景: a.高度事务性系统:例如银行或会计系统,传统的关系型数据库目前还是更适用于大量原子性事务的应用程序。由于MongoDB不支持事务,所有没法保证原子性。 b.传统智能应用:针对特定问题的BI数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能会是更合适的选择。 c.需要SQL的问题

3.Mysql 1.事务性系统 2.需要复杂SQL的问题

三十四、Redis有哪些数据类型,彼此之间有什么区别 string string类型是基本的key_value结构,key可以看做某个数据在redis中的唯一标识。由于redis是二进制安全的,任何格式的二进制数据都可以存储。经常用于存储访问频率高、不经常使用的缓存数据。

hash redis中最接近数据库模型。适用于存储高频访问的整体数据。

list 模拟队列操作,lis是按照查找插入顺序排序的字符串链表。可以在头部和尾部插入元素,适用于消息队列。

set 无需且不重复的元素集合,set集合中不存在重复的元素,此外set类型还提供多个set之间的聚合计算,如交、差、并,适合例如SNS好友场景。

stored set 有序且不重复的元素集合。与set类型类似,区别是stored-set提供了一个分数与每一成员对应,redis根据score对成员进行排序,适合存储不能重复且需要排序的数据。

三十五、Redis中如何查看统计信息 redis-cli中使用命令info

三十六、Redis信息中used_memory_human、used_memory_rss、used_memory_peak_human分别是什么意思 used_memory_human : 以可读格式返回Redis分配的内存总量。 used_memory_rss 从皂搓系统角度,返回redis已分配的内存总量。 used_memory_peak_human : 以可读格式返回Redis的内存消耗峰值

三十七、如何对Redis进行内存优化 1.使用info命令监控内存使用的状况 2.优化内存结构,调整使用hashmap的阀值,小于就用ziplist,超过就用hashmap 3.限制使用的最大内存 4.设置过期时间


文章标签: